环境:win10,OpenCV3.2.0
用到的工具:opencv_createsamples.exe、opencv_traincascade.exe(有些版本是opencv_haartraining.exe),这两个工具在opencv的安装路径下。
整个过程分成三阶段:样本采集、分类器训练和运用训练好的分类器进行人脸检测。
一、样本采集
(1)收集训练样本
训练样本包括正样本和负样本。正样本,通俗点说,就是图片中只有你需要的目标。而负样本的图片只要其中不含有目标就可以了。但需要说明的是,负样本也并非随便选取的,最好是与检测目标相关的图片。例如,你需要检测的目标是汽车,那么正样本就应该是仅仅含有汽车的图片,而负样本显然不能是一些包含天空、海洋等风景的图片,因为最终训练分类器的目的是检测汽车,而汽车应该出现在马路上。也就是说,分类器最终检测的图片应该是那些包含马路,交通标志,建筑物,广告牌,汽车,摩托车,三轮车,行人,自行车等在内的图片。很明显,这里的负样本应该是包含摩托车、三轮车、自行车、行人、路面、灌木丛、花草、交通标志、广告牌等的图片。
需要注意的是,adaboost方法是机器学习中的一个经典算法,而机器学习算法的前提条件是,测试样本和训练样本独立同分布。所谓的独立同分布,可以简单理解为:训练样本要和最终的应用场合非常接近或者一致。否则,基于机器学习的算法并不能保证算法的有效性。此外,足够的训练样本(至少得几千张正样本、几千张负样本)也是保证训练算法有效性的一个前提条件。
(2)正样本尺寸归一化
将上一步收集到的正样本进行尺寸归一化,尺寸归一化的目的是将所有的图片都缩放到同一大小,比如,缩放到20*20的大小,可以用批量编辑工具,批量将图片改成同一尺寸。
(3)建立正负样本说明文件
利用命令行,运行生成正样本图片名描述文件,打开pos.txt删除非图片名的行;同样的方法建立负样本名描述文件neg.txt,注意删除非图片名的行,每一行为一个文件名,负样本图像可以是不同的尺寸,但是图像尺寸应该比训练窗口的尺寸大,因为这些图像将被用于抠取负样本。
D:\OpenCV\MyProject\flq\pic\face\face\posdata>dir /b >pos.txt
D:\OpenCV\MyProject\flq\pic\face\face\negdata>dir /b >neg.txt
打开pos.txt删除最后一行“pos.txt”,并编辑文本内容,如下:
这里1表示当前图片重复出现的次数是1, 0 0 20 20表示目标图片大小是矩形框从(0,0)到(20,20)。
接着打开neg.txt,删除最后一行“neg.txt”。
二、分类器训练
(1)创建正样本.vec文件
D:\OpenCV\opencv\build_new\install\bin>opencv_createsamplesd.exe -info posdata\pos.txt -vec pos.vec -num 18587 -w 20 -h 20
其中命令行参数含义为:
-info
描述物体所在图像以及大小位置的描述文件
-vec
训练好的正样本的输出文件名。
-num
要产生的正样本的数量,和正样本图片数目相同。
-w
输出样本的宽度(以像素为单位)
-h《sample_height》
输出样本的高度,以像素为单位。
(2)开始训练级联分类器
注意正样本图片、pos.txt、pos.vec、负样本图片、neg.txt、opencv_createsamples.exe、opencv_traincascade.exe之间路径的关系。
D:\OpenCV\opencv\build_new\install\bin>opencv_traincascaded.exe -data xml -vec pos.vec -bg neg.txt -numPos 6996 -numNeg 10926 -numStages 20 -precalcValbufSize 200 -precalcdxBufSize 1000 -featureType LBP -w 20 -h 20 -minHitRate 0.995 -maxFalseAlarmRate 0.5 -weightTrimRate 0.95 -maxDepth 1 -maxWeakCount 100 -mode ALL
下面是 opencv_traincascade 的命令行参数,以用途分组介绍:
1.通用参数:
-data
目录名,如不存在训练程序会创建它,用于存放训练好的分类器。
-vec
包含正样本的vec文件名(由 opencv_createsamples 程序生成)。
-bg
背景描述文件,也就是包含负样本文件名的那个描述文件。
-numPos
每级分类器训练时所用的正样本数目。
-numNeg
每级分类器训练时所用的负样本数目,可以大于 -bg 指定的图片数目。
-numStages
训练的分类器的级数。
-precalcValBufSize
缓存大小,用于存储预先计算的特征值(feature values),单位为MB。
-precalcIdxBufSize
缓存大小,用于存储预先计算的特征索引(feature indices),单位为MB。内存越大,训练时间越短。
-baseFormatSave
这个参数仅在使用Haar特征时有效。如果指定这个参数,那么级联分类器将以老的格式存储。
2.级联参数:
-stageType< BOOST(default) >
级别(stage)参数。目前只支持将BOOST分类器作为级别的类型。
-featureType<{HAAR(default), LBP}>
特征的类型: HAAR - 类Haar特征; LBP - 局部纹理模式特征。
-w
-h
训练样本的尺寸(单位为像素)。必须跟训练样本创建(使用 opencv_createsamples 程序创建)时的尺寸保持一致。
3.Boosted分类器参数:
-bt <{DAB, RAB, LB, GAB(default)}>
Boosted分类器的类型: DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost。
-minHitRate
分类器的每一级希望得到的最小检测率。总的检测率大约为 min_hit_rate^number_of_stages。
-maxFalseAlarmRate
分类器的每一级希望得到的最大误检率。总的误检率大约为 max_false_alarm_rate^number_of_stages.
-weightTrimRate
Specifies whether trimming should be used and its weight. 一个还不错的数值是0.95。
-maxDepth
弱分类器树最大的深度。一个还不错的数值是1,是二叉树(stumps)。
-maxWeakCount
每一级中的弱分类器的最大数目。The boosted classifier (stage) will have so many weak trees (<=maxWeakCount), as needed to achieve the given -maxFalseAlarmRate.
4.类Haar特征参数:
-mode< BASIC (default) | CORE | ALL >
选择训练过程中使用的Haar特征的类型。 BASIC 只使用右上特征, ALL 使用所有右上特征和45度旋转特征。
5.LBP特征参数:
LBP特征无参数。
命令参数中numPos的计算方式:
number >= (numPos + (numStages-1) * (1 – minHitRate) * numPos) + S
number为正样本数量,S为负样本数量。
样本库下载:
https://download.csdn.net/download/qq_24797613/10619741