Opencv中traincascade+LBP的训练过程及方法

来源:互联网 发布:mysql 表空间大小 编辑:程序博客网 时间:2024/05/22 18:25

今天用opencv中的traincascade+LBP的方法去检测行驶证中的“所有人”字段。 用这个方法去检测,最主要的是准备好充分的正样本和负样本。

  1. 标记正样本

    通过标记工具标记了1000张行驶证图片,记录下每张图片中的”所有人”字段出现的位置。在这过程中,有2个小技巧,第一就是在标记的时候,在原图上用小黑块把原图上用鼠标标记的矩形框覆盖,即把“所有人”字段遮住,存到负样本目录下,生成一张负样本。第二点为了避免光照色泽等的干扰,在生成正样本的同时,对原图进行直方图均衡化,加大图片对比度,生成一张正样本图,会有更好的鲁棒性。

  2. 准备负样本
    准备负样本时,多找找与正样本形似的一些图片,例如对于行驶证来说,什么动物啊,花草啊等这类图片基本对效果的影响不大,所以尽量找些学生证啊,毕业证,驾驶证,报纸等图片,与行驶证接近的图,这样会提升训练的效果图。

  3. 代码
    具体如何实现,参考官网资料最靠谱,链接如下:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html
    对于正样本,先通过标注工具生成filename+个数+rect.x+rect.y+rect.width+rect.height的形式,*

中间用tab键做分割,不能用逗号之类的,

*之后通过opencv_createsample转换成vec的文件;将标注好的txt文件放在图片目录下,用以下命令:
opencv_createsamples -vec licenseVec -info /Users/Downloads/imagefile/file.txt -num 2000 -w 45 -h 25 -show

负样本不需要转格式,形成txt文件就行,里面存储的只是文件名称,千万别写成绝对路径,用相对路径就行,因为在训练的时候会将txt文件的当前路径加上文件里存储的图片路径,如果用绝对路径的话,会重复,导致找不到图片。

  1. 开始训练
    准备好数据后,就该训练了,根据官网参数的提示进行设置。一下是我的设置,可参考:
opencv_traincascade -data cascade_license_dir -vec licenseVec -bg LicenseText.txt -numPos 800 -numNeg 4000 -numStages 15 -featureType LBP -w 45 -h 25 -minHitRate 0.99 -maxFalseAlarmRate 0.3 -bt DAB -maxDepth 2 

记得-w 和-h就是小写的,还有-minHitRate和-maxFlaseAlarmRate参数,不然训练速度很快,而且训练的效果不理想。 -numNeg会比实际准备的负样本个数大两三倍,并且-w和-h和用opencv_createsamples中用的-w和-h保持一致,不然会报错。

码农就是不段的遇到各种奇怪问题,然后不断的解决,最近被虐的已经习惯了,平常心对待吧。

训练完之后,进行测试,分类器效果还是不够理想,会把相近的都选中,经大神指点,降低 -maxFlaseAlarmRate的参数,提高-numPos参数,以及把负样本也做一次直方图均衡化,在加些报纸杂志,能够区分出所有人字样的负样本。再次进行训练。
中途报错:Can not get new positive sample.The most possible reason id insufficient count of samples is given veg-file.

这里写图片描述

出现这种错的原因提示中很明显,正样本的数目不够,也就是-numPos设置的大了。加入正样本的数目一共有1900张,-numPos设置的是1800张,那么在第一级分类器中,会在1900张图片中选择1800张,在准确率达到0.99时结束第一级训练,那么分类器认为正样本还有1800*0.99张;到了第二级分类器,依旧需要输入1800张图片,那么还得从剩余的(1900-1800)张图片中选择(1800-1800*0.99)张,加上第一级分类器筛选出的正样本一起去训练,依次类推,假如你剩余的样本少于分类器需要的正样本数目,就会报错。所以设置-numPos的时候尽量是正样本数目的80%左右。

错误:Train dataset for temp stage can not be filled. Branch training terminated.

若出现这种错误,是负样本的路径有问题,-bg 后面的参数只能是文件名称,不能是路径+文件名称,需要把负样本的txt文件放到当前目录下,并在txt文件中的路径加上负样本图片的文件名。

0 0