HOG全称histogram of oriented gradients.如果翻译成中文就是方向梯度直方图。它可以用来表示图像的物体特征,因此能够检测出这类物体。。
提取过程
1. Gamma矫正
✔️ 为了提高检测器对关照等干扰因素的鲁棒性,需要对图像进行Gamma矫正,完成对整个图像的归一化,调整对比度,降低噪声影响;
G(x,y)=F(x,y)1/r 一般 r=1/2
2. 灰度化
3. 计算图像XY梯度和方向
使用sobel可以出水平和垂直方向的梯度:
12 | gx = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=1)gy = cv2.Sobel(img, cv2.CV_32F, 0, 1, ksize=1) |
---|
利用公式求取梯度幅值和方向:
g=gx2+gy2θ=arctangygx
12 | # Opencv中使用:mag, angle = cv2.cartToPolar(gx, gy, angleInDegrees=True) |
---|
4. 8x8网格方向梯度权重直方图统计
✔️ 流程:首先将图像划分成若干个块(Block),每个块又由若干个细胞单元(cell)组成,细胞单元由更小的单位像素(Pixel)组成,然后在每个细胞单元中对内部的所有像素的梯度方向进行统计。
HOG
直方图统计
5. 块描述子和特征向量归一化
✔️ 每个block可以得到4个9维的向量,需要再次进行一次归一化,这样可以进一步提高泛化能力,同传使用L2-nrom进行归一化(还有L1-norm, L1-sqrt,etc.)
v=v‖v‖22+ε2
整体流程图
HOG提取流程
hog = cv2.HOGDescriptor()
:创建HOG特征描述;hog.setSVMDetector(cv.HOGDescriptor_getDefaultPeopleDetector())
:创建HOG+SVM行人检测器;123456 | rects, weights = hog.detectMultiScale(img, foundLocations, hitThreshold = 0, winStride, padding, scale = 1.05, finalThreshold = 2.0, useMeanshiftGrouping = false) |
---|
输入
PS:其中窗口步长与Scale对结果影响最大,特别是Scale,小的尺度变化有利于检出低分辨率对象,同时也会导致FP发生,高的可以避免FP但是会产生FN(对象漏检)。
行人检测代码示例
1234567891011121314151617181920 | import cv2 as cvsrc = cv.imread("people.png")cv.imshow("input", src)# hog特征描述hog = cv.HOGDescriptor()# 创建SVM检测器hog.setSVMDetector(cv.HOGDescriptor_getDefaultPeopleDetector())# 检测行人(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-people", src)cv.waitKey(0)cv.destroyAllWindows() |
---|