HOG特征詳解與行人檢測
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
本文轉(zhuǎn)自:opencv學(xué)堂
HOG(Histogram of Oriented Gradient)特征在對(duì)象檢測與模式匹配中是一種常見的特征提取算法,是基于本地像素塊進(jìn)行特征直方圖提取的一種算法,對(duì)象局部的變形與光照影響有很好的穩(wěn)定性,最初是用HOG特征來來識(shí)別人像,通過HOG特征提取+SVM訓(xùn)練,可以得到很好的效果,OpenCV已經(jīng)有了。HOG特征提取的大致流程如下:


第一步:灰度化
對(duì)HOG特征提取來說第一步是對(duì)輸入的彩色圖像轉(zhuǎn)換為灰度圖像,圖像灰度化的方法有很多,不同灰度化方法之間有一些微小的差異,從彩色到灰度的圖像轉(zhuǎn)換可以表示如下:

第二步:計(jì)算圖像梯度
計(jì)算圖像的X方向梯度dx與Y方向梯度dy,根據(jù)梯度計(jì)算mag與角度,計(jì)算梯度時(shí)候可以先高斯模糊一下(可選步驟),然后使用sobel或者其它一階導(dǎo)數(shù)算子計(jì)算梯度值dx、dy、mag、angle:

第三步:Cell分割與Block
對(duì)于圖像來說,分成8x8像素塊,每個(gè)塊稱為一個(gè)Cell,每個(gè)2x2大小的Cell稱為一個(gè)Block,每個(gè)Cell根據(jù)角度與權(quán)重建立直方圖,每20度為一個(gè)BIN,每個(gè)Cell得到9個(gè)值、每個(gè)Block得到36個(gè)值(4x9), 圖像如下:

每個(gè)Block為單位進(jìn)行L2數(shù)據(jù)歸一化,作用是抵消光照/遷移影響,L2的歸一化的公式如下:

第四步:生成描述子
對(duì)于窗口64x128范圍大小的像素塊,可以得到8x16個(gè)Cell, 使用Block在窗口移動(dòng),得到輸出的向量總數(shù)為7x15x36=3780特征向量,每次Block移動(dòng)步長是八個(gè)像素單位,一個(gè)Cell大小。

HOG特征本身是不支持旋轉(zhuǎn)不變性與多尺度檢測的,但是通過構(gòu)建高斯金字塔實(shí)現(xiàn)多尺度的開窗檢測就會(huì)得到不同分辨率的多尺度檢測支持。OpenCV中HOG多尺度對(duì)象檢測API如下:
virtual void cv::HOGDescriptor::detectMultiScale(
InputArray img,
std::vector< Rect > & foundLocations,
double hitThreshold = 0,
Size winStride = Size(),
Size padding = Size(),
double scale = 1.05,
double finalThreshold = 2.0,
bool useMeanshiftGrouping = false
)
Img-表示輸入圖像
foundLocations-表示發(fā)現(xiàn)對(duì)象矩形框
hitThreshold-表示SVM距離度量,默認(rèn)0表示,表示特征與SVM分類超平面之間
winStride-表示窗口步長
padding-表示填充
scale-表示尺度空間
finalThreshold-最終閾值,默認(rèn)為2.0
useMeanshiftGrouping-不建議使用,速度太慢拉
使用OpenCV預(yù)訓(xùn)練SVM行人HOG特征分類器實(shí)現(xiàn)多尺度行人檢測的代碼如下:
import cv2 as cv
if __name__ == '__main__':
src = cv.imread("D:/images/pedestrian.png")
cv.imshow("input", src)
hog = cv.HOGDescriptor()
hog.setSVMDetector(cv.HOGDescriptor_getDefaultPeopleDetector())
# Detect people in the image
(rects, weights) = hog.detectMultiScale(src,
winStride=(4, 4),
padding=(8, 8),
scale=1.25,
useMeanshiftGrouping=False)
for (x, y, w, h) in rects:
cv.rectangle(src, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv.imshow("hog-detector", src)
cv.waitKey(0)
cv.destroyAllWindows()
原圖顯示如下:

運(yùn)行顯示如下:

交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請(qǐng)按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~

