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。不建议同时调整击中率和误差率到一个很高的水平,因为我们过分提高了分类的门槛,会造成最终的测试结果框不出东西。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理