opencv的级联分类器使用

opencv的级联分类器是一个比较好用的工具,在正样本较小的情况下,可以取得不错的效果。
他的原理是基于adaboost,了解他的原理,这是非常非常重要的,这有关模型参数的调整,直接影响到模型的好坏。
opencv官网给出了相关教程。http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html
这两名博主也写了教程非常好,写的非常好
https://blog.csdn.net/akadiao/article/details/79027318
https://blog.csdn.net/xiao_lxl/article/details/44645969
在开始训练前,有以下几点需要注意的:
1.负样本尺寸应该大于或等于正样本,数量大致是正样本的三倍。(可以用美图秀秀批量转格式)
2.负样本只需要txt格式,而正样本需要vec格式

32位系统下 这段代码可以用来生成txt或dat文件,需要主要写路径和读路径。

复制代码
#include <io.h>
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
using namespace std;

void getFiles(string path, vector<string>& files)
{
//文件句柄
long hFile = 0;
//文件信息,声明一个存储文件信息的结构体
struct _finddata_t fileinfo;
string p;//字符串,存放路径
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)//若查找成功,则进入
{
do
{
//如果是目录,迭代之(即文件夹内还有文件夹)
if ((fileinfo.attrib & _A_SUBDIR))
{
//文件名不等于"."&&文件名不等于".."
//.表示当前目录
//..表示当前目录的父目录
//判断时,两者都要忽略,不然就无限递归跳不出去了!
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
}
//如果不是,加入列表
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0);
//_findclose函数结束查找
_findclose(hFile);
}
}


int main() {
const char * filePath = "C:\\Users\\86198\\Desktop\\cv\\data\\train2\\neg1";
//const char * filePath = "C:\\Users\\86198\\Desktop\\cv\\data\\train2\\pos1";
vector<string> files;

////获取该路径下的所有文件
getFiles(filePath, files);
int size = files.size();
for (int i = 0; i < size; i++)
{
cout << files[i].c_str() << endl;
}

ofstream outfile("E:\\neg.txt", ofstream::app);
//ofstream outfile("E:\\pos.dat", ofstream::app);
if (outfile.is_open())
{
for (int i = 0; i < size; i++)
{
outfile << files[i] << "\n";
//outfile << files[i] << " 1 0 0 64 32\n";
}
}
else
{
cout << "can not open the file \n" << endl;
return -1;
}
return 1;
}
复制代码

64位系统可以看此篇文章https://blog.csdn.net/XDH19910113/article/details/109645695

训练代码中则需要参数的问题:
opencv_traincascade.exe -data xml -vec C:\Users\86198\Desktop\cv\data\train2\pos.vec -bg C:\Users\86198\Desktop\cv\data\train2\neg.txt -numPos 15 -featureType HAR -numNeg 20 -numStages 10 -w 64 -h 32 -minHitRate 0.99 -maxFalseAlarmRate 0.3 -mode ALL

-featureType opencv3以上的版本不接受HOG特征
-minHitRate 该项参数是弱分类器中正样本的通过率,一般设为0.99。
-maxFalseAlarmRate 该项参数是弱分类器中负样本的通过率,一般设为0.3~0.5
-numStages 弱分类器个数

在样本较少的情况下,往往训练不到设定好的numStages。所以numStages较少的情况下,应该有较高的集中率HitRate和较低误检率FalseAlarmRate,这是由adaboost的原理决定的。
https://blog.csdn.net/beizhengren/article/details/77095969
如果我的样本正样本总数为100,负样本为150,那么我选择一次训练正样本15 负样本20 击中率0.99 误检率0.5。测试效果中,如果发现经常框错,可以选择降低误检率为0.3或提高击中率到0.995。不建议同时调整击中率和误差率到一个很高的水平,因为我们过分提高了分类的门槛,会造成最终的测试结果框不出东西。

posted @   澳大利亚树袋熊  阅读(678)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示