本文介绍一种基于HoG+Pyramids+Sliding Windows+SVM的物体识别方法
基本流程
(1)确定最小检测物体,对原图img缩放,缩放比例为(滑动窗大小/最小物体大小)。
(2)缩放后的图片,构建金字塔。
(3)对金字塔的每一层,通过滑动窗获取patch(类似ROI的概念),对patch归一化处理,之后给训练好的物体检测器识别,将识别成功的窗口位置和概率保存。(特征使用HoG,分类算法使用SVM)
(4)将物体窗口映射到原图img中的物体位置,概率不变。
(5)NMS处理重叠窗口。
HoG
论文
HoG原理简书1
HoG原理简书2
Histogram of Oriented Gradients 方向梯度直方图,是特征描述符算法大家庭的一份子,家庭成员还有SIFT,SURF,ORB。
统计图像局部区域的梯度方向信息来作为该局部图像区域的表征。
基本步骤
灰度化。如果使用彩色图像,每个像素的梯度幅值取三个通道最大的,梯度方向取梯度幅值最大通道的方向。
归一化。对图像进行Gamma矫正,一般对每个像素的灰度值开根号。
计算每个像素的梯度。梯度方向一般分为9的区间(bin)。20°/bin for 无符号方向(0~180°),40°/bin for 有符号方向(0~360°)
统计每个Cell的梯度方向直方图。一般一个Cell是8*8个像素。9个特征值,对应9个bin。
统计每个Block的梯度方向直方图图。一般一个Block是2*2个Cell。36个特征值的向量,同时做归一化。
计算HoG特征向量。根据Block的总个数,生成总的HoG向量(36*n维向量)。
HoG存在的问题
不知道物体在图像的哪个位置。
不知道图像的尺度。
Image Pyramids
解决图像的尺度问题
图像金字塔简书1
OpenCV中图像金字塔的基本步骤
根据系数改变图像的大小。
平滑图像。
def resize(img, scaleFactor):
return cv2.resize(img, (int(img.shape[1] * (1 / scaleFactor)), int(img.shape[0] * (1 / scaleFactor))), interpolation=cv2.INTER_AREA)
def pyramid(image, scale=1.5, minSize=(200, 80)):
yield image
while True:
image = resize(image, scale)
if image.shape[0] < minSize[1] or image.shape[1] < minSize[0]:
break
yield image
Sliding Windo