最近聽了關於HOG與SVM的報告,比較深刻的學習了算法原理與實現方式。這里根據一些資料作下總結,方便日后拾起:
A.方向梯度直方圖(HOG,Histogram of Gradient)
將圖像依次划分為檢測窗口(window)、塊(block)、胞元(cell)3個層次
大體流程:
- 逐像素計算方向梯度;
- 對cell中的像素根據梯度划分區間,給出統計直方圖;
- 對於每個block中重疊的cell進行對比度歸一化;
- 把所有直方圖向量組成HOG特征向量。
HOG特征向量:
OpenCV對於HOG描述子(即特征向量)維度的計算:
size_t HOGDescriptor::getDescriptorSize() const { CV_Assert(blockSize.width % cellSize.width == 0 && blockSize.height % cellSize.height == 0); CV_Assert((winSize.width - blockSize.width) % blockStride.width == 0 && (winSize.height - blockSize.height) % blockStride.height == 0 ); return (size_t)nbins* (blockSize.width/cellSize.width)* (blockSize.height/cellSize.height)* ((winSize.width - blockSize.width)/blockStride.width + 1)* ((winSize.height - blockSize.height)/blockStride.height + 1); }如以下HOG檢測器:檢測窗口(64,128),塊尺寸(16,16),塊步長(8,8),cell尺寸(8,8),直方圖bin個數9
HOGDescriptor hog(Size(64,128),Size(16,16),Size(8,8),Size(8,8),9);//HOG檢測器,用來計算HOG描述子的其特征向量維度即:
B.支持向量機SVM(Support Vector Machine)
它是一個有監督的學習模型,通常用來進行模式識別、分類、以及回歸分析。
大體可以理解為:利用正負樣本(特征)學習,確定分割兩種訓練樣本的最佳超平面,從而用於新對象的分類、識別。這里便是提取正負樣本的HOG特征進行訓練,然后同樣根據待分類對象的HOG特征進行歸類或識別。
C.具體資料
支持向量機(SVM)介紹與實現: http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html
方向梯度直方圖(HOG)學習筆記: http://blog.sina.com.cn/s/blog_60e6e3d50101bkpn.html
訓練SVM分類器進行HOG行人檢測(實例): http://blog.csdn.net/pb09013037/article/details/41256945
OpenCV HOGDescriptor 參數圖解: http://blog.csdn.net/raodotcong/article/details/6239431