OpenCV自带的训练工具:opencv_createsamples.exe 创建正样本的工具。opencv_traincascade.exe 训练级联分类器的工具,训练出来的级联数据文件也是一个xml的文件。负样本的数量不要小于正样本的数量(5倍正样本数),如果训练的是人脸,那么负样本的图片不要带人脸就行。
基本流程:
1. 收集样本数据 – 包括正负样本
以人脸检测为例 –公开的数据库有 (可以去下载,但是不精确)
正向样本数目 (可以在视频中采集人脸)
负样本数目 (也可以在不出现人脸的视频中采集,负样本最好包罗万象)
正向样本的大小 – 统一尺寸 (图片宽高可以不一样,但是宽高比必须是1:1)
正向样本图片中的背景问题 (背景没处理好,会影响训练的效果)
2. 数据规范化 – 大小、格式
![b699c7011ba4ddcfb27078201b1b81ec.png](https://img.php1.cn/3cd4a/1eebe/cd5/d84f9786330d9e41.png)
3. 生成vec文件与负样本列表文本文件
.\project\workspace_vs\OpenCV310Sources_contrib\install\x64\vc14\bin>opencv_createsamplesd.exe Usage: opencv_createsamplesd.exe [-info ] // 收集的文件的路径 [-img ] [-vec ] // 在vec_file_name目录下生成vec文件 [-bg ] // 上面提到的背景问题,可以通过这个解决 [-num 1000>] // 样本数 [-bgcolor 0>] // 背景颜色 [-inv] [-randinv] [-bgthresh 80>] [-maxidev 40>] // 最大的灰度方差,默认 [-maxxangle 1.100000>] // 如果样本图像有旋转,可以使用这三个参数来旋转,有默认值 [-maxyangle 1.100000>] [-maxzangle 0.500000>] [-show [4.000000>]] [-w 24>] // 输出的样本图像的宽高 [-h 24>].\project\workspace_vs\OpenCV310Sources_contrib\install\x64\vc14\bin>opencv_createsamplesd.exe -info E:\opencv\trainSample\positive\info.dat -vec E:\opencv\trainSample\positiveFaces.vec -num 185 -bgcolor 0 -bgthresh 0 -w 24 -h 24 Info file name: E:\opencv\trainSample\positive\info.dat Img file name: (NULL) Vec file name: E:\opencv\trainSample\positiveFaces.vec BG file name: (NULL) Num: 185 BG color: 0 BG threshold: 0 Invert: FALSE Max intensity deviation: 40 Max x angle: 1.1 Max y angle: 1.1 Max z angle: 0.5 Show samples: FALSE Width: 24 Height: 24 Create training samples from images collection... Done. Created 185 samples .\project\workspace_vs\OpenCV310Sources_contrib\install\x64\vc14\bin>opencv_traincascaded.exe Usage: opencv_traincascaded.exe -data // 在cascade_dir_name目录下生成级联数据文件 -vec // 传入上面创建好的vec文件 -bg // 负样本文件(bg.txt与img文件夹),需要放到与 opencv_traincascaded.exe 命令同目录,绝对路径不可以? [-numPos 2000>] // 每个训练(stage)时的正样本数,不要大于等于总正样本数 [-numNeg 1000>] // 负样本数,可以大于总负样本数,大于的时候opencv会自动从负样本图像中切一部分区域出来,所以负样本图像尺寸最好找大一点的 [-numStages 20>] // stage数 [-precalcValBufSize 1024>] [-precalcIdxBufSize 1024>] [-baseFormatSave] [-numThreads 5>] [-acceptanceRatioBreakValue = -1>] --cascadeParams-- [-stageType default)>] // 对应级联数据文件中的stageType标签,只有 BOOST ? [-featureType default), LBP, HOG}>] // 特征类型 HAAR( [-w 24>] // 与上面的 opencv_createsamplesd.exe 命令的 -w -h 要一致 [-h 24>] --boostParams-- [-bt default)}>] // Boost算法 [-minHitRate = 0.995>] // 最小命中率,比如有1000个正样本,如果此值为0.995,那么会有5个正样本不会被训练 [-maxFalseAlarmRate 0.5>] // 虚警率,度量检测器对负样本的通过能力,显然越接近 [-weightTrimRate 0.95>] [-maxDepth 1>] [-maxWeakCount 100>] // 弱分类器数,如果用 --haarFeatureParams-- [-mode default) | CORE | --lbpFeatureParams-- --HOGFeatureParams--.\project\workspace_vs\OpenCV310Sources_contrib\install\x64\vc14\bin>opencv_traincascaded.exe -data E:\opencv\trainSample -vec E:\opencv\trainSample\positiveFaces.vec -bg bg.txt -numPos 170 -numNeg 500 -numStages 12 -featureType LBP -w 24 -h 24 -minHitRate 0.996 -maxFalseAlarmRate 0.5 如果训练stage数超过了numStages 还没有结束的话,表示训练失败,训练也就结束了。 numStages minHitRate maxFalseAlarmRate 这三个参数可以影响训练的进程。 会生成 cascade.xml(除了这个其他都是中间产物,可以删除) params.xml stage0到8.xml 文件 .\project\workspace_vs\OpenCV310Sources_contrib\install\x64\vc14\bin>opencv_traincascaded.exe -data E:\opencv\trainSample\haar -vec E:\opencv\trainSample\positiveFaces.vec -bg bg.txt -numPos 170 -numNeg 500 -numStages 12 -featureType HAAR -w 24 -h 24 -minHitRate 0.996 -maxFalseAlarmRate 0.5 -mode ALL 也会生成 cascade.xml params.xml stage0到8.xml 文件 // HAAR的训练比LBP要慢很多很多 出现 Required leaf false alarm rate achieved. Branch training terminated. 表示训练成功
4. 使用OpenCV自动的级联分类器训练工具,训练样本数据
5. 得到最终的级联分类器数据(XML格式)
代码
#include "../common/common.hpp" static String facefile = "trainSample/haar/cascade.xml"; // LBP 与 HAAR 训练数据 static CascadeClassifier face_detector; void main(int argc, char** argv) { face_detector.load(getCVImagesPath(facefile)); Mat src = imread(getCVImagesPath("images/facedetection.png"), IMREAD_COLOR); imshow("src4-11", src); Mat gray; cvtColor(src, gray, COLOR_BGR2GRAY); equalizeHist(gray, gray); vector faces; face_detector.detectMultiScale(gray, faces, 1.1, 6, 0, Size(80, 80)); for (size_t t = 0; t (t)], Scalar(0, 0, 255), 2, 8, 0); } imshow("detect faces", src); waitKey(0); }
效果图
![43914c5cd03411a4e461d6fc28558ff1.png](https://img.php1.cn/3cd4a/1eebe/cd5/67cc2e96eddffff8.png)
End ![bf738ed87070d5ae02a760267caebd89.gif](https://img.php1.cn/3cd4a/1eebe/cd5/eec57030b649a106.webp)
声明:部分内容来源于网络,仅供读者学习、交流之目的。文章版权归原作者所有。如有不妥,请联系删除。