本专栏内容为pynq实现hog+svm行人检测,将分为以下部分
(1)hog特征简介
(2)HLS实现
(3)上板验证
由于本人能力不足,在文中出现的错误请各位指出。
首先是第一部分,hog特征提取的简介。
HOG(histogram of oriented gradients)意为方向梯度直方图,其可以用来表示图像的物体特征,SVM(support vector machines)支持向量机是一种二分类模型。提取图像的HOG特征并放到线性SVM模型里进行监督学习,从而实现行人的检测。
首先第一步,将图片灰度化,RGB图片经过灰度化后由原来的3通道变成了1通道。公式如下
对图像进行提取hog特征时,是以窗口为单位,比如一个128x64大小的窗口,以步长为8在一张图片进行滑动,滑动一次提取一次hog特征,进行一次判断。
在窗口中,首先要进行的第一步是计算每个像素的梯度和幅值。计算公式如下
g为幅值,θ为梯度。其中,gx是在x方向每个像素的变化,gy是y方向每个像素的变化,如下图
圈中像素的gx=61-60=1,gy=62-60=2,对于最外的像素可以padding一圈0来计算。计算完后,可以得到每个像素的梯度和幅值。
接下来,将这个窗口分成一个个cell,比如128x64的窗口分成16x8个8x8的cell,根据每个cell内的梯度方向,对应幅值加权分到9个bin上,可以得到16x8个长度为9的数组,也就是梯度直方图。
具体操作为将0°-180°划分为9个区间bins,每个区间大小为20°。(也有将360°划分的,如果在之前求梯度时有加180°,使结果分布在0°-180°则用180°划分)
根据cell内每个像素的梯度,将对应幅值加权分配到对应的bin中。例如某个像素g=30,θ=25°,梯度介于10~30之间,所以在bin2上应该加30x[(30-25)/20]=7.5,bin1上应该加30x[(25-10)/20]=22.5。
再例如,如果θ=30°,那就直接将g加到bin2上。就这样将cell内的每个像素都操作,一个cell可以得到一个长度为9的数组,整个窗口可以得到16x8个这样的数组。
接下来进行下一步,划分block,将4个8x8的cell组成1个的block,然后以步长为8移动,继续组成block。如下所示
每个block内的4个cell的bin组成长度为36的数组,完成后,得到15x7个长度为36的数组。
进行block划分的目的是为了进行归一化,归一化的目的是为了是降低光照的影响,归一化有多种方法,如下图
这里采用的公式为
即将一个block内的36个bin,每个bin都进行上公式的操作。完成归一化后,将15x7个长度为36的数组reshape成一个1x3780的向量以其作为SVM分类的依据。