OpenCV自带的训练工具:E:/opencv/opencv-3.1.0/build/x64/vc14/bin/opencv_createsamples.exe 创建正样本的工具
E:/opencv/opencv-3.1.0/build/x64/vc14/bin/opencv_traincascade.exe 训练级联分类器的工具,训练出来的级联数据文件也是一个xml的文件
(E:/opencv/project/workspace_vs/OpenCV310Sources_contrib/install/x64/vc14/bin下的工具的名称后都多带了一个 d )
负样本的数量不要小于正样本的数量(5倍正样本数),如果训练的是人脸,那么负样本的图片不要带人脸就行
基本流程:
1. 收集样本数据 – 包括正负样本
以人脸检测为例 –公开的数据库有 (可以去下载,但是不精确)
正向样本数目 (可以在视频中采集人脸)
负样本数目 (也可以在不出现人脸的视频中采集,负样本最好包罗万象)
正向样本的大小 – 统一尺寸 (图片宽高可以不一样,但是宽高比必须是1:1)
正向样本图片中的背景问题 (背景没处理好,会影响训练的效果)
2. 数据规范化 – 大小、格式
3. 生成vec文件与负样本列表文本文件
.\project\workspace_vs\OpenCV310Sources_contrib\install\x64\vc14\bin>opencv_createsamplesd.exe
Usage: opencv_createsamplesd.exe
[-info <collection_file_name>] // 收集的文件的路径
[-img <image_file_name>]
[-vec <vec_file_name>] // 在vec_file_name目录下生成vec文件
[-bg <background_file_name>] // 上面提到的背景问题,可以通过这个解决
[-num <number_of_samples = 1000>] // 样本数
[-bgcolor <background_color = 0>] // 背景颜色
[-inv] [-randinv] [-bgthresh <background_color_threshold = 80>]
[-maxidev <max_intensity_deviation = 40>] // 最大的灰度方差,默认40
[-maxxangle <max_x_rotation_angle = 1.100000>] // 如果样本图像有旋转,可以使用这三个参数来旋转,有默认值
[-maxyangle <max_y_rotation_angle = 1.100000>]
[-maxzangle <max_z_rotation_angle = 0.500000>]
[-show [<scale = 4.000000>]]
[-w <sample_width = 24>] // 输出的样本图像的宽高
[-h <sample_height = 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> // 在cascade_dir_name目录下生成级联数据文件
-vec <vec_file_name> // 传入上面创建好的vec文件
-bg <background_file_name> // 负样本文件(bg.txt与img文件夹),需要放到与 opencv_traincascaded.exe 命令同目录,绝对路径不可以?
[-numPos <number_of_positive_samples = 2000>] // 每个训练(stage)时的正样本数,不要大于等于总正样本数
[-numNeg <number_of_negative_samples = 1000>] // 负样本数,可以大于总负样本数,大于的时候opencv会自动从负样本图像中切一部分区域出来,所以负样本图像尺寸最好找大一点的
[-numStages <number_of_stages = 20>] // stage数
[-precalcValBufSize <precalculated_vals_buffer_size_in_Mb = 1024>]
[-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb = 1024>]
[-baseFormatSave]
[-numThreads <max_number_of_threads = 5>]
[-acceptanceRatioBreakValue <value> = -1>]
--cascadeParams--
[-stageType <BOOST(default)>] // 对应级联数据文件中的stageType标签,只有 BOOST ?
[-featureType <{HAAR(default), LBP, HOG}>] // 特征类型 HAAR(default), LBP, HOG 三个选择
[-w <sampleWidth = 24>] // 与上面的 opencv_createsamplesd.exe 命令的 -w -h 要一致
[-h <sampleHeight = 24>]
--boostParams--
[-bt <{DAB, RAB, LB, GAB(default)}>] // Boost算法
[-minHitRate <min_hit_rate> = 0.995>] // 最小命中率,比如有1000个正样本,如果此值为0.995,那么会有5个正样本不会被训练
[-maxFalseAlarmRate <max_false_alarm_rate = 0.5>] // 虚警率,度量检测器对负样本的通过能力,显然越接近0越好。每一个stage的minHitRate必须非常高(>=0.995)!而maxFalseAlarmRate则可以“温和”一些
[-weightTrimRate <weight_trim_rate = 0.95>]
[-maxDepth <max_depth_of_weak_tree = 1>]
[-maxWeakCount <max_weak_tree_count = 100>] // 弱分类器数,如果用100个还训练不出来就不要训练了。。
--haarFeatureParams--
[-mode <BASIC(default) | CORE | ALL // 上面的 featureType 选用Haar时会用到, BASIC仅仅使用垂直特征, ALL表示使用垂直以及45度旋转特征
--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<Rect> faces;
face_detector.detectMultiScale(gray, faces, 1.1, 6, 0, Size(80, 80));
for (size_t t = 0; t < faces.size(); t++)
{
rectangle(src, faces[static_cast<int>(t)], Scalar(0, 0, 255), 2, 8, 0);
}
imshow("detect faces", src);
waitKey(0);
}
效果图