pynq实现hog+svm行人检测(1)

        本专栏内容为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分类的依据。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值