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

相关文章

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

qtcreater配置opencv遇到的坑及实践记录

《qtcreater配置opencv遇到的坑及实践记录》我配置opencv不管是按照网上的教程还是deepseek发现都有些问题,下面是我的配置方法以及实践成功的心得,感兴趣的朋友跟随小编一起看看吧... 目录电脑环境下载环境变量配置qmake加入外部库测试配置我配置opencv不管是按照网上的教程还是de