使用OpenCV训练级联分类器

       虽然opencv已经自带了人脸、嘴巴、鼻子等分类器,但工作中有时候由于项目需要,还是需要自己训练分类器,最近我做了一下这方面工作,现在把训练分类器的过程写出来,希望对打算做这方面工作的同学有帮助。我主要参考了这篇文章。先介绍下我的工作环境,windows 7 + opencv243,下面是我的工作目录:
                                                使用OpenCV训练级联分类器_第1张图片
由于这里我的opencv是debug版本的,所以所有文件名都是d结尾,如果opencv是release版本就好了。当然,这并不影响训练,只是debug版本会耗时些。
       1. 搜集样本
       样本分两种:正样本和负样本。正样本即所要检测的目标物(如人脸、嘴巴等),负样本指其他任意图片,只要与正样本相异即可。创建样本这个过程比较耗时,如果以学习为目的,随便玩玩,那就自己写程序截图或者手动截个几十张图作为样本,如果工作上使用,得需要上千张正、负样本,那就得由专人去搜集、整理样本了。
       详细步骤:
       (1)搜集的所有样本(正、负样本)应该统一尺寸,如24*24、30*30等;
       (2)将正、负样本分别放置两个文件夹,如下图所示。本次训练中,我选择的正样本为闭嘴吧图片,负样本为张嘴巴图片,不过训练后的结果不是很理想。
                                                           使用OpenCV训练级联分类器_第2张图片
                                           使用OpenCV训练级联分类器_第3张图片      使用OpenCV训练级联分类器_第4张图片
       (3)为正样本创建描述文件。打开命令行,进入正样本目录,命令如下图所示:
                                           使用OpenCV训练级联分类器_第5张图片 
回车运行后,打开正样本目录,发现该目录下多了一个文本文件,这个文件就是上述命令创建的样本描述文件。
                                  使用OpenCV训练级联分类器_第6张图片
打开该文件后,使用替换功能将所有jpg替换为jpg 1 0 0 30 30,1为正样本标识,(0,0)表示起始坐标,(30,30)为样本宽、高。另外记得删除最后一行的“pos_info.txt”,保存退出即可。至此,正样本描述文件创建完毕,如下图所示:
                                                     使用OpenCV训练级联分类器_第7张图片  
       (4)为负样本创建集合文件。该步骤较简单,首先进入该目录下,然后输入与上面同样的命令,回车运行后,打开负样本目录,即可发现刚刚创建的文本文件,打开后不用做其他操作,删除最后一行“neg_info.txt”后保存退出即可。如下图所示:
                                            使用OpenCV训练级联分类器_第8张图片
       2. 创建样本
       opencv自带有创建样本的程序,命令如下图:
                                     使用OpenCV训练级联分类器_第9张图片
这里我的样本数为80,样本宽为30,高为30,生成的文件为my.vec。该命令还有其他可选参数,我没有再去看,大家有兴趣的可以研究下。这个就是刚创建的vec文件,如下图所示:
                                                         使用OpenCV训练级联分类器_第10张图片
       3. 训练分类器
       命令如下图所示:
                                    
上面命令中,-npos 80为正样本数量,-nneg 112为负样本数量,-nstages 4为训练的分类器级数,-mem 512为缓存大小,-w 30为样本宽,-h 30为样本高。本着玩玩的心态,其他参数详细内容没有再去查。 当出现如下界面时,即训练结束了。
                                                                              使用OpenCV训练级联分类器_第11张图片
在当前目录下可以发现多了一个data.xml文件,即为训练结果,该结果可以使用OpenCV CascadeClassifier的load()函数加载使用了。当样本很多时,这个训练过程非常耗时。
                                                                                  使用OpenCV训练级联分类器_第12张图片



你可能感兴趣的:(图像处理,/,特效,/,滤镜)