您现在的位置是:网站首页> 编程资料编程资料
如何利用opencv训练自己的模型实现特定物体的识别_python_
2023-05-25
375人已围观
简介 如何利用opencv训练自己的模型实现特定物体的识别_python_
1.说明
opencv安装包中有训练好的分类器文件,可以实现人脸的识别。当然,我们也可以训练自己的分类器文件,实现对特定物体的识别。本文章就详细介绍下如何训练自己的分类器文件。
2.效果
我训练的是检测苹果的的分类器文件,可以实现对苹果的识别。

3.准备
3.1 程序准备
- 训练自己的分类器文件,需要用到两个程序 : opencv_createsamples.exe和opencv_traincascade.exe
- opencv最新的安装包中没有这两个程序,我们可以下载 3.4.14这个版本的安装包进行安装。
- opencv安装包 : opencv-3.4.14-vc14_vc15.exe
- 安装完成后,在这个目录下就会有这两个程序文件 opencv\build\x64\vc15\bin
3.2 样本数据准备
正样本数据 : 也就是我们需要检测的物体图片,可以自己用手机拍摄下你要检测的物体的图片,多拍摄一些不同角度的图片。
我的正样本数据在这个目录下 image\positive\img,大概有50多张图片

然后在image\positive目录下新建一个info.dat文件,在其中记录正样本图片信息

参数介绍
- img/1.jpg : 文件路径和文件名
- 1:表示图片中有几个目标物体,一般一个就行了
- 0,0:目标物体起始坐标
- 1280,1706:目标物体大小
负样本数据:不包含我们要检测物体的图片,可以拍摄一些风景之类的图片,尽量多一些。
我的负样本数据在这个目录下 image\negitive\img

然后在image\negitive目录下新建一个bg.txt文件,在其中记录负样本图片信息
负样本图片信息我们只需记录路径和文件名就行了,但是这里要注意,路径名要写绝对路径,后面会说为什么。

3.3 正样本VEC文件创建
- 训练样本之前先要生成vec文件,要用到opencv_createsamples.exe程序
- opencv_createsamples.exe部分参数介绍
[-info] # 记录样本数据的文件(就是我们刚才创建的info.data文件) [-img ] [-vec ] # 输出文件,内含用于训练的正样本。 [-bg ] # 背景图像的描述文件 [-num ] #样本数量(默认为1000) [-bgcolor ] #指定背景颜色 [-w ]#输出样本的宽度(以像素为单位) [-h ]#输出样本的高度(以像素为单位)
在安装包的这个目录下opencv\build\x64\vc15\bin可以找到opencv_createsamples.exe程序,我们生成下vec文件
D:\opencv3.4.12\opencv\build\x64\vc15\bin\opencv_createsamples.exe -info C:\Users\lng\Desktop\image\positive\info.dat -vec C:\Users\lng\Desktop\image\sample.vec -num 58 -bgcolor 0 -bgthresh 0 -w 24 -h 24
在image目录下就生成了vec文件

4.样本数据训练
- 完成上面的准备工作,就可以开始训练样本。训练样本需要用到opencv_traincascaded.exe程序
- opencv_traincascaded.exe程序部分参数介绍
-data#目录名,如不存在训练程序会创建它,用于存放训练好的分类器 -vec #包含正样本的vec文件名 -bg #背景描述文件 [-numPos ] #每级分类器训练时所用的正样本数目 [-numNeg ] #每级分类器训练时所用的负样本数目 [-numStages ] #训练的分类器的级数 --cascadeParams-- [-featureType <{HAAR(default), LBP, HOG}>] # 特征的类型: HAAR - 类Haar特征; LBP - 局部纹理模式特征 [-w ] #训练样本的尺寸(单位为像素) [-h ] #训练样本的尺寸(单位为像素) --boostParams-- [-minHitRate = 0.995>] #分类器的每一级希望得到的最小检测率 [-maxFalseAlarmRate ] #分类器的每一级希望得到的最大误检率
- 在安装包的这个目录下opencv\build\x64\vc15\bin可以找到opencv_traincascade.exe程序,开始训练样本
- 这里注意下
- 指定-bg参数时,文件名前不能加路径,所以需要把刚才在image\negitive下创建的bg.txt文件拷贝到opencv_traincascade.exe程序所在目录下,所以要在bg.txt写负样本图片的绝对路径。
- 指定numPos参数时,因为每个阶段训练时有些正样本可能会被识别为负样本,故每个训练阶段后都会消耗一定的正样本。因此,此处使用的正样本数量绝对不能等于或超过positive文件夹下的正样本个数,一般留有一定的余量
- 指定-numNeg参数时,可以多于negitive目录下的负样本数量
D:\opencv3.4.12\opencv\build\x64\vc15\bin\opencv_traincascade.exe -data C:\Users\lng\Desktop\image -vec C:\Users\lng\Desktop\image\sample.vec -bg bg.txt -numPos 50 -numNeg 500 -numStages 12 -feattureType HAAR -w 24 -h 24 -minHitRate 0.995 -maxFalseAlarmRate 0.5
执行结果
PARAMETERS: cascadeDirName: C:\Users\lng\Desktop\image vecFileName: C:\Users\lng\Desktop\image\sample.vec bgFileName: bg.txt numPos: 50 numNeg: 500 numStages: 12 precalcValBufSize[Mb] : 1024 precalcIdxBufSize[Mb] : 1024 acceptanceRatioBreakValue : -1 stageType: BOOST featureType: HAAR sampleWidth: 24 sampleHeight: 24 boostType: GAB minHitRate: 0.995 maxFalseAlarmRate: 0.5 weightTrimRate: 0.95 maxDepth: 1 maxWeakCount: 100 mode: BASIC Number of unique features given windowSize [24,24] : 162336 ===== TRAINING 0-stage =====Training until now has taken 0 days 0 hours 0 minutes 1 seconds. ===== TRAINING 1-stage ===== Training until now has taken 0 days 0 hours 0 minutes 3 seconds. ===== TRAINING 2-stage ===== Training until now has taken 0 days 0 hours 0 minutes 5 seconds. ===== TRAINING 3-stage ===== Training until now has taken 0 days 0 hours 0 minutes 7 seconds. ===== TRAINING 4-stage ===== Training until now has taken 0 days 0 hours 0 minutes 11 seconds. ===== TRAINING 5-stage ===== Training until now has taken 0 days 0 hours 0 minutes 15 seconds. ===== TRAINING 6-stage =====
训练完成后,在img目录下就会生成以下文件。

cascade.xml就是我们需要的分类器文件,其他都是过程文件。
5.测试代码
main.cpp
#include#include char* face_cascade_name = "C:\\Users\\lng\\Desktop\\image\\cascade.xml"; void faceRecongize(cv::CascadeClassifier faceCascade, cv::Mat frame); int main(){ cv::VideoCapture *videoCap = new cv::VideoCapture; cv::CascadeClassifier faceCascade; // 加载苹果分类器文件 if (!faceCascade.load(face_cascade_name)) { std::cout << "load face_cascade_name failed. " << std::endl; return -1; } // 打开摄像机 videoCap->open(0); if (!videoCap->isOpened()) { videoCap->release(); std::cout << "open camera failed"<< std::endl; return -1; } std::cout << "open camera success"<< std::endl; while(1){ cv::Mat frame; //读取视频帧 videoCap->read(frame); if (frame.empty()) { videoCap->release(); return -1; } //进行苹果识别 faceRecongize(faceCascade, frame); //窗口进行展示 imshow("face", frame); //等待回车键按下退出程序 if (cv::waitKey(30) == 13) { cv::destroyAllWindows(); return 0; } } system("pause"); return 0; } void faceRecongize(cv::CascadeClassifier faceCascade, cv::CascadeClassifier eyesCascade, cv::CascadeClassifier mouthCascade, cv::Mat frame) { std::vect
相关内容
- python3使用libpcap库进行抓包及数据处理的操作方法_python_
- Python基础之文件操作及光标移动详解_python_
- Python基础globlal nonlocal和闭包函数装饰器语法糖_python_
- Python基础第三方模块requests openpyxl_python_
- Python基础之hashlib模块subprocess模块logging模块_python_
- 如何使用python读取Excel指定范围并转为数组_python_
- Python基础面向对象之继承与派生详解_python_
- Python实现批量修改xml文件的脚本_python_
- 详解Python的整数是如何实现的_python_
- Python if 判断语句详解_python_
点击排行
本栏推荐
