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

相关文章

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程序包,存

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

理解分类器(linear)为什么可以做语义方向的指导?(解纠缠)

Attribute Manipulation(属性编辑)、disentanglement(解纠缠)常用的两种做法:线性探针和PCA_disentanglement和alignment-CSDN博客 在解纠缠的过程中,有一种非常简单的方法来引导G向某个方向进行生成,然后我们通过向不同的方向进行行走,那么就会得到这个属性上的图像。那么你利用多个方向进行生成,便得到了各种方向的图像,每个方向对应了很多

SigLIP——采用sigmoid损失的图文预训练方式

SigLIP——采用sigmoid损失的图文预训练方式 FesianXu 20240825 at Wechat Search Team 前言 CLIP中的infoNCE损失是一种对比性损失,在SigLIP这个工作中,作者提出采用非对比性的sigmoid损失,能够更高效地进行图文预训练,本文进行介绍。如有谬误请见谅并联系指出,本文遵守CC 4.0 BY-SA版权协议,转载请联系作者并注