环境
硬件
硬件环境:Intel 9700F、8G内存
软件及驱动:
操作系统:Windows10企业版(HyperV虚拟机)
Opencv:opencv3.4.0
C++动态链接库支持:VS2019社区版
数据集准备
本章节主要参考CSDN博客。
正样本数据(缺陷:破损)
(1)将所有图像转换为统一格式如jpg或bmp,本文档使用jpg图像进行训练
(2)编写数据统计脚本,并从json中读取标记框,写入txt文档,下图为截取的写好的pos.txt文档
以第一行数据为例:
0.jpg::图像名称
4:json文件中标记框的个数
525:第一个框的左上角坐标点x
602:第一个框的左上角左边掉y
291:框的长
68:框的宽
后续数字则表示其他两个框的坐标点和长宽。
负样本数据(正常)
(1)将所有图像转换为统一格式如jpg或bmp,本文档使用jpg图像进行训练
(2)编写脚本,将负样本文件名写入neg.txt中,下图为写好的neg.txt文件
这里要注意,相较于pos.txt中的内容,neg.txt的图像文件名需要加入neg/,确保使用后续命令时保持与本文档一致
级联分类器训练
训练准备
1.新建文件夹cascade(可自定义)
2.进入cascade文件夹,新建neg和pos文件夹,将准备好的图像数据和对应的txt文件放入
3.进入cascade文件夹新建xml文件夹,用于存放训练好的xml文件
4.进入opencv安装目录,拷贝opencv_createsamples.exe、opencv_traincascade.exe、opencv_world340.dll文件放入建好的cascade文件夹中,三个文件在opencv的目录为\opencv\build\x64\vc15\bin
开始训练
2.执行指令opencv_createsamples -info pos\pos.txt -vec pos.vec -bg neg\neg.txt -num 1624 -w 24 -h 24,运行命令后,会在cascade文件夹下生成pos.vec文件,命令解释如下图所示
3.生成pos.vec文件后,执行指令opencv_traincascade -data xml -vec pos.vec -bg neg\neg.txt -numPos 1400 -numNeg 1254 -numStages 20 -featureType HAAR -w 24 -h 24,执行后等待训练结束即可,指令解释如下图所示:
4.xml文件夹下生成的cascade.xml即为训练后的级联分类器文件
采坑指南
1.生成pos.txt文档时一定要注意写入的图像文件名中不能有空格,否则无法正确生成pos.vec文件
2.生成pos.txt文档时一定要注意标记框的范围,不能超出图像的长宽,否则无法正确生成pos.vec文件,在根据json文件中的左上和右下坐标计算标记框时可向下取整,不要四舍五入,同时,生成pos.txt后可编写脚本,剔除标记框超出图像长宽的图像
3.执行生成pos.vec文件的命令时,确保-num为图像数量,如本文档中使用的1624张图像
4.此条需格外注意,执行训练命令时,-numPos一定要小于训练图像数量,如本文档中使用1624张图像进行训练,但-numPos写了1400,根据查阅的相关资料,-numPos后写的数字为正样本数量的90%即可