使用OpenCV进行小狗脸蛋识别
新鲜?不,还是换汤不换药,其实原理和人脸识别一样,只是换了一下识别模型而已。
基础知识可以回顾我之前写的文章:
OpenCV导入
OpenCV人脸检测
OpenCV竖屏检测
OpenCV人脸识别
狗脸识别,得现有训练模型的数据源:
链接:https://pan.baidu.com/s/1OxA6vGw5kvUs_V6GXVsnCg
提取码:ur82
识别器工具:
链接:https://pan.baidu.com/s/1my6NqIJ_MTLBulD29Az7-g
提取码:7fh4
首先,训练数据源,分为正样本和负样本。先区分正负样本的文件夹,结构如下:
cmd执行的指令
harresult训练集合生成的结果文件夹,需要自行创建
negative负样本文件夹
positive正样本文件夹
开始发车
(一)创建正负样本的目录说明文件
win电脑cmd窗口,可以输入dir/s/b>1.txt用于生成目录说明文件
(1)下图为正样本目录说明文件截图
第一列是图片路径;
第二列是图片中能检测出的样本表数量
第三第四列是图像的坐标,(0,0)就行;
第五第六列是图像宽和高,需要注意是一样的,宽高比需要一样的。
(2)下图为负样本目录说明文件截图
只需目录说明即可
(二)指令生成正样本vec训练文件,指令如下:
.\opencv_createsamples -info E:\work\opencvtrain\dog\test\positive\1.txt -vec E:\work\opencvtrain\dog\test\mysqmples_344.vec -num 100 -bgcolor 0 -bgthresh 0 -w 24 -h 24
执行截图如下:
(三)执行指令生成最后的训练集合
执行流程截图:
最后,在harresult文件夹,会生成训练所得文件,截图如下:
cascade.xml文件即为训练结果,可以作为OpenCV项目中的分类器构建时的数据源输入,从而检测相关数据。
备注:
1、注意正负目录描述文件的路径格式
2、注意我图片中,指令的相关目录,请结合实际理解
最后附上狗脸检测结果图片一张:
最后附上训练参数说明
【-info】 就是跟存放正样本图片目录位置相同的描述文件的路径,可用txt,dat等格式保存,每一行的内容为:xxx.jpg nums left_x left_y width heght。
比如:samples_1.jpg 1 0 0 20 20这样,就是指某个正样本是samples_1.jpg的图片,图片中有1个目标区域,区域的左上角坐标为(0,0),区域的宽度为20像素,长度为20像素。注意样本图片和这里的参数相符。
【-img】如果你要通过一张图片的扭曲形变成多张图片作为样本,就填写这个参数,参数的内容为要扭曲的图片的路径。填入后,-info参数不再有效。
【-vec】要生成用于训练的vec文件的路径,内容为:xxx/xxx/xxx/xxx.vec
【-bg】 如果省略,则使用bgcolor的值填充作为背景。就是跟存放负样本图片(背景图片)目录位置相同的描述文件的路径,可用txt,dat等格式保存,,每一行的内容为:xxx.jpg。这里要注意的是,不要填入图片的完整路径,不然会报错。但训练样本opencv_traincascade也需要传入一个-bg参数,但那个参数的描述文件每一行是要用完整路径的,这有点怪。
【-num】要创建的样本的数量,使用-info生成时,不要比你准备的正样本图片数量大就行了
【-bgcolor】这是创建样本是样本扭曲函数中用来决定像素是有效还是作为背景过滤的基本值,因为操作的是灰度图,所以这个值0范围是~255。
【-bgthresh】决定背景掩码的实际取值范围为bgcolor-bgthresh ——bgcolor-bgthresh
【-inv】【-randinv】这是样本生成时,是否需要反相或随机反相,这个在车牌这样的数字中就需要,比如说白底黑字的车牌和蓝底白字的车牌,两者生成的样本是相反的,前者数字是黑色,后者数字是白色。所以这个参数按你实际需要使用吧。
【-maxidev】一个用于生成前景(有效像素区域)灰度值的常数值,实际样本的前景灰度值会根据这个参数结合随机数产生多种不同的灰度值。
【-maxxangle】对样本图片的x轴方向的扭曲的最大弧度,X轴即是图片水平方向的旋转。
【-maxyangle】对样本图片的y轴方向的扭曲的最大弧度,Y轴即是图片竖直方向的旋转。
【-maxyangle】对样本图片的z轴方向的扭曲的最大弧度,Z轴即是垂直于图像平面的方向的旋转(可理解为旋转轴是一条穿过显示器的垂线)。
【-show】样本创建期间,是否通过imshow显示出每一个生成的样本图片出来。
【-w】要创建的样本图片的宽度,后面的训练样本步骤要使用和这时一样的值,不然会报错
【-h】要创建的样本图片的高度,后面的训练样本步骤要使用和这时一样的值,不然会报错
【-data】
训练的分类器的存储目录
【-vec 】
正样本文件,由open_createsamples.exe生成,正样本文件后缀名为.vec
【-bg】
负样本说明文件,主要包含负样本文件所在的目录及负样本文件名
【-numPos】
每级分类器训练时所用到的正样本数目,应小于vec文件中正样本的数目,具体数目限制条件为:numPos+(numStages-1) numPos(1-minHitRate)<=vec文件中正样本的数目
【-numNeg】
每级分类器训练时所用到的负样本数目,可以大于-bg指定的图片数目
【-numStages】
训练分类器的级数,强分类器的个数
【-precalcValBufSize】
缓存大小,用于存储预先计算的特征值,单位MB
【-precalcIdxBufSize 】
缓存大小,用于存储预先计算的特征索引,单位MB
【-baseFormatSave 】
仅在使用Haar特征时有效,如果指定,级联分类器将以老格式存储
【-stageType 】
级联类型,目前只能取BOOST
【-featureType】
训练使用的特征类型,目前支持的特征有Haar,LBP和HOG
【-w】
训练的正样本的宽度,Haar特征的w和h一般为20,LBP特征的w和h一般为24,HOG特征的w和h一般为64
【-h 】
训练的正样本的高
【-bt】
训练分类器采用的Adaboost类型,Adaboost分为Getle Adaboost,Real Adaboost,Discrete Adaboost,Logit Adaboost,训练中默认采用Getle Adaboost
【-minHitRate】
影响每个强分类器阈值,每一级分类器最小命中率,表示每一级强分类器对正样本的的分类准确率
【-maxFalseAlarm】
最大虚警率,影响弱分类器的阈值,表示每个弱分类器将负样本误分为正样本的比例,一般默认值为0.5
【-weightTrimRate】
0-1之间的阈值,影响参与训练的样本,样本权重更新排序后(从小到大),从前面累计权重小于(1-weightTrimRate)的样本将不参与下一次训练,一般默认值为0.95
【-maxDepth】
每一个弱分类器决策树的深度,默认是1,是二叉树(stumps),只使用一个特征。
【-maxWeakCount】
每级强分类器中弱分类器的最大个数,当FA降不到指定的maxFalseAlarm时可以通过指定最大弱分类器个数停止单个强分类器
【-Haar】
特征,CvHaarFeatureParams继承于CvFeatureParams
【-mode】
值为BASIC、CORE、ALL三种,根据值不同采用不同的Haar特征,BASIC是基本的Haar特征(垂直),CORE是所有的上下Haar特征,ALL是使用所有的Haar特征(包括垂直和45度)
【-LBP】
特征,CvLBPFeatureParams继承于CvFeatureParams
【-HOG】
特征,CvHOGFeatureParams继承于CvFeatureParams
that's all--------------------------------------------------------------------------------------------------------------