opencv筆記--HOGDescriptor


    特征描述提取圖像區域上有用信息而忽略無用信息,不同目標下有用信息與無用信息定義不同。這里提取的有用信息用於分類器輸入並期望產生正確的分類。

    HOG(Histogram of Oriented Gradient) 對圖像塊生成描述信息 vector,然后將每個圖像塊指定一個分類(-1, 1),通過大量訓練得到一個線性分類器(SVM);針對新圖像塊首先生成描述 vector,在使用訓練分類器對新的描述 vector 分類,實現圖像分類。

    HOG 首先應用在行人檢測,opencv 中 HOGDescriptor 類已經給出了一個默認的分類器(HOGDescriptor::getDefaultPeopleDetector()),通過該分類器可實現圖像中行人檢測。

    當需要對其他物體進行檢測時,則需要自定義一個描述信息 vector, 訓練分類器,最終實現特定圖像分類。

    這里首先學習默認描述信息 vector 的生成及分類:

    1)行人檢測默認圖像塊為 64 * 128,當需要檢測其他尺寸下是否存在行人時,需要將其縮放到默認尺寸,如尺寸 100 * 200, 128 * 256... ,但檢測長寬比總為 1:2 的區域;

    2)計算圖像梯度與梯度方向,形成梯度圖與梯度方向圖;

    3)在  8 * 8 鄰域內計算梯度方向直方圖,計算方法如下圖:

           

         首先將梯度方向取值范圍修改為 [0° ,180°),然后划分為 9 個 bins,使用加權方式填充梯度方向直方圖;

    4)將 16 * 16 鄰域內的4個梯度直方圖連接成 1 * 36 vector,並將其歸一化處理;

          以 8 * 8 的步長在 64 * 128 圖像塊上掃描圖像,每次掃描形成一個 1 * 36 vector 並歸一化,最終得到 7 * 15 * 36 = 3780 個元素的特征向量;

    5)以 1 * 3780 vector 作為圖像特征訓練 SVM 分類器, SVM 分類器基本原理如下

             

        尋找一個超平面 ,對於任意特征向量 X 可正確分類,W 可通過訓練得到;

        當訓練完成后,針對新的特征向量,滿足  為正類,滿足  為負類;

        在實際檢測中,為了提升正類的可信度,可能使用  進行分類, 。

    opencv 提供 HOGDescriptor 類已經訓練好行人分類器(HOGDescriptor::getDefaultPeopleDetector()),下面對 HOGDescriptor  給出一些解釋:

    1) HOGDescriptor() : winSize(64,128), blockSize(16,16), blockStride(8,8),

        cellSize(8,8), nbins(9), derivAperture(1), winSigma(-1),

        histogramNormType(HOGDescriptor::L2Hys), L2HysThreshold(0.2), gammaCorrection(true),

        nlevels(HOGDescriptor::DEFAULT_NLEVELS)

        以上代碼構造 HOGDescriptor 對象,主要參數意義如下:

        winSize:行人區域尺寸,在該尺寸上生成特征向量;對於大於該尺寸的行人,使用縮小到 winSize 尺寸以實現多尺度;應該注意的是,當行人尺寸較小時,無法通過放大到 winSize 尺寸實現檢測;

        cellSize:在 cellSize 區域上構造梯度方向直方圖;

        nbins:一個 cellSize 區域上形成梯度直方圖的 bins;

        blockSize: 梯度方向直方圖歸一化尺寸,對 2 * 2 cells 進行歸一化;

        blockStride:特征向量掃描步長,每次掃描增加 36 個特征點;
     2)hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()) 設置默認行人分類器參數;
     3)detectMultiScale()檢測行人,主要參數如下:
          vector<Rect>& foundLocations:輸出檢測行人矩形區域;
          vector<double>& foundWeights:輸出檢測行人置信度;
          double hitThreshold:線性分類器   中   取值,提升正類可信度;
          double scale:計算其他檢測尺度,當 scale 越趨近 1,形成更多檢測尺度,檢測越細致;
          double finalThreshold:丟棄置信度小於 finalThreshold 區域;
    opencv 提供 samples peopledetect 給出了行人檢測的使用示例,我修改了參數 hitThreshold = .3 以提升正類可信度,檢測結果如下:
        
 

 

參考資料 https://www.learnopencv.com/histogram-of-oriented-gradients/

               https://docs.opencv.org/2.4.10/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html#introductiontosvms


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM