java-opencv-训练自己的物体分类器
参考:
https://blog.csdn.net/qq_32502511/article/details/79010509
https://blog.csdn.net/lileiyang12/article/details/10155813
https://blog.csdn.net/YK_LaNce/article/details/100576560
本文使用opencv-3.4.1
第一步:准备文件
新建目录:negdata(存放负样本),posdata(存放正样本),xml(存放生成的xml),如下:
收集正,负样本(刚开始可以先用50~100左右的样本量试试看,正,负样本数量最好大于1000,具体看个人感觉)。
正样本,需要做识别物体的图片(本文收集60张):
正样本负样本,任意不包含正样本的图片(本文收集106张):
第二步:调整样本,并生成样本描述文件
调整样本----将正,负样本转换灰度(本文采用:IMREAD_GRAYSCALE),调整大小(本文采用:正20X20,负50X50)(据说,正20X20最佳)。
调整后正样本:
调整后负样本:
生成样本描述文件:
cmd 进入posdata目录,执行 dir /b/s/p/w *.jpg > pos.txt
同理进入negdata目录,执行 dir /b/s/p/w *.jpg > neg.txt
pos.txt内容如下:
neg.txt内容如下:
修改pos.txt文件(neg.txt不用修改)如下:
“1 0 0 20 20”,为固定格式,其中20指的是照片的像素大小。
第三步:生成.vec文件
将\opencv\build\x64\vc14\bin 下的所有文件复制到posdata目录同级目录下;将上一步最后生成的pos.txt,neg.txt文件也放入该同级目录,如下:
cmd 进入该目录,执行:
opencv_createsamples.exe -vec pos.vec -info pos.txt -num 60 -w 20 -h 20
其中-num 60,指的是图片的数量,-w 20 -h 20,指的是图片的规格。
创建traincascade.bat文件,添加内容:
opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 48 -numNeg 80 -numStages 10 -w 20 -h 20 -mode ALL
pause
其中-numPos 48为训练取的正样本的样本(取样本数量的0.8~0.9,本文取48),-numNeg 80为训练取的负样本的样本(取样本数量的0.8~0.9,本文取80),-numStages 10 表示训练的层数(建议15~20,本文取10),此时目录中文件如下;
双击运行traincascade.bat,如下:
在xml目录下生成的cascade.xml文件就是训练出来的分类器。