写在前面
相信大家学过语言的朋友们都有这样经验:学习编程语言最快的方式就是直接看别人的源代码。别人代码看通了,基本上这门编程语言也就入门了。
文末将附上我自己写的代码,比较初级,适合入门学习。大佬看到这就可以不必接着看下去了
目标检测实战思路:
对于一张有待检测目标(人头)的图片,我们先用滑动窗口选取图片上的某一块区域,利用opencv提取该区域的hog特征,将特征向量输入svm中,利用svm进行分类,判别是否是待检测目标(人头)。
本文附的代码是人头检测代码,就以人头检测为例
1、Hog特征提取
方向梯度直方图(hog)也不是什么新的算法了,而且在opencv中,也有对应的函数可以直接调用。但是搞研究嘛,就简单了解一下什么是hog特征。
方向梯度直方图(Histogram of Oriented Gradient, HOG) 是一种局部区域描述子,常被用来进行目标检测。hog描述子适合应用在局部目标的表象和形状能够被梯度或边缘方向密度分布很好地描述的图像中。
获取HOG描述子的算法如下:
1、彩色图片灰度化(灰度化之后才有直方图等操作);
2、使用直方图均衡和伽马校正法对输入图像进行颜色空间归一化,调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;
3、将图像按照一定的规则划分为多个块,称为block(如图2-2)。块之间允许包含相同的像素点,一般使用滑动窗口的方式获取图像中的块;
4、把每个块分成多个细胞单元,称为cells;
5、在每个细胞单元中计算其中每个像素点的梯度(包括大小和方向),统计细胞单元的梯度直方图;
6、把图像中所有细胞单元的特征直方图串联起来便得到图像的HOG描述子。
2、svm训练
1 数据集构造
首先要给数据打上标签。我用的方法是在有人头的图片上截取人头部分,然后构造人头正样本数据集和没有人头的负样本数据集(样本数量相当最好)。
2 设置svm参数
有了上面的数据集,我们根据第1 节的hog特征提取方法就获得了svm的训练对象,hog特征向量。下面就是设置一些基本参数,丢svm里面训练就是了。具体参数我代码里都给出来了,你可以自己调节一些参数,了解他们的特性。
下面这个链接的116-121页就是关于svm的使用例子,只要将里面的词袋特征提取改为hog即可(不知道为啥,知乎好物推荐搜不到这本书。。。。)。
第二本书就是经典的opencv学习工具书了,不多bb,平时时候图书馆都根本借不到。opencv3 计算机视觉:python语言实现m.tb.cn
3、目标检测
上面已经训练好了svm,下面就是到了重头戏了——目标检测。
在开头我就说过,利用滑动窗口取区域,然后对取出的区域用svm去predict,为真就代表是人头,那么就在图片对应画方框标注出来就好了。若同一个人头有多个框,则利用非最大抑制取最好的框,详见代码。
向画方框和图片标注这些基本函数,opencv都内置了调用就好cv2.rectangle(img, (int(x),int(y)),(int(x2), int(y2)),(0, 255, 0), 1)
cv2.putText(img, "%f" % score, (int(x),int(y)), font, 1, (0, 255, 0)
4、完整项目链接和代码详解hunting777/hog-svmgithub.com
代码详解请点击CSDN-专业IT技术社区-登录blog.csdn.net
我在跑的时候是用的之前自己做的数据集,github上无法上传大批量图片,如果有需要就私信我吧。
码字不易,不喜勿喷!