本文主要说明如何时候用opencv中自带的工具opencv_createsamples和opencv_traincascade训练adaboost + cascade模型
通过对原始数据集采样时给之前分错的数据更大的比例,使得每级分类器更加关注于前面分类器分错的数据。最后多个弱分类器联合起来,产生一个强分类器。
cascade通过若各干个 adaboost强分类器 串联得到一个新的分类器,只有所有的adaboost分类器都认为是positive,最终结果才是positive,否则都是negative,以此大幅降低FP rate,而TP rate基本不变。
二类分类器识别出是positive的可能有两种情况,一种是原本图像就是positive的,这种为TP(true positive),另一种是原本是negative的被错识别了,这种为FP(false positive)。
TP rate = TP的图片数 / positive的图片总数
FP rate = FP的图片数 / negative的图片总数
直观上理解,如果分类器宽松一点,那么不论正样本还是负样本都更容易通过分类器(被识别为positive),FP 和 TP 都会很大,反之有可能都会很小。cascade一定程度上可以解决这个矛盾。
numPos + (1-minHitRate) * numPos * (numStages - 1) + s <= 总的positve数据数
1). 由于所有的positive数据都存在于vec file中,所以所有的positive数据的数量就是vec文件中的数据数
2). 每一个stage删除的数据最大为(1-minHitRate) * numPos个
3). s 是skipped positive data就是因为图片质量不合格而被忽略的positive数据的数量
可以参考官方文档
1. http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html
2. http://docs.opencv.org/2.4.13/doc/user_guide/ug_traincascade.html#creating-training-set-as-a-collection-of-png-images
opencv_createsamples -img logo.png -bg bg.txt -info output/annotations.lst -maxxangle \
0.1 -maxyangle 0.1 -maxzangle 0.1 -num 100 -w 200 -h 200 -show
-img: 指定输入的logo图片
-bg: bg.txt里面每行记录着一个背景图片的相对路径(可以在背景图片数据集目录中使用 ls > bg.txt 生成)
-info: 指定生成的label文件的位置,注意必须要有一层父目录,不能是./annotations.lst
-maxxangle: 指定在x方向上的最大旋转角
-num: 指定生成的带logo图片的数量,因为logo图片可以旋转,插入背景图片的位置也不确定,所以这个数可以大于背景图片数量
-w -h: logo图片被放缩到的宽和高
-show: 一张一张显示生成的图片,会把整个背景图和插入的logo图片一起显示出来,点击图片后按ESC退出查看
opencv_createsamples -img logo.png -bg bg.txt -info output/annotations.lst -maxxangle \
0.1 -maxyangle 0.1 -maxzangle 0.1 -num 2 -w 200 -h 200 -show -pngout
opencv_createsamples -img logo.png -bg bg.txt -vec img.vec -maxxangle 0.1 -maxyangle \
0.1 -maxzangle 0.1 -num 100 -show
opencv_createsamples -info info.dat -vec pos.vec -num 111
info.dat的格式如下:
pos/img1.jpg 1 140 100 45 45
pos/img2.jpg 2 100 200 50 50 50 30 25 25
每一行代表一张图片,第一列是图片相对info.dat文件的相对路径,第二列是该图片里有多少个需识别的物体(ROI),
后面每四列表示一个ROI的rect区域(左上角x, 左上角y, weight, height)
5. 显示vec文件中的内容
opencv_createsamples -vec pos.vec
# 参数
# [-info ] 记录生成图片对应的的annotation文件位置,记录生成的pos图片中log.png插入的位置.
注意该文件必须指定到上一层目录,比如/home/user/output/annotations.lst 或者 output/annotations.lst,
而不能./annotations.lst. 不指定将不会生成
# [-img ] 只包含要识别的object的小图片,就是将该图片插入背景图片中
# [-vec ] 生成的.vec文件的名称,默认不生成。是opencv_traincascade. opencv_traincascade 输入文件的格式
# [-bg ]
# [-num ]生成图片的个数,默认一个bg生成一个
# [-bgcolor ]
# [-inv] [-randinv] [-bgthresh ]
# [-maxidev ] 亮度参数
# [-maxxangle ] object最大的x方向上旋转的角度
# [-maxyangle ]
# [-maxzangle ]
# [-show []] 是否显示生成图片,默认不显示
# [-w ] 生成图片的大小w
# [-h ]
# [-pngoutput] 是否生成png图片,默认生成jpg格式的图片
# 准备的文件只有背景图片和指定它们路径的bg.txt以及object的图片logo.png
# 生成文件和是否使用-pngout参数相关,具体参考官方说明
使用它训练 adaboost + cascade 的模型
下面是个最简单的使用,这几个参数一般是一定要使用的
opencv_traincascade -data model/ -vec plane.vec -bg bg.txt -numPos 6750 -numNeg 6750
-data: 生成的模型和记录每个stage的xml文件(可以断点继续训练)的目录,不存在会报错
-vec: postive图片集生成的vec文件
-bg: 和前面的一样,用于指定背景图片集(negative)位置的文件,每一行是一个图片的相对位置
-numPos: 每个stage(cascade的一级即一个adaboost强分类器)中参与训练的正样本数量,要满足上面所说的公式
-numNeg: 每个stage中参与训练的负样本的数量,负样本是从bg.txt中指定的背景图片中截取的,所以大小可以比背景图片的总数大
然后可以看到输出
---------------------------------------------------------------------------------
PARAMETERS:
cascadeDirName: model/
vecFileName: plane.vec
bgFileName: bg.txt
numPos: 6750
numNeg: 6750
numStages: 20
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
以上各参数除了指定的几个以外都是默认值,含义可以参见 参数说明
官方文档
# -data: 生成的模型和记录每个stage的xml文件(可以断点继续训练)的目录,不存在会报错
# -vec: postive图片集生成的vec文件
# -bg: 和前面的一样,用于指定背景图片集(negative)位置的文件,每一行是一个图片的相对位置
# -numPos: 每个stage(cascade的一级即一个adaboost强分类器)中参与训练的正样本数量,要满足公式:
# numPos + (1-minHitRate) * numPos * (numStages - 1) + s <= 总的positve数据数
# -numNeg: 每个stage中参与训练的负样本的数量,负样本是从bg.txt中指定的背景图片中截取的,所以大小可以比背景图片的总数大
# [-numStages ] cascade的级数
# [-precalcValBufSize ] 缓存大小,用于存储预先计算的特征值
# [-precalcIdxBufSize ] 缓存大小,用于存储预先计算的特征索引
# [-baseFormatSave] 是否保存按opencv_haarcascade的格式(old format)保存model文件
# [-acceptanceRatioBreakValue = -1>]
#--cascadeParams--
# [-stageType ] 级别(stage)参数。目前只支持将BOOST分类器作为级别的类型。
# [-featureType <{HAAR(default), LBP, HOG}>] 提取的特征类型
# [-w ] 训练窗口的大小,必须跟vec中训练样本的大小一致
# [-h ]
#--boostParams--
# [-bt <{DAB, RAB, LB, GAB(default)}>] adaboost的种类
# [-minHitRate = 0.995>] adaboost要达到的min TP rate
# [-maxFalseAlarmRate ] adaboost要达到的max FP rate
# [-weightTrimRate ] 影响参与训练的样本,不管是正样本还是负样本,当更新完样本权重之后,
# 将样本权重按照从小到大的顺序排列,当从后累加样本权重不小于weightTrimWeight时前面的样本就不参与后面的训练了
# [-maxDepth ] adaboost里每个弱分类器(决策树)的最大深度
# [-maxWeakCount ] adaboost里弱分类器的最大个数
#--haarFeatureParams--
# [-mode
# ALL 使用所有右上特征和45度旋转特征
#--lbpFeatureParams--
#--HOGFeatureParams--
当 opencv_traincascade 程序训练结束以后,训练好的级联分类器将存储于文件cascade.xml中,这个文件位于 -data 指定的目录中。这个目录中的其他文件是训练的中间结果,当训练程序被中断后,再重新运行训练程序将读入之前的训练结果,而不需从头重新训练。训练结束后,你可以删除这些中间文件。
http://blog.csdn.net/liulina603/article/details/8479338
http://blog.csdn.net/xidianzhimeng/article/details/42147601
http://blog.csdn.net/njzhujinhua/article/details/38377191
http://docs.opencv.org/2.4.13/modules/ml/doc/boosting.html
http://www.cnblogs.com/jcchen1987/p/4581651.html
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html
http://docs.opencv.org/2.4.13/modules/ml/doc/boosting.html
<<统计学习方法>> adaboost
<<机器学习实战>> adaboost