现在的位置: 首页 > 综合 > 正文

基于opencv2.0的haar算法以人脸识别为例的训练分类器xml的方法

2017年12月21日 ⁄ 综合 ⁄ 共 12063字 ⁄ 字号 评论关闭

第一步 采集样本
       1、 将正负样本分别放在两个不同的文件夹下面
        分别取名pos和neg,其中pos用来存放正样本图像,neg用来存放负样本
  

 

 

 


注意事项:1、正样本要统一切成24*24像素(或者其他)的格式,建议保存成灰度图,节省空间
                    2、正样本的数目越多,训练的时间也将越长,训练出来的效果也就越好
                    3、负样本的数量想对于正样本一定要足够的多,很多朋友在训练的时候,往往出现了CPU占用率达到了100%,但是训练只是停留在一个分类器长达几小时没有相应,问题出现在取负样本的那个函数 icvGetHaarTrainingDataFromBG中; 当剩下所有的negtive样本在临时的cascade Classifier中,evaluate的结果都是0(也就是拒绝了),随机取样本的数目到几百万都是找不到误检测的neg样本了,因而没法跳出循环
       2、建立正负样本的说明文件
                  这里我们假定根目录在D:\boost下面 。
                  在cmd下面进入pos目录,输入  dir /b > pos.txt

 

 

 

 

 

 

这个时候会在pos文件加下面生成一个pos.txt文件,打开pos.txt

 

 

 

 

我们对它进行如下编辑:
(1)、将BMP 替换成为 BMP 1 0 0 24 24
注意:1代表此图片出现的目标个数 后面的 0 0 24 24代表目标矩形框(0,0)到(24,24),用户可以根据自身需要调整数值
(2)、删除文本中最后一行的“pos.txt”

 

 

 

 

 

 

 

 

 

 

2、对负样本进行编辑
在CMD下输入 dir /b > neg.txt

同理,打开neg目录下的neg.txt文件,只需要删除最后一行的neg.txt这一句
注意:1、负样本说明文件不能含有目标物体
2、负样本图像尺寸不受到限制,但是尺寸越大,训练所用的时间越长,
3、负样本图像可以是灰度图,也可以不是,笔者建议使用灰度图,这样处理起来可能更有效率
4、负样本图像一定不要重复,增大负样本图像的差异性,可以增加分类器的使用范围,笔者建议可以使用网上的素材库,将1000多张不含目标的图片灰度处理后用来训练,效果更佳
二、使用opencv_createsamples.exe创立样本VEC文件
1、首先我们将要用的的2个程序opencv_createsamples.exe和opencv_haartraining.exe拷到根目录下

在CMD下输入如下命令:
opencv_createsamples.exe -vec pos.vec -info pos\pos.txt -bg neg\neg.txt -w 40 -h 40 -num 142 
以上参数的含义如下:
-vec <vec_file_name>
训练好的正样本的输出文件名。
-img<image_file_name>
源目标图片(例如:一个公司图标)
-bg<background_file_name>
背景描述文件。
-num<number_of_samples>
要产生的正样本的数量,和正样本图片数目相同。
-bgcolor<background_color>
背景色(假定当前图片为灰度图)。背景色制定了透明色。对于压缩图片,颜色方差量由bgthresh
参数来指定。则在bgcolor-bgthresh 和bgcolor+bgthresh 中间的像素被认为是透明的。
-bgthresh<background_color_threshold>
-inv
如果指定,颜色会反色
-randinv
如果指定,颜色会任意反色
-maxidev<max_intensity_deviation>
背景色最大的偏离度。
-maxangel<max_x_rotation_angle>
-maxangle<max_y_rotation_angle>,
-maxzangle<max_x_rotation_angle>
最大旋转角度,以弧度为单位。
-show
如果指定,每个样本会被显示出来,按下"esc"会关闭这一开关,即不显示样本图片,而创建过程
继续。这是个有用的debug 选项。
-w<sample_width>
输出样本的宽度(以像素为单位)
-h《sample_height》
输出样本的高度,以像素为单位。

按下回车后我们的正样本

三、使用opencv_haartraing.exe进行训练
参数说明如下:
Haartraining 的命令行参数如下:
-data<dir_name>存放训练好的分类器的路径名。
-vec<vec_file_name>正样本文件名(由trainingssamples 程序或者由其他的方法创建的)
-bg<background_file_name>背景描述文件。
-npos<number_of_positive_samples>,
-nneg<number_of_negative_samples>用来训练每一个分类器阶段的正/负样本。合理的值是:
-nPos = 7000;nNeg = 3000-nstages<number_of_stages>训练的阶段数。
-nsplits<number_of_splits>决定用于阶段分类器的弱分类器。
如果1,则一个简单的stump classifier 被使用。如果是2 或者更多,则带有number_of_splits 个内部节点的CART 分类器被使用。
-mem<memory_in_MB>预先计算的以MB 为单位的可用内存。内存越大则训练的速度越快。-sym(default)-nonsym指定训练的目标对象是否垂直对称。垂直对称提高目标的训练速度。例如,正面部是垂直对称的。
-minhitrate《min_hit_rate》每个阶段分类器需要的最小的命中率。总的命中率为min_hit_rate 的number_of_stages 次方。
-maxfalsealarm<max_false_alarm_rate>没有阶段分类器的最大错误报警率。总的错误警告率为max_false_alarm_rate 的number_of_stages 次方。
-weighttrimming<weight_trimming>指定是否使用权修正和使用多大的权修正。一个基本的选择是0.9-eqw
-mode<basic(default)|core|all>选择用来训练的haar 特征集的种类。basic 仅仅使用垂直特征。all 使用垂直和45 度角旋转特征。-w《sample_width》-h《sample_height》训练样本的尺寸,(以像素为单位)。必须和训练样本创建的尺寸相同
在CMD下输入opencv_haartraining.exe -data xml -vec pos.vec -bg neg\neg.txt -w 40 -h 40 -mem 800  

然后开始训练
训练过程如图,呵呵,要是成百上千的样本的话,我们先去吃完泡面休息一下吧

好了,休息回来,训练完成提示信息如下:

在根目录下就会生成相应的XML文件

 

 

人脸数据库汇总

■Annotated Database (Hand, Meat, LV Cardiac, IMM face) (http://www2.imm.dtu.dk/~aam/)
■AR Face Database (http://cobweb.ecn.purdue.edu/~aleix/aleix_face_DB.html)
■BioID Face Database (http://www.bioid.com/downloads/facedb/index.php)
■Caltech Computational Vision Group Archive (Cars, Motorcycles, Airplanes, Faces, Leaves, Background) (http://www.vision.caltech.edu/html-files/archive.html)
■Carnegie Mellon Image Database (motion, stereo, face, car, ...) (http://vasc.ri.cmu.edu/idb/)
■CAS-PEAL Face Database (http://www.jdl.ac.cn/peal/index.html)
■CMU Cohn-Kanade AU-Coded Facial Expression Database (http://www.ri.cmu.edu/projects/project_421.html
■CMU Face Detection Databases (http://www.ri.cmu.edu/projects/project_419.html)
■CMU Face Expression Database (http://amp.ece.cmu.edu/projects/FaceAuthentication/download.htm)
■CMU Face Pose, Illumination, and Expression (PIE) Database (http://www.ri.cmu.edu/projects/project_418.html)
■CMU VASC Image Database (motion, road sequences, stereo, CIL’s stereo data with ground truth, JISCT, face, face expressions, car) (http://www.ius.cs.cmu.edu/idb/)
■Content-based Image Retrieval Database (http://www.cs.washington.edu/research/imagedatabase/groundtruth/)
■Face Video Database of the Max Planck Institute for Biological Cybernetics (http://vdb.kyb.tuebingen.mpg.de/)
■FERET Database (http://www.frvt.org/)
■FERET Color Database (http://www.itl.nist.gov/iad/humanid/colorferet/home.htmlhttp://face.nist.gov/colorferet/ )
■Georgia Tech Face Database (http://www.anefian.com/face_reco.htm)
■German Fingerspelling Database (http://www.anefian.com/face_reco.htm )
■Indian Face Database (http:// www.cs.umass.edu/~vidit/IndianFaceDatabase)
■MIT-CBCL Car Database (http://cbcl.mit.edu/software-datasets/CarData.html)
■MIT-CBCL Face Recognition Database (http://cbcl.mit.edu/software-datasets/heisele/facerecognition-database.html)
■MIT-CBCL Face Databases (http://cbcl.mit.edu/software-datasets/FaceData2.html)
■MIT-CBCL Pedestrian Database (http://cbcl.mit.edu/software-datasets/PedestrianData.html)
■MIT-CBCL Street Scenes Database (http://cbcl.mit.edu/software-datasets/streetscenes/)
■NIST/Equinox Visible and Infrared Face Image Database (http://www.equinoxsensors.com/products/HID.html)
■NIST Fingerprint Data at Columbia (Link)
■ORL Database of Faces (http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html)
■Rutgers Skin Texture Database (http://www.caip.rutgers.edu/rutgers_texture/)
■The Japanese Female Facial Expression (JAFFE) Database (http://www.kasrl.org/jaffe.html
■The Ohio State University SAMPL Image Database (3D, still, motion) (http://sampl.ece.ohio-state.edu/database.htm)
■The University of Oulu Physics-Based Face Database (http://www.ee.oulu.fi/research/imag/color/pbfd.html)
■UMIST Face Database (http://images.ee.umist.ac.uk/danny/database.html)
■USF Range Image Data (with ground truth) (http://marathon.csee.usf.edu/range/DataBase.html)
■Usenix Face Database (hundreds of images, several formats) (Link)
■UCI Machine Learning Repository (http://www1.ics.uci.edu/~mlearn/MLSummary.html)
USC-SIPI Image Database (collection of digitized images) (http://sipi.usc.edu/services/database/Database.html)
■UCD VALID Database (multimodal for still face, audio, and video) (http://ee.ucd.ie/validdb/)
■UCD Color Face Image (UCFI) Database for Face Detection (http://ee.ucd.ie/~prag/)
■UCL M2VTS Multimodal Face Database (http://www.tele.ucl.ac.be/PROJECTS/M2VTS/m2fdb.html)
■Vision Image Archive at UMass (sequences, stereo, medical, indoor, outlook, road, underwater, aerial, satellite, space and more) (http://sipi.usc.edu/database/)
■Where can I find Lenna and other images? (http://www.faqs.org/faqs/compression-faq/part1/section-30.html)
■Yale Face Database (http://cvc.yale.edu/projects/yalefaces/yalefaces.html)
■Yale Face Database B (http://cvc.yale.edu/projects/yalefaces/yalefaces.html)

目前人脸识别领域常用的人脸数据库主要有: 
1. FERET人脸数据库[2] 
由FERET项目创建,包含14,051张多姿态,光照的灰度人脸图像,是人脸识别领域应用最广泛
的人脸数据库之一.其中的多数人是西方人,每个人所包含的人脸图像的变化比较单一. 
2. MIT人脸数据库[4] 
由麻省理工大学媒体实验室创建,包含16位志愿者的2,592张不同姿态,光照和大小的面部图像. 
3. Yale人脸数据库[5] 
由耶鲁大学计算视觉与控制中心创建,包含15位志愿者的165张图片,包含光照,表情和姿态
的变化. 
4. Yale人脸数据库B[6] 
包含了10个人的5,850幅多姿态,多光照的图像.其中的姿态和光照变化的图像都是在严格控制
的条件下采集的,主要用于光照和姿态问题的建模与分析.由于采集人数较少,该数据库的进一步应
用受到了比较大的限制. 
5. PIE人脸数据库[7] 
由美国卡耐基梅隆大学创建,包含68位志愿者的41,368张多姿态,光照和表情的面部图像.其
中的姿态和光照变化图像也是在严格控制的条件下采集的,目前已经逐渐成为人脸识别领域的一个重
要的测试集合. 
6. ORL人脸数据库[8] 
由剑桥大学AT&T实验室创建,包含40人共400张面部图像,部分志愿者的图像包括了姿态,
表情和面部饰物的变化.该人脸库在人脸识别研究的早期经常被人们采用,但由于变化模式较少,多
数系统的识别率均可以达到90%以上,因此进一步利用的价值已经不大. 
7. PF01人脸数据库[9] 
由韩国浦项科技大学创建,包含103人的1,751张不同光照,姿态,表情的面部图像,志愿者以
韩国人为主. 
8. AR人脸数据库[10] 
由西班牙巴塞罗那计算机视觉中心建立,包含116人的3,288幅图像.采集环境中的摄像机参数,
光照环境,摄像机距离等都是严格控制的. 
9. BANCA人脸数据库[11] 
该数据库是欧洲BANCA计划的一部分,包含了208人,每人12幅不同时间段的面部图像. 
10. KFDB人脸数据库[12] 
包含了1,000人,共52,000幅多姿态,多光照,多表情的面部图像,其中姿态和光照变化的图像
是在严格控制的条件下采集的.志愿者以韩国人为主. 
11. MPI人脸数据库[13] 
该人脸数据库包含了200人的头部3维结构数据和1,400幅多姿态的人脸图像. 
12. XM2VTS人脸数据库[14] 
包含了295人在4个不同时间段的图像和语音视频片断.在每个时间段,每人被记录了2个头部
旋转的视频片断和6个语音视频片断.此外,其中的293人的3维模型也可得到.

opencv老是卡在某一层,

最近在做人脸检测的Haartraining训练分类器,发现训练到最后误检率很低时分类器总是卡到某一层就不在继续进行,像是进入了死循环,程序代码与参数输入应该是没有任何问题的,所以我从网上找这方面的资料,最后在OpenCV的中文论坛看到一个帖,终于找到原因了。具体如下:

1、问题出现在取负样本的那个函数icvGetHaarTrainingDataFromBG中;

 当剩下所有的negtive样本在临时的cascade Classifier中evaluate的结果都是0(也就是拒绝了),随机取样本的数目到几百万都是找不到误检测的neg样本了,因而没法跳出循环!

2、解决方法是,增大负样本数目,增大负样本之间的变化!

P.S. 因为负样本原则应该是无强大而且多样性越大越好,这在现实中是不可行的,所以我们采集的负样本一般无论从数量上还是多样性上都很难满足要求,所以出现上述问题就很正常了,不过此时的分类器已经完全额、可以使用,因为它的误检率已经很低,从实用性上时没有任何问题的。

另外,帖中还提到:

负样本不需要做成和正样本一样大小的,所以你搜集个几千张各种照片就够用了,比如网页素材库啊什么的,只要保证你的负样本里不包含检测目标就行了。另外训练的时候,负样本不要一下子都加进去,不够了再加,否则会在找负样本上耗费很多时间。

也就是说,训练的时候如果发现很慢了,就ctrl+c停下来,修改bg_data.list,提供新的bg图像。

呵呵,现在感觉Haartraining太工程化了,到最后有点重复操作,所以觉得没必要在很多问题上深究,会用就行了。

[转载]OpenCV训练分类器制作xml文档

原文地址:OpenCV训练分类器制作xml文档作者:yumantang我的问题:有了opencv自带的那些xml人脸检测文档,我们就可以用cvLoad()这个函数加载他们,让他们对我们的人脸进行检测,但是,现在生活中的计算机视觉并不远远是检测人脸,还有很多物品需要识别,所以,能不能自己做个xml的检测文档,用它来检测自己需要的东西呢?例如,检测一个可乐瓶!
问题解决:
首先了解下,目标检测分为三个步骤:
1、 样本的创建
2、 训练分类器
3、 利用训练好的分类器进行目标检测。

一,样本的创建:
训练样本分为正例样本和反例样本,其中正例样本是指待检目标样本(例如可乐瓶,人脸等),反例样本指其它任意图片。
1.正样本
现在,我们来看正样本的创建步骤:
正样本由程序createsample 程序来创建。该程序的源代码由OpenCV 给出,并且在bin 目录下包含了这个可执行的程序。例如你opencv安装目录为 c: 既C:OpenCVbin,你找找就有
正样本可以由单个的目标图片或者一系列的事先标记好的图片来创建!
2-2在用createsamples.exe 这个程序前,先来了解下这个程序的一些命令组合模式
Createsamples 程序的命令行参数:
命令行参数:
-vec <vec_file_name>
训练好的正样本的输出文件名。
-img<image_file_name>
源目标图片(例如:一个公司图标)
-bg<background_file_name>
背景描述文件。
-num<number_of_samples>
要产生的正样本的数量,和正样本图片数目相同。
-bgcolor<background_color>
背景色(假定当前图片为灰度图)。背景色制定了透明色。对于压缩图片,颜色方差量由bgthresh
参数来指定。则在bgcolor-bgthresh 和bgcolor+bgthresh 中间的像素被认为是透明的。
-bgthresh<background_color_threshold>
-inv
如果指定,颜色会反色
-randinv
如果指定,颜色会任意反色
-maxidev<max_intensity_deviation>
背景色最大的偏离度。
-maxangel<max_x_rotation_angle>
-maxangle<max_y_rotation_angle>,
-maxzangle<max_x_rotation_angle>
最大旋转角度,以弧度为单位。
-show
如果指定,每个样本会被显示出来,按下"esc"会关闭这一开关,即不显示样本图片,而创建过程
继续。这是个有用的debug 选项。
-w<sample_width>
输出样本的宽度(以像素为单位)
-h《sample_height》
输出样本的高度,以像素为单位。
注:正样本也可以从一个预先标记好的图像集合中获取。这个集合由一个文本文件来描述。每一个文本行对应一个图片。每行的第一个元素是图片文件名,第二个元素是对象实体的个数。后面紧跟着的是与之匹配的矩形框(x, y, 宽度,高度)。

由于 HaarTraining 训练时输入的正样本是 vec 文件,所以需要使用 OpenCV 自带的
CreateSamples程序将准备好的正样本转换为 vec文件。转换的步骤如下:
1)  制作一个正样本描述文件,用于描述正样本文件名(包括绝对路径或相对路径) ,
正样本数目以及各正样本在图片中的位置和大小。典型的正样本描述文件如下:
face_100/face00001.bmp 1 0 0 20 20
face_100/face00002.bmp 1 0 0 20 20
face_100/face00003.bmp 1 0 0 20 20

可采用 Dos命令结合 EditPlus 软件生成样本描述文件。具体方法是在 Dos下的恰当
目录敲入 dir face_100 /b > samples.dat,则会生成一个 samples.dat,里面包含所有正
样本文件名列表,但没有相对路径名和正样本位置信息。在 samples.dat 文件各行行
首增加“face _100/”的方法是使用 EditPlus,先选中所有行,然后按 Tab键为每行
增加一个制表位,然后将制表位全部替换为“face _100/”即可。通过将“bmp”替
换为“bmp 1 0 0 20 20”即可在每行添加“1 0 0 20 20”。 运行CreateSamples程序。下面是一个运行参数示例:
-info pos.dat -vec pos.vec -num 200 -w 32 -h 32
表示有 200 个样本,样本宽 20,高 20,正样本描述文件为 samples.dat,结果输出
到 samples.vec。 
运行完了会生成一个*.vec 的文件。该文件包含正样本数目,宽高以及所有样本图. 2 负样本图像可以是不含有正样本模式的任何图像,比如一些风景照等。训练时, OpenCV
需要一个负样本描述文件,该文件只需包含所有负样本的文件名及绝对(或相对)路径名。
以下是一个负样本描述文件内容示例:
 nonface_200/00001.bmp
nonface_200/00002.bmp
nonface_200/00003.bmp
 …
  负样本描述文件的生成方法可参照正样本描述文件生成方法。
 
负样本图像的大小只要不小于正样本就可以,在使用负样本时,OpenCV 自动从负样本
图像中抠出一块和正样本同样大小的区域作为负样本,具体可查看函数
icvGetNextFromBackgroundData() 。具体抠图过程为:
1)  确定抠图区域的左上角坐标(Point.x, Point.y)
2)  确定一个最小缩放比例,使得原负样本图像缩放后恰好包含选中负样本区域
3)  对原负样本图象按计算好的缩放比例进行缩放
4)  在缩放后的图像上抠出负样本,如图 3.2 左半部分的虚线框所示。

三、训练分类器
样本创建之后,接下来要训练分类器,这个过程是由haartraining 程序来实现的。

Haartraining 的命令行参数如下:
-data<dir_name>
存放训练好的分类器的路径名。
-vec<vec_file_name>
正样本文件名(由trainingssamples 程序或者由其他的方法创建的)
-bg<background_file_name>
背景描述文件。
-npos<number_of_positive_samples>,
-nneg<number_of_negative_samples>
用来训练每一个分类器阶段的正/负样本。合理的值是:nPos = 7000;nNeg = 3000
-nstages<number_of_stages>
训练的阶段数。
-nsplits<number_of_splits>
决定用于阶段分类器的弱分类器。如果1,则一个简单的stump classifier 被使用。如果是2 或者更
多,则带有number_of_splits 个内部节点的CART 分类器被使用。
-mem<memory_in_MB>
预先计算的以MB 为单位的可用内存。内存越大则训练的速度越快。
-sym(default)
-nonsym
指定训练的目标对象是否垂直对称。垂直对称提高目标的训练速度。例如,正面部是垂直对称的。
-minhitrate《min_hit_rate》
每个阶段分类器需要的最小的命中率。总的命中率为min_hit_rate 的number_of_stages 次方。
-maxfalsealarm<max_false_alarm_rate>
没有阶段分类器的最大错误报警率。总的错误警告率为max_false_alarm_rate 的
number_of_stages 次方。
-weighttrimming<weight_trimming>
指定是否使用权修正和使用多大的权修正。一个基本的选择是0.9
-eqw
-mode<basic(default)|core|all>
选择用来训练的haar 特征集的种类。basic 仅仅使用垂直特征。all 使用垂直和45 度角旋转特征。
-w《sample_width》
-h《sample_height》
训练样本的尺寸,(以像素为单位)。必须和训练样本创建的尺寸相同

然后,同样在dos命令行输入harr这个函数的命令

然后,按回车,会出现“成果”界面

到目前为止,你自己需要的分类器的xml文档就生成了,你自个找下你当前那个目录,会发现,多了几个文件夹,请看图:

到目前为止,就告一段落了!

(这里就只有几个图片,所以,很快训练完,不过,要想训练出检测率高的xml,图片的张数的很多,那时候,会训练几个小时到1天,时间几天的时间,那时候,你只求你的电脑不要断电!)

 

 

 

那么我该用什么办法检验我训练出的分类器的各项性能呢?

回答:要用opencv_performance.exe

先得到test sample:

 

用命令: opencv_createsamples.exe -info test1.dat -img face7.jpg -bg C:/TDDOWNLOAD/car_pic/bg.txt -num 35

 

-info 后面是生成的dat 文件, 

-img 是人脸图片

-bg 背景图片

-num 生成的sample数量

 

 

测试命令:

opencv_performance.exe -data haarcascade_frontalface_alt2.xml -info test1.dat -ni

 

-data 参数接要测试的xml文档

-info 是生成的sample

抱歉!评论已关闭.