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

2023-10-20 08:20

本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/245870

相关文章

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存