虽然opencv已经自带了人脸、嘴巴、鼻子等分类器,但工作中有时候由于项目需要,还是需要自己训练分类器,最近我做了一下这方面工作,现在把训练分类器的过程写出来,希望对打算做这方面工作的同学有帮助。我主要参考了这篇文章。先介绍下我的工作环境,windows 7 + opencv243,下面是我的工作目录:

                                                

opencv二分类 opencv分类器使用_训练分类器

由于这里我的opencv是debug版本的,所以所有文件名都是d结尾,如果opencv是release版本就好了。当然,这并不影响训练,只是debug版本会耗时些。

       1. 搜集样本

       样本分两种:正样本和负样本。正样本即所要检测的目标物(如人脸、嘴巴等),负样本指其他任意图片,只要与正样本相异即可。创建样本这个过程比较耗时,如果以学习为目的,随便玩玩,那就自己写程序截图或者手动截个几十张图作为样本,如果工作上使用,得需要上千张正、负样本,那就得由专人去搜集、整理样本了。

       详细步骤:

       (1)搜集的所有样本(正、负样本)应该统一尺寸,如24*24、30*30等;

       (2)将正、负样本分别放置两个文件夹,如下图所示。本次训练中,我选择的正样本为闭嘴吧图片,负样本为张嘴巴图片,不过训练后的结果不是很理想。

                                                          

opencv二分类 opencv分类器使用_描述文件_02

                                          

opencv二分类 opencv分类器使用_文本文件_03

     

opencv二分类 opencv分类器使用_描述文件_04

       (3)为正样本创建描述文件。打开命令行,进入正样本目录,命令如下图所示:

                                          

opencv二分类 opencv分类器使用_训练分类器_05

 

回车运行后,打开正样本目录,发现该目录下多了一个文本文件,这个文件就是上述命令创建的样本描述文件。

                                 

opencv二分类 opencv分类器使用_opencv二分类_06

打开该文件后,使用替换功能将所有jpg替换为jpg 1 0 0 30 30,1为正样本标识,(0,0)表示起始坐标,(30,30)为样本宽、高。另外记得删除最后一行的“pos_info.txt”,保存退出即可。至此,正样本描述文件创建完毕,如下图所示:

                                                    

opencv二分类 opencv分类器使用_描述文件_07

  

       (4)为负样本创建集合文件。该步骤较简单,首先进入该目录下,然后输入与上面同样的命令,回车运行后,打开负样本目录,即可发现刚刚创建的文本文件,打开后不用做其他操作,删除最后一行“neg_info.txt”后保存退出即可。如下图所示:

                                           

opencv二分类 opencv分类器使用_训练分类器_08

       2. 创建样本

       opencv自带有创建样本的程序,命令如下图:

                                    

opencv二分类 opencv分类器使用_描述文件_09

这里我的样本数为80,样本宽为30,高为30,生成的文件为my.vec。该命令还有其他可选参数,我没有再去看,大家有兴趣的可以研究下。这个就是刚创建的vec文件,如下图所示:

                                                        

opencv二分类 opencv分类器使用_opencv二分类_10

       3. 训练分类器

       命令如下图所示:

                                    

opencv二分类 opencv分类器使用_文本文件_11

当出现如下界面时,即训练结束了。

                                                                              

opencv二分类 opencv分类器使用_文本文件_12

在当前目录下可以发现多了一个data.xml文件,即为训练结果,该结果可以使用OpenCV CascadeClassifier的load()函数加载使用了。当样本很多时,这个训练过程非常耗时。

                                                                                 

opencv二分类 opencv分类器使用_训练分类器_13