项目做得很多,机器学习,深度学习也搞了不少,对于图像的方面,现在就行人检测有关HOG+SVM这一块,做一下总结,当然也有车辆检测等等...这里就以行人检测为例做一个介绍:
HOG:梯度直方图的缩写,涉及到Window大小,Block大小,Block的滑动步长,Cell大小和Bin大小(通常为9,360度等分9份),目的就是获取到Window中所有滑动后的block的cell的梯度直方图,组成特征向量。维数:N = ((W–wb )/stride + 1)*((H-hb)/stride+1)*bins*n,其中W为Window的宽,H为Window的高,wb和hb为Block的宽与高,stride为block的滑动步长,bins为投影的区块,n为一个Block中包含的Cell的个数。
SVM:这个就不说了,在面试中都和快排一个级别的了。
本文主要基于OpenCV对HOG和SVM做一个流程上的梳理,适合小白(已知HOG和SVM原理)进行学习,具体项目上具体分析,中间也会提及些项目的东西。
数据集
INRIA Person Dataset: 该数据库是目前使用最多的静态行人检测数据库,提供原始图片及相应的标注文件。训练集有正样本614张(包含2416个行人),负样本1218张;测试集有正样本288张(包含1126个行人),负样本453张。图片中人体大部分为站立姿势且高度大于100个象素,部分标注可能不正确。图片主要来源于GRAZ-01、个人照片及google,因此图片的清晰度较高。在XP操作系统下部分训练或者测试图片无法看清楚,但可用OpenCV正常读取和显示。
在项目中,要想获取更高的正确率,需要结合具体项目场景,行人的姿态,帧图像的大小,检测的目的等等,构建自己的数据集,也可以将自己的数据集添加到一些公共数据集中,进行训练。
基本流程
1. 提取数据集的HOG特征:样本很重要,要贴合项目实际环境去获取图片数据集,不要以为随便搞些图片就可以了训练了。
2. 对正负样本进行训练得到模型
3. 使用训练好的模型生成检测子
4. 使用检测子对测试负样本集进行识别,找到识别错误的hard example:hard example是指利用第一次训练的分类器在负样本原图(肯定没有人体)上进行行人检测时所有检测到的矩形框,这些矩形框区域很明显都是误报,把这些误报的矩形框保存为图片,加入到初始的负样本集合中,重新进行SVM的训练,可显著减少误报。这种方法叫做自举法(Bootstrap),自举法首先使用初始负样本集来训练一个模型,然后收集被这个初始模型错误分类的负样本来形成一个负样本难例集。用此负样本难例集训练新的模型,此过程可以重复多次。
5.将hard example提取HOG特征,结合第一步所得到的特征一起训练出模型。
6. 识别:识别有两种方式,如果仅仅使用线性核的话,只需要Hog类自带的setSVMDetector和detect(detectMultiScale),如果使用