opencv 训练分类器 train dataset for temp stage can not be filled

目录

 

 

遇到的问题:

解决方法:把maxFalseAlarmRate  降低

参数理解:

训练模型需要的文件

一些其他知识:


 

遇到的问题:

train dataset for temp stage can not be filled.

正样本:

负样本:

错误:

===== TRAINING 0-stage =====
<BEGIN
POS count : consumed   1000 : 1000
Train dataset for temp stage can not be filled. Branch training terminated.

最开始不理解样本数量的要求,以为是样本数量不够,就复制了一些,所以图上重复的很多。

最终,正样本198个。负样本588个。

解决方法:把maxFalseAlarmRate  降低

个人尝试了无效的方法:

1、解读源码,认为是路径有问题的,无效果。不过对源码的解读还是值得看。https://blog.csdn.net/tanmx219/article/details/81783803#commentBox

2、


参数理解:

官网解读连接:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html#id9

中说明了各个参数,其中:

  • -minHitRate <min_hit_rate>

    分类器的每一级希望得到的最小检测率。总的检测率大约为 min_hit_rate^number_of_stages。

  • -maxFalseAlarmRate <max_false_alarm_rate>

    分类器的每一级希望得到的最大误检率。总的误检率大约为 max_false_alarm_rate^number_of_stages.

    最大虚警率,影响弱分类器的阈值,表示每个弱分类器(应该就是每一层)将负样本误分为正样本的比例,一般默认值为0. 5

我理解, maxFalseAlarmRate 应该越小越好,那为什么opencv默认设置为0.5呢,这么高!所以我遇到了上面的报错,从哪个图看,是没有获得新的样本了,所以我把maxFalseAlarmRate  降低到0.1一下,错误解决了。这样是否合理呢?

关于这个参数的意思,连接:https://blog.csdn.net/beizhengren/article/details/77095969

中也有说明。

hitRate = tp / (tp + fn) = recall

falseAlarm = fp / (tn + fp)

这里hitRate称为“命中率”,度量检测器对正样本的通过能力,显然越接近1越好;而falseAlarm称为“虚警率”,度量检测器对负样本的通过能力,显然越接近0越好。

默认minHitRate = 0.995,默认maxFalseAlarmRate = 0.5。假设stageNum = 20时,最终检测器有:

hitRate ≈ minHitRate ^ stageNum = 0.995 ^ 20 = 0.904610....

falseAlarmRate ≈ maxFalseAlarmRate ^ stageNum = 0.5 ^ 20 = 0.00000095...

当然,如果我设置为0.1,训练20层,最终的误报率 0.1^20= 接近0 。

训练模型需要的文件

negdata文件夹:负样本图片

posdata文件夹:正样本图片

生产目录文件:(生成之前切记注意win系统文件名中的空格要去掉。)

去掉空格可以用下面的批处理命令,保存为bat拷贝到需要的目录

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /s/b *.*') do (
    set "foo=%%~nxi"
    set foo=!foo: =!
    set foo=!foo: =!
    ren "%%~fi" "!foo!"
)
exit

生成目录:

进入posdata目录:执行  dir /b/s/p/w *.jpg > pos.txt
进入negdata目录:执行  dir /b/s/p/w *.jpg > neg.txt

生成后,将2个TXT拷贝出来。到exe所在的目录层级。

并修改pos.txt,在后面加上: 数量,x坐标,y坐标,图片宽度,图片高度。

如下图:

添加好,创建正样本的图片的二进制保存文件,就是vec文件。其中,num 正样本图片文件数量。 -w  -h  是希望缩放到的大小。所有切图准备正样本的时候,大小可以是任意的。但是建议还是用固定的。
opencv_createsamples.exe -vec pos.vec -info pos.txt -num 198 -w 20 -h 20

生成pos.vec。

开始训练:

创建bat文件

opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 110 -numNeg 600 -numStages 20 -w 20 -h 20 -maxFalseAlarmRate 0.3 -mode ALL

pause

训练中:

 



一些其他知识:

 1、正样本数量:负样本数量=1:3
 2、刚开始生成的目录TXT,要把里面最后一行的 空行  删除。
 3、文件缩放到的大小,建议pos 20*20  ,neg 50*50
 4、Oh wow I completely misread your training output. Getting the positive samples was no problem at all. The problem lies in your negative samples. I am guessing you have exactly 1500 samples with the model size and that it? Keep in mind that -numNeg is the amount of samples that need to get wrongly classified by the previous stages, in order to be valid for a new negative sample for the next stage. This means that for example, for creating 3 stages you need for example 2000 negative windows, but -numNeg will only be like 700. You get it?
意思是 opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 170 -numNeg 190 -numStages 20 -w 20 -h 20 -mode ALL 中的 numNeg应该设置为(neg样本/numStages),是这样吗?
5、一般训练到损失为0.0004就可以,继续训练可能过拟合。要合理选择stage。
6、 训练时候的 -numPos 170 -numNeg 190  ,这2个参数是每一层训练时用的图片数量,
7、img/img_with_faces_1.jpg  1  140 100 45 45
img/img_with_faces_2.jpg  2  100 200 50 50   50 30 25 25
其中   1,2 表示这个图中有几个目标。后面的4位坐标,前2个是坐标起始点,后两个是尺寸大小。用来从里面扣正样本。当然如果只有1个样本,而且在0,0 位置,就是1 0 0 width heigth
8、报错  Train dataset for temp stage can not be filled. Branch training terminated.


9、负样本的 neg.vec 是不需要创建的。只需要由负样本的目录.txt 。注意:负样本的图片大小可以不用进行归一化成统一大小,因为其在训练的时候可以进行指定大小,训练时会进行图像resize操作。
10、保存xml的文件夹需要手动创建,。
11、真正训练的时候,正样本不是用图片的形式输入,是用pos.vec ,这里面已经用二进制的方式保留了缩放后的所有图片
12、opencv_createsamples 也可以用来查看和检查保存于vec正样本文件中的正样本。这时只需指定 -vec , -w 和 -h 三个参数则可。 opencv_createsamples 将逐一显示正样本图像。
13、N训练层数,HR 命中率;FA 警告,只有当每一层训练的FA < maxfalsealarm数值才会进入下一层训练
14、记得一定要numPos小于vec_file文件里面的数 一般numPos为0.9*num_in_vec或者为0.8*num_in_vec

15 -numNeg 可以选所有的负样本数量,或者比负样本数量大都可以。

15  【计算机视觉】如何使用opencv自带工具训练人脸检测分类器            

16\    Number of stages or maxFalseAlarmRate?      

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值