Opencv使用cascade方法训练自己的LBP特征分类器的全过程

前言

刚刚才把自己训练的分类器整出来,,

现在来理一下整个过程,从制作正负样本开始一直到最后产生自己的分类器.xml文件。

因为毕设的要求,可能要用Opencv训练识别模型,用以识别道路积水。Opencv上自带的只有一些识别脸、眼睛等模型,所以要自己训练分类器模型。在训练自己的分类器之前,我还去尝试了如何调用训练好的模型,也就是调用Opencv自带的分类器模型,就是.xml文件,直接cvLoad就行,具体自己需要去网上查(提醒一下,Opencv3.0以上版本,load方式有所改变,如果还想用cvLoad,需要将.xml文件换成Opencv2.4版本的),Opencv自带的.xml文件路径在:D:\Opencv\opencv\sources\data\haarcascades 下(我的Opencv安装目录是:D:\Opencv\)。

也就是说,训练自己的分类器的最终目标也就是最后产生一个.xml文件!

步骤

1、正负样本的准备

样本的准备,涉及到正样本的准备和负样本的准备。

1.1 样本的旋转/镜像,用以增加样本数量

如果你样本数够多,可以略过这一步,,

我这里要做的是道路积水的识别,所以我的正样本是包含道路积水的图片,样本图片上最好尽可能的全是道路积水。

最初始的正样本图片我是直接从网上百度找的,找了有30张,jpg格式的(什么格式倒无所谓,后面可以转),没有找到相关的道路积水图集,只好用这个凑合了,= =,我只是想先熟悉一下训练分类器模型的过程,,后面再考虑识别效果的问题。最初始的正样本如下:
在这里插入图片描述
然后,是负样本,也就是不包含有道路积水的图片, 也是网上找的,没找到相关图集,= =。
负样本需要尽可能地贴近你识别的场景,然后差别越大越好,这样可以提高识别效果,在我这里负样本就是道路,不含有积水的道路,,暂时先找了有50张,,如下:在这里插入图片描述
正样本30个,负样本50个,样本数量实在是太少了,标准的样本数量都是成千上万的,才能保证识别效果。

但我在网上实在是没找到太多的正样本,负样本的话还好说。然后我就参照网上给的方法,Opencv在其说明文档中其实也提到了,样本数量少的话,可对正负样本都进行了旋转、镜像等操作,用于增加样本数量,然后我用的批量操作哈,挨个操作估计得累死,= =。

用的软件是ACDSee,免费软件,很好用,百度一搜就有,(不是打广告啊,)。
在这里插入图片描述
安装,打开,右边栏选择样本集所在的文件夹,ACDSee就会自动显示文件夹下的图片了,ctrl+a全选,再点击批量,旋转/翻转,然后在选项里修改选择将修改后的图像放入文件夹,防止覆盖原来的样本图像!一般改为另外一个新建的文件夹,点击确定。
在这里插入图片描述
然后,选择不同的旋转/镜像,生成不同的图像,这个过程很简单不细说了,建议每旋转/镜像一次新建不同的文件夹存放。不用右上方的exif,它是另外一个图像格式。

无论是正样本还是负样本,衍生的7个不同文件夹,图片名会雷同,所以,需要进行批量重命名,同样,ACDSee也能进行批量重命名,这个很简单,不细说了。(图片命名建议不要太复杂,我的命名直接是数字,1-240和1-400)

所以,最后能分别衍生出7种不同的正负样本,加上原来的样本,现在正样本数有240个,负样本数有400个。

1.2 对正样本选取感兴趣区域

因为正样本,最后需要统一尺寸,24×24大小(LBP特征:24×24,Haar特征:20×20),而网上找的道路积水图片也不一定整张图全是积水或者大部分是积水,还记得我们前面说过,要尽可能全是你要识别的物体吗,,如果直接缩小尺寸成24×24的,那么在正样本图片中,积水部分占的比例就很小,极大影响识别效果。

所以,我们要在正样本从选取感兴趣区域(ROI),用到的工具是imageclipper,这个工具是我在别人写的博客里面找的,很好用,感谢感谢,最后面会有博客地址,imageclipper的下载地址:https://pan.baidu.com/share/link?shareid=76335086&uk=4227943372,

imageclipper的使用:
将要截取的正样本图集放在imageclipper根目录下(和imageclipper.exe同级),然后点开imageclipper.exe,鼠标左键截图,鼠标右键移动截图区域,然后点空格保存并自动转到截下一张,截的图保存在imageclipper文件夹里面,非常好用!!
截取的区域大小,没有限制,但需要大于24×24。

只需要对正样本处理,负样本不需要。截取是一张一张的截取的,可累惨了 = =,效果如下,可以看到图片大小不一,但积水区域较原图明显很多!

在这里插入图片描述

1.3 对样本统一尺寸,灰度化

因为,对正样本进行感兴趣区域截取后,截取的图片格式从jpg的格式变成了png格式的了,所以我还要进行转换,所幸格式转换很简单,直接写个格式转换批处理脚本即可,如何转换,请看:https://jingyan.baidu.com/article/948f592415cd66d80ff5f986.html,过程简单,不细说。

为什么要转,因为负样本是jpg的,我觉得样本的图片格式最好要统一才对。

转完格式后,然后还要进行统一重命名,因为imageclipper的截图操作后,使图片名发生改变。统一重命名,使用ACDsee批量重命名,很好用,操作也很简单,不细说了。

接下来,就是统一尺寸了,只需要对正样本进行统一尺寸,即,图片的尺寸大小全部改为24×24的,用的工具也是ACDsee。
Ctrl+a全选->批量->调整大小->以像素计的大小,勾去保持原始的纵横比(不勾去的话,大小就不是24×24、1:1的,会有一定的比例,亲测),然后同样更改选项,将调整大小后的图片放在另外一个文件夹里面,点击开始调整大小,欧了!!
在这里插入图片描述
然后是灰度化,注意,正负样本都需要进行灰度化!!

批量灰度化推荐用的软件是美图秀批处理秀,,
在这里插入图片描述
同样,右边栏选取需要灰度化的文件夹,更改另存为的文件夹路径,->特效->推荐下的黑白色,点击确定,即可批量灰度化正负样本图片。
以下分别是正负样本灰度化后的图:
在这里插入图片描述
在这里插入图片描述
OK,现在就才真正地把正负样本准备好了。

正负样本都是灰度图,正样本图片统一尺寸为24*24,负样本图片大小随意,但需比正样本大。

2、生成正负样本的描述文件

首先,在D盘下,新建文件夹TrainTest。

然后,在TrainTest下,新建三个文件夹:pos、neg、xml。pos存放步骤1最后的正样本图片,neg存放步骤1最后的负样本图片,xml用来存放生成的.xml文件,暂时为空。

接下来,在pos文件夹(正样本图集)下,新建一个.txt文件,输入以下内容:

dir /s/b > pos.txt
pause
exit

Ctrl+S保存,退出,然后更改.txt为.bat,然后双击运行,可以看到, 会生成一个pos.txt文件。
在这里插入图片描述
再打开pos.txt,将jpg全部替换为jpg 1 0 0 24 24
删除最后两行:pos.bat和pos.txt,保证没有空行。
最后,pos.txt中的内容如下:
在这里插入图片描述
对neg文件夹也进行同样操作,不过不需要做将jpg全部替换的操作,注意,同样需要删除生成的neg.txt的最后两行
在这里插入图片描述
在这里插入图片描述
然后,将pos.txt、pos.bat和neg.txt、neg.bat剪切出来,放在和pos、neg、xml文件夹同等目录下,
在这里插入图片描述
然后,需要在命令行下执行操作,

win+r,输入cmd,进入命令行,

依次输入:
D:
cd TrainTest
opencv_createsamples.exe -info pos.txt -vec pos.vec -bg neg.txt -num 240 -w 24 -h 24
在这里插入图片描述
再点击Enter,可以看到一长串信息,最后在同级目录下,会生成一个pos.vec文件(有几百kb,具体大小看你的正样本数量大小,如果.vec文件大小是1kb的话(我出现过一次),那就是前面的步骤没做好,仔细检查吧)。因为,我运行过了,所以就没点运行了,看不到效果,哈哈哈,,

最终,如果下面的文件齐了的话,说明我们终于做好了训练分类器的准备了,万事具备,只欠训练了!!
在这里插入图片描述
opencv_createsamples.exe
opencv_traincascade.exe
在D:\Opencv\opencv\build\x64\vc12\bin下(按照自己Opencv的安装目录找),
其他文件前面一一都有说明。

3、训练,生成自己的分类器

到这一步,就看自己的造化了,哈哈哈,,
据网友说,到这里有可能会出各种千奇百怪的错,,

在以上工作都做好下,终于可以用到opencv_traincascade.exe来训练产生自己的分类器了——.xml文件,我来了~~

win+r,输入cmd,进入命令行,

依次输入(注意大小写,不要写错):
D:
cd TrainTest
opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 192 -numNeg 400 -numStages 20 -featureType LBP -w 24 -h 24

在这里插入图片描述
然后,点击Enter。

顺利的话,命令行会不停刷,一段时候过后结束,没报错,然后你就能在xml文件夹下看见.xml文件了。

但我还是出了两次错,一次错是类似这种(忘了截图了,所以只有文字描述,这个错网上很普遍):

OpenCV Error: Bad argument (Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file.) 。

后面我查出来,是我一开始做的pos.txt和neg.txt有问题,比如在pos.txt里,我一开始做的是只有1.jpg 1 0 0 24 24 ,前面没有路径D:/TrainTest/pos这些,而且是放在pos文件夹下的,没有剪切出来放在和pos文件夹同级目录,在前面我已经纠正过来了,前面用的是正确的方式,所以如果顺利的话,你应该不会出这种错误。

第二个错误,就是网上常说的numPos值设定的问题(一般说来,numPos设定的值最好比原始正样本数量要稍微小些才不会报错),训练到一半就暂停,报错了:在这里插入图片描述
出这个错的时候,我numPos值设定的是240×0.9 = 216,(按0.9的比例),然后看到网上说,可以设定为240×0.8=192,(按0.8的比例),就改成192,就训练成功了,0-19个stage全部训练完,没报Error,最后结果图如下:
在这里插入图片描述
然后在xml文件夹下可看到生成的.xml文件,最前面的cascade.xml就是我们自己训练的分类器模型了:
在这里插入图片描述
OK,终于写完了完整的过程,剩下后面就是测试分类器的识别效果和优化分类器了,估计又是个难题,,

分类器的识别效果以后再说吧,哈哈哈,,

有空再写啦,又写了两三个小时,累惨了,= =。

参考资料:
训练步骤:
https://blog.csdn.net/qq_26898461/article/details/48802569
https://blog.csdn.net/qq_27063119/article/details/79247266
https://www.cnblogs.com/jhzhu/p/3217297.html
https://www.jianshu.com/p/0afa9712c6d5
训练出错处理:
https://blog.csdn.net/qq_38189484/article/details/87908747
https://answers.opencv.org/question/59371/opencv-error-bad-argument-can-not-get-new-positive-sample/

  • 18
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值