java-opencv-训练自己的物体分类器

参考:
https://blog.****.net/qq_32502511/article/details/79010509
https://blog.****.net/lileiyang12/article/details/10155813
https://blog.****.net/YK_LaNce/article/details/100576560

本文使用opencv-3.4.1

第一步:准备文件

  • 新建目录:negdata(存放负样本),posdata(存放正样本),xml(存放生成的xml),如下:java-opencv-训练自己的物体分类器

  • 收集正,负样本(刚开始可以先用50~100左右的样本量试试看,正,负样本数量最好大于1000,具体看个人感觉)。
    正样本,需要做识别物体的图片(本文收集60张):
    java-opencv-训练自己的物体分类器负样本,任意不包含正样本的图片(本文收集106张):
    java-opencv-训练自己的物体分类器

第二步:调整样本,并生成样本描述文件

  • 调整样本----将正,负样本转换灰度(本文采用:IMREAD_GRAYSCALE),调整大小(本文采用:正20X20,负50X50)(据说,正20X20最佳)。
    调整后正样本:
    java-opencv-训练自己的物体分类器调整后负样本:
    java-opencv-训练自己的物体分类器
  • 生成样本描述文件:
    cmd 进入posdata目录,执行 dir /b/s/p/w *.jpg > pos.txt
    同理进入negdata目录,执行 dir /b/s/p/w *.jpg > neg.txt
    pos.txt内容如下:
    java-opencv-训练自己的物体分类器
    neg.txt内容如下:
    java-opencv-训练自己的物体分类器
    修改pos.txt文件(neg.txt不用修改)如下:
    java-opencv-训练自己的物体分类器
    “1 0 0 20 20”,为固定格式,其中20指的是照片的像素大小。

第三步:生成.vec文件

  • 将\opencv\build\x64\vc14\bin 下的所有文件复制到posdata目录同级目录下;将上一步最后生成的pos.txt,neg.txt文件也放入该同级目录,如下:
    java-opencv-训练自己的物体分类器
  • cmd 进入该目录,执行:
    opencv_createsamples.exe -vec pos.vec -info pos.txt -num 60 -w 20 -h 20
    java-opencv-训练自己的物体分类器其中-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),此时目录中文件如下;
    java-opencv-训练自己的物体分类器
    双击运行traincascade.bat,如下:
    java-opencv-训练自己的物体分类器
  • 在xml目录下生成的cascade.xml文件就是训练出来的分类器。