以下是我参考的几个人脸分类器的文章:
http://blog.csdn.net/yangleo1987/article/details/52883864
http://m.blog.csdn.net/duhaomin/article/details/10155813
http://blog.csdn.net/autoliuweijie/article/details/51911289
训练工作主要分为如下几步:
- 配置训练环境
- 制作训练数据集
- 生成正样本描述文件(.vec)
- 训练身份证分类器
- 使用分类器进行身份证识别分类
配置训练环境
训练过程主要依靠OpenCV自带的两个可执行程序opencv_createsamples.exe和opencv_haartraining.exe操作完成的。可以直接下载我已经配置好的文件进行训练。文件地址为:http://download.csdn.net/download/u010782875/10033202
文件目录如下:
id_24x16_10目录:新建的一个目录,存放之后训练生成的分类器文件
negdata目录:存放负样本的目录
posdata目录:存放正样本的目录
negdata.txt:负样本的文件路径
posdata24x16.txt:正样本的文件路径
posdata24x16.vec:生成的正样本描述文件
opencv_createsamples.exe:生成正样本描述文件的可执行程序
opencv_haartraining.exe:训练样本的可执行程序
制作训练数据集
将要训练的正样本放入posdata目录,这里为身份证图片,像素大小为24x16(经多次尝试该尺寸效果最佳);将负样本放入negdata目录下,负样本的像素尺寸要大于正样本,正负样本比例1:3效果最佳。我这里使用了110张正样本和300张负样本。
接下来需要正负样本的文件路径,用于训练中找到每个样本。进入正负样本目录,新建一个文本文档num.bat,内容如下。
双击运行后生成当前图片的绝对路径,然后将正样本的路径格式进行如下替换(负样本路径文件可不做修改):
将绝对路径改为相对路径,然后添加的1代表个数,后面四个分别表示样本的left top width height
生成正样本描述文件
打开cmd.exe,进入上述目录,然后运行指令:opencv_createsamples.exe -info posdata24x16.txt -vec posdata24x16.vec -num 110 -w 24 -h 16
-info 样本说明文件
-vec 正样本描述文件的名字及路径
-num 样本数量
-w-h 样本尺寸大小
执行结束后将生成正样本描述文件posdata24x16.vec
训练身份证分类器
接着执行指令:opencv_haartraining.exe -data id_24x16_10 -vec posdata24x16.vec -bg negdata.txt -npos 110 -nneg 300 -nstages 10 -nsplits 1 -sym -w 24 -h 16 -mode all -mem 1024
这里用到了OpenCV自带的工具opencv_haartraining.exe,该工具封装了haar特征提取以及adaboost分类器训练过程,并合并各级分类器成为最终的xml文件
-data 指定生成的文件目录,用于存放各级分类器文件
-vec 正样本描述文件
-bg 负样本路径文件
-npos 每个阶段用来训练的正样本数目
-nneg 每个阶段用来训练的负样本数目
-nstages 指定训练层数,层数越高,识别粒度越小,耗时越长
-nsplits 分裂子节点数目,1表示使用简单地stump classifier分类
-sys 后面不用跟其他参数,用于指定目标对象是否垂直对称
-mode all指定haar特征的种类,basic仅仅使用垂直特征,all表示使用垂直特征以及45度旋转特征
-mem 表示允许使用计算机的1024M内存进行训练
运行结束后,目录下会生成最终的xml文件
使用分类器进行身份证识别分类
将生成的xml文件放到相关项目中(这里放在安卓客户端验证),分类结果如下: