机器人视觉中物体识别实验系统设计文档格式.docx
《机器人视觉中物体识别实验系统设计文档格式.docx》由会员分享,可在线阅读,更多相关《机器人视觉中物体识别实验系统设计文档格式.docx(36页珍藏版)》请在冰豆网上搜索。
classifier
前言................................................1
第1章总体方案设计..................................2§
1.1人脸检测简介及算法选取..........................2
§
1.1.1人脸检测介绍................................2
1.1.2人脸检测的常用方法及选取.....................2
§
1.2操作系统及图像库的选取..........................3
1.2.1操作系统...................................4
1.2.2图像库....................................4
第2章Adaboost、Haar及OpenCV实现..................5
2.1Adaboost方法.................................5
2.1.1Boosting方法的提出和发展...................5
2.1.2Adaboost算法的提出........................5
2.2Haar特征.....................................7
2.3OpenCV对算法的实现...........................8
第3章样本的采集和归一化............................9
3.1样本采集......................................9
3.2样本的归一化.................................11
第4章分类器的训练.................................14
4.1创建vec正样本...............................14
4.2训练分类器...................................17
第5章编写主程序及效果检验..........................20
5.1编写主程序...................................21
5.2效果检验.....................................26
结论................................................31
致谢................................................31
参考文献............................................32
前言
随着机电一体化技术的快速发展,作为其典型代表的机器人的智能化越来越被人们需求和受到关注。
而工作在复杂环境中的机器人通过视觉来对周围环境中的物体进行识别的技术是机器人智能化的重要标志。
与传统机器人不同,具有“视觉”且能够识别物体的机器人可以对外部世界进行感知(即获取图像),分析所得信息,并作出合理的决策。
这种技术恰恰满足了对机器人智能化的需求,对机器人的工作和未来机器人的发展具有重要的意义。
机器人视觉的核心技术在于物体识别,物体识别通俗来说既是运用计算机技术使机器人具有和人类一样的,对于在任意环境下观察到的任意物体进行检测、分割和识别的能力。
物体识别的作用方方面面:
对汽车或车牌的识别,并附以其它处理(速度计算等),可以对交通进行智能监控;
工厂中智能机器人可以识别零件种类,以对零件进行相应操作(搬运、组装等);
家用机器人对各种物体的识别可以帮助人类做更多的工作,而不是像传统机器人那样只能做一些简单的重复性的事情,这会使机器人更加智能化,发挥更大的作用。
在各种各样的物体识别中,人脸识别是最典型的识别之一,更准确来讲应该是人脸检测,两者的区别在于,“识别”(Recognition)是从图像中找到能与特定人脸相匹配的部分;
而“检测”(Detection)只是识别的一部分,即在图像中检测出人脸并标记位置。
而人脸检测已经满足“物体识别”的要求,它完全可以代表其他物体(如汽车、杯子等)的识别,所以下文中仅使用“人脸检测”这个名词。
且人脸检测可以被应用在很多领域。
比如家用机器人可以从复杂环境中判断主人的位置,数码相机可以通过人脸识别来对人脸进行准确对焦等等。
因此本次设计为实现人脸检测的功能,以此来代表各种物体的检测识别。
由于本次设计为机器人视觉中的物体识别的实现,所以所有的设计工作均在个人计算机上完成。
具体设计为编写程序,程序的功能为将提供给它的图片中的人脸标记出来,并且可以从摄像头中提取图像、检测出人脸并予以标记。
第1章总体方案设计
1.1人脸检测简介及算法选取
1.1.1人脸检测介绍
人脸检测(FaceDetection)是指在输入图像中确定所有人脸(如果存在)的位置、大小的过程。
人脸检测作为人脸信息处理中的一项关键技术,今年来成为计算机(或者机器人)视觉领域内一项受到普遍重视、研究十分活跃的课题。
人脸检测(FaceDetection)问题来源于人脸识别(FaceRecogni-tion)问题。
人脸检测是对给定的图像、判定其中是否有人脸,若有,将所有人脸从背景中分割提取出来,并确定每个人脸在图像中的位置和大小。
人脸检测技术可以应用于人脸识别、机器人视觉、图像与视频检索等领域。
人脸检测的基本思想是建立人脸模型,比较所有可能的待检测区域与人脸模型的匹配程度,从而得到可能存在人脸的区域。
1.1.2人脸检测的常用方法及选取
随着科学技术的不断发展,人脸检测技术的方法越来越多,如早期的模块匹配法,基于特征的方法,还有中期的神经网络,统计模型,色彩信息,形状分析,还有最近的支持向量法,多模块信息融合,Adaboost算法等。
一基于特征的人脸检测方法
特征是人从肉眼看到的特性,我们可以从肤色,脸部,还有五官特征进行。
整体轮廓法:
我们可以从人脸的形状接近于圆来开始检测,有人把人脸分割为三个轮廓区:
即头顶轮廓区,左脸轮廓区和右脸轮廓区,检测任何一张图像,先进行边缘区域测试,然后提取脸部特征,最后运用评估函数来检测人脸。
肤色检测法:
人脸的肤色可以在一定程度上把人脸从背景中分离出来,因此我们可以运用肤色模型来检测人脸。
器官分布法:
人和人的面部各不相同,但人脸的器官分布却大致相同,即为人脸的器官分布。
Mosaic方法给出了人脸区域灰度分布的规则,依据这些规则对图像进行筛选,以样本满足这些规则的程度作为检查的依据。
也可以先检测器官的位置,然后将这些位置排列组合,运用器官的分布规律进行检测,基本上找到人脸的位置。
二模块匹配法的人脸检测
这种方法首先要把人脸的模板进行建立并保存,接着利用一些算法来计算各检测区域与标准模板的相似度,以此来判定某一区域是否为人脸。
其中包括镶嵌图法(又称马赛克图)、预定模板匹配法和变形模板法。
由于这些不是本次设计所用方法,所以不再进行详细讨论。
三基于Adaboost算法的人脸检测方法
前面我们已经介绍了基于特征和模板匹配的方法,另外一种方法即为基于Adaboost算法的人脸检测。
Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练分类器(弱分类器),然后把这些分类器集合起来,构成一个更强的最终分类器(强分类器)。
AdaBoost算法的实现,采用的是输入图像的矩形特征,也叫Haar特征。
经过了解知道,Adaboost+Haar特征是目前最为常用的人脸检测的方法,故决定使用该方法完成本次设计。
下文中会对该方法做详细分析。
1.2操作系统及图像库的选取
一种好的算法会脱离具体的平台或者语言,可以以纯理论的形式存在。
Adaboost就是这样,它可以应用在不同的领域,当然包括图像处理,更加可以存在于不同的操作系统,也可以通过不同的语言不同的库实现。
1.2.1操作系统
由于linux系统本身还有很多项目是开源的,本人有在linux系统编程的习惯,而且linux的终端shell也可以大大提高编程及其他工作的效率,所以决定使用linux系统。
而Ubuntu作为linux系统很优秀的一个发行版(尤其是图形界面非常的友好),对于本人来讲也较为熟悉,所以本次设计的编程工作在Ubuntu下实现。
1.2.2图像库
在图像处理方面有四大图像库:
FreeImage/CxImage/CImg/OpenCV。
以下为前辈们对着四大图像库的一些使用心得和经验和本人的一些初步了解:
FreeImage为C语言的体系,大量使用指针运算速度可以保证,内含先进的多种插值算法。
另外独有的支持metaexif信息的读取。
该库最大的特点就是比较简练,只把重点放在对各种格式图像的读取写入支持上,没有显示部分,实际编程的时候还是需要调用API函数进行显示。
CxImage完全开放源代码,图像封装为一个类,功能极为强大,与Windows、MFC支持极好,支持图像的多种操作。
缺点:
里面的子库很多,用起来可能较麻烦。
再则它对Windows、MFC支持极好,对linux支持可能逊色,所以只能放弃不用。
CImg:
可以与CxImage配合使用,但是功能上略弱于CxImage。
OpenCV功能十分的强大,而且支持目前先进的图像处理技术,体系十分完善,操作手册很详细,手册首先给大家补计算机视觉的知识,几乎涵盖了近10年内的主流算法;
而且该库是开源项目,移植性较好,这对于我在Ubuntu下开发是个好消息,因为设计的成果可以移植到Windows下进行演示或者使用。
经以上分析本次设计选用OpenCV作为图像库。
在随后的了解中,发现OpenCV对Adaboost+Haar特征支持非常好。
所以更加坚定了对OpenCV的选择。
至此设计工作任务和顺序有了大致雏形:
在Ubuntu下配置好OpenCV环境,训练样本得到分类器,编写程序对图片或视频检测并标记人脸位置。
第2章Adaboost、Haar特征及OpenCV实现
2.1Adaboost方法
2.1.1Boosting方法的提出和发展
在了解Adaboost方法之前,先了解一下Boosting方法。
回答一个是与否的问题,随机猜测可以获得50%的正确率。
如果一种方法能获得比随机猜测稍微高一点的正确率,则就可以称该得到这个方法的过程为弱学习;
如果一个方法可以显著提高猜测的正确率,则称获取该方法的过程为强学习。
1994年,Kearns和Valiant证明,在Valiant的PAC(ProbablyApproximatelyCorrect)模型中,只要数据足够多,就可以将弱学习算法通过集成的方式提高到任意精度。
实际上,1990年,SChapire就首先构造出一种多项式级的算法,将弱学习算法提升为强学习算法,就是最初的Boosting算法。
Boosting意思为提升、加强,现在一般指将弱学习提升为强学习的一类算法。
1993年,Drucker和Schapire首次以神经网络作为弱学习器,利用Boosting算法解决实际问题。
前面指出,将弱学习算法通过集成的方式提高到任意精度,是Kearns和Valiant在1994年才证明的,虽然Boosting方法在1990年已经提出,但它的真正成熟,也是在1994年之后才开始的。
1995年,Freund提出了一种效率更高的Boosting算法。
2.1.2Adaboost算法的提出
Adaboost算法于1995年被提出,这是对Boosting算法的一大提升。
Adaboost是Boosting家族的代表算法之一,全称为AdaptiveBoosting。
Adaptively,即适应地,该方法根据弱学习的结果反馈适应地调整假设的错误率,所以Adaboost不需要预先知道假设的错误率下限。
也正因为如此,它不需要任何关于弱学习器性能的先验知识,而且和Boosting算法具有同样的效率,所以在提出之后得到了广泛的应用。
Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。
其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。
将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。
使用Adaboost分类器可以排除一些不必要的训练数据特征,并将关键数据特征放在关键的训练数据上面。
Adaboost是一种基于级联分类模型的分类器。
级联分类模型可以用图2-1表示。
图2-1级联分类模型
级联分类器就是将多个强分类器连接在一起进行操作。
每一个强分类器都由若干个弱分类器加权组成,例如,有些强分类器可能包含多个弱分类器,一个级联用的强分类器又可包含多个强分类器,然后将强分类器级联起来,就构成了一个级联强分类器。
因为每一个强分类器对负样本的判别准确度非常高,所以一旦发现检测到的目标位负样本,就不在继续调用下面的强分类器,减少了很多的检测时间。
因为一幅图像中待检测的区域很多都是负样本,这样由级联分类器在分类器的初期就抛弃了很多负样本的复杂检测,所以级联分类器的速度是非常快的;
只有正样本才会送到下一个强分类器进行再次检验,这样就保证了最后输出的正样本的伪正(falsepositive)的可能性非常低。
2.2Haar特征
AdaBoost算法的实现,采用的是输入图像的矩形特征,也叫Haar特征。
影响Adaboost检测训练算法速度很重要的两方面是特征的选取和特征值的计算。
脸部的一些特征可以由矩形特征简单地描绘。
如图2-2所示:
图2-2Haar特征描绘
常用的矩形特征有三种:
两矩形特征、三矩形特征和四矩形特征,如图2-3所示。
由图表可以看出,两矩形特征反映的是边缘特征,三矩形特征反映的是线性特征、四矩形特征反映的是特定方向特征。
征模板的特征值定义为:
白色矩形像素和减去黑色矩形像素和。
接下来,要解决两个问题,1:
求出每个待检测子窗口中的特征个数。
2:
求出每个特征的特征值。
子窗口中的特征个数即为特征矩形的个数。
训练时,将
图2-3常用的矩形特征
每一个特征在训练图像子窗口中进行滑动计算,获取各个位置的各类矩形特征。
在子窗口中位于不同位置的同一类型矩形特征,属于不同的特征。
可以证明,在确定了特征的形式之后,矩形特征的数量只与子窗口的大小有关。
在24×
24的检测窗口中,矩形特征的数量约为160,000个。
特征模板可以在子窗口内以“任意”尺寸“任意”放置,每一种形态称为一个特征。
找出子窗口所有特征,是进行弱分类训练的基础。
2.3OpenCV对算法的实现
OpenCV的全称是:
OpenSourceComputerVisionLibrary。
OpenCV于1999年由Intel公司建立。
它是一个基于(开源)发行的跨平台计算机视觉库。
由一系列C函数和少量C++类构成,同时提供了Python等语言的接口,实现了图像处理和计算机视觉方面的很多算法。
由于OpenCV强大的功能,它可以应用到多种领域。
如人机互动、物体识别(其中包括人脸的检测和识别)、运动跟踪和机器人视觉等等。
OpenCV对算法有很好的封装,这使得OpenCV开发出的程序更加小巧和简洁,更重要的是它省去了开发人员的重复性劳动,大大提高了开发的效率。
这也是吸引众多开发者使用OpenCV的原因。
在物体识别方面(包括人脸检测),OpenCV对Adaboost等经典常用的算法做了更加实用的封装。
所谓实用是指OpenCV将Adaboost算法和Haar特征对图像的训练封装为一系列程序,并提供一些参数项,而开发者只需要提供正反样本和所需的参数,按照一定的顺序便可以训练出自己的分类器,所要关心是每个样本的质量和所有样本对各种情况的表达程度,当然样本的数量也是需要考虑和控制的。
下面是Opencv提供的关于训练得到分类器的程序:
opencv_createsamples创建正样本,生成的为中间数据(格式为.vec),以便用于下一步的训练。
Opencv_haartraining:
以上一步的结果作为正样本,加上不含所要识别的物体(人脸)的图片作为负样本(或者背景图)进行训练,输出的结果即为关于人脸特征的Adaboost分类器(表现形式为.xml文档,可以被Opencv程序打开)。
在之后的内容中,还会详细说明训练的方法。
第3章样本的采集和归一化
3.1样本采集
样本包括正样本和负样本(或者称为背景图),其中正样本为含有人脸的图像,而负样本或者背景图为不含人脸的图像。
正样本可以为带有背景的图像,也可以是仅含人脸的图像。
由于opencv_createsamples创建正样本中间文件(.vec)时需要制定人脸的个数和在图像中的位置大小,为了减少工作量(并不影响结果),决定采集的正样本均为单张人脸且不含背景,这样图像中的人脸区域即为图像的整个区域。
由于检测人脸的环境是不确定的,光线和明暗程度也是不同的,且人的表情也是随时变化的,这些都可以引起特征的变化,所以训练所用的样本集要非常丰富,考虑到种种情况,才会使训练的分类器更加可靠。
在实际操作中,一方面我在不同环境中对不同人脸不同表情进行拍照,将所得图像中的人脸截取出来;
另一方面利用互联网,获取了较多含有人脸的图像,如图3-1所示,为部分样本。
图3-1正样本
负样本(背景图)唯一的要求是其中不能含有人脸,可以是任意图像,比如生活中的场景、动物或者各种工具等等。
所以负样本的采集就非常容易。
与采集正样本一样,从现实中和网络中得到一定数量的负样本,如图3-2所示。
图3-2负样本
3.2样本的归一化
opencv_createsamples所需的正样本必须是归一化的,所谓归一化即为图像全部是灰度图(彩色图过于复杂,信息量过大,各种特征不够明显,训练的工作量变大,时间变长,甚至无法训练出分类器),且尺寸一致。
这里我们将尺寸定为20X20。
每个样本的命名方式为face