1.windows系统下需要编译安装opencv3.4(注意opencv4.1没有分类器)遇到windows下的opencv编译问题参考:
注意:本机编译的opencv_createsamples.exe
程序和opencv_traincascade.exe
程序只有通过本机编译才能在本机正常使用。
2.然后按照这个教程执行:
注意:这个训练的话得3到4个小时
另外基于opencv的在训练时间和精度上都不如基于tensorflow的。
3.遇到opencv_createsamples.exe
程序和opencv_traincascade.exe
程序的参数解释,通过以下教程解决:
使用Opencv的opencv_traincascade来训练属于自己的分类器,检测自己想检测的东西,666,从使用到放弃。
最近做了一个目标检测的应用,通过大量的待检测目标的样本进行训练,得到分类器;然后输入测试视频,看分类器的检测结果。主要应用了OpenCV自带的工具:【注意opencv版本为3.4才行】
1.opencv\build\x86\vc10\bin下的opencv_createsamples.exe
2.opencv\build\x86\vc10\bin下的opencv_traincascade.exe
训练的算法是adaboost级联分类器。关于adaboost的算法讲解,这篇博文有不错的讲解:http://blog.csdn.net/mousever/article/details/52038198
opencv_traincascade提供了三种不同的特征提取方式:Haar,LBP,HOG。在本次应用中,待检测的目标如下图蓝色椭圆中所示:
整体的步骤流程如下:
1、 正负样本的创建;
2、 利用样本,训练分类器;
3、 利用训练好的分类器进行目标检测。
训练样本分为正样本和反样本。正样本是指待检测的目标样本(例如汽车,人脸,标志物等),反例样本指不包含正样本的背景图片(需要注意的是,这些反例样本尽量是出现正样本场景中的背景图片),所有的样本图片都被归一化为同样的尺寸大小(例如,20x20、20x30)。 在本次演示工程中,通过摄像头在不同光照、不同旋转角度下拍摄待检测物体的照片,然后对图片进行抠图,得到正样本。得到的样本数量约为5001000个。然后拍摄正样本可能的背景画面,得到负样本数量约为10001500个。得到正样本后,利用OpenCV函数库中的CreateSamples.exe工具生成正样本描述文件。这个文件是接下来训练要用的,可以看做是正样本特征的第一步提取。关于opencv_createsamples.exe的运行命令参数,可以查询此篇博客:http://blog.csdn.net/wuxiaoyao12/article/details/39227189。
opencv_createsamples命令为:
opencv_createsamples.exe -info info.txt -vec vector.vec -num 700 -w 20 -h 30
训练阶段算法采用了adaboost(自适应增强)算法,这是一种级联分类器的算法,将多个性能较弱的分类器级联,组合成一种性能强的分类器。它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。OpenCV提供了开源的adaboost算法库,可以比较方便的调用;而对于应用,比较重要的一点是特征的选取。通常,样本可以用Haar、HOG、LBP等特征描述,例如人脸,用Haar效果比较好,而对于行人,用HOG效果比较好。在应用时,应分析物体特征,选择较好的特征提取算法。opencv_traincascade命令为:
opencv_traincascade.exe -data data/cascade -vec data/vector.vec -bg
negative/infofile.txt -numPos 600 -numNeg 1000
-numStages 20 -featureType LBP -mode ALL -w 20 -h 30
值得注意的是其中的numPos参数,并非为createsamples阶段采用的700,否则会报错。建议为num的0.8~0.9。另外经过测试,对于featureType参数,LBP比HAAR效果相差无几,但训练速度快了很多。