HOG/svm Step by Step

完整代码: 我的github

opencv3.1.0 ubuntu14.04通过编译
在最新版本的opencv3.1.x下代码有少许变化, 变化不大, 代码已更新,ubuntu 16.04 通过编译
需要注意的是 3.1.x 后 加载分类器的xml文件, 直接load(path)就行
比如

cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::load(path);

github上有的改了有的没改
csdn的md编辑器 和 ubuntu的中文输入法有冲突(ibus和sogou都不行), 打字有点费劲,所以部分参数我没有解释太全, 比如hog各个参数之类的, 如果有不明白的地方欢迎留言探讨

1.先让程序跑起来

看了hog源码,看到detectMultiScale函数不是用opencl就是用的cuda,看不懂具体是怎么实现的,所以这一部份源码等以后讲吧,自己实现的肯定要慢一些的.hog那篇论文最后也说了还有很大的提升速度(speed up)空间,所以先不管它,先跑起来再说.
demo程序源码 我的github
任意键显示下一张图片, esc退出程序

2.模拟detectMultiScale检测过程

1)sliding window
滑窗是为了定位对象(object)在哪里.因为一般的图片是不会像我们训练时输入的裁剪好尺寸一致的样本,即便尺寸可能一致,也可能因为尺度(scale)的不同而造成误检.
解决尺度问题的办法一般是对图像进行一系列的缩放,或者分别用各个尺度不同的样本训练.
但是这并不能很好的解决尺度问题, 因为很可能被检测的对象(object)的实际尺度是落在我们设定的某两个尺度的中间.增加尺度的级数(level)计算量又过大.
我读过有论文将目标先分割出来然后直接resize的,只见过一两篇那样的论文,我读过的论文还是有限的, 不太清楚有没有更好的办法,但是大部分论文一般都是用我说的第一种方法,先用弱分类器找出目标然后再识别.

先搞清几个参数winSize(滑窗大小),stepSize(步长,常用4到8pixels)

用c++写出来就是

cv::Size winSize(60,60); //这个自己定
int stepSize = 30; //step , stride
for(inty =0; y <= img.rows – winSize.height; y+=stepSize){
    for(int x = 0; x <= img.cols - winSize.width; x+=stepSize){
        cv::Rect rect(x,y, winSize.width, winSize.height);
        cv::rectangle(img, rect, cv::Scalar(255,0,0),1,8,0);
        cv::waitKey(100); //不然太快看不到滑窗就结束了
    }
}

这里写图片描述
(不好意思csdn对图片大小有限制, 图像有点小)

可以看到, 一个固定大小的窗口(下文都是64x128)在图像上滑动,
实际上在每个窗口(window)内也有一个固定大小的block在window内滑动, 同样也有滑动步长, 步长是cell大小的整数倍
在每一个block内也有cell在内部滑动, 对于每个cell内的元素, 统计梯度的方向, 得到9个bin的梯度方向直方图.
hog算法中还有个加权投影的过程, 这里不细说了, 看看论文原文吧

计算滑窗时,有很多的重叠区域,怎样减少重复

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值