本文主要是介绍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 ALLpause
训练中:
一些其他知识:
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?
这篇关于opencv 训练分类器 train dataset for temp stage can not be filled的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!