计算机视觉作业Word文档格式.docx
《计算机视觉作业Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算机视觉作业Word文档格式.docx(18页珍藏版)》请在冰点文库上搜索。
![计算机视觉作业Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/8/d79fdb6c-5c6a-46d2-a823-1746d48cece5/d79fdb6c-5c6a-46d2-a823-1746d48cece51.gif)
ftp:
//whitechapel.media.mit.edu/pub/images
FERET
收集了大量的男性、女性人脸,每张图像包含了一张特定表情的人脸
http:
//www.nist.gov/humanid/feret
UMIST
分为20个主题,共564张图像,每个主题包括从侧面到正面的不同人脸姿态
//images.ee.umist.ac.uk/danny/database.html
Univ.ofBern
30个人的300张正面人脸(每人10张)和150张侧面人脸(每人5张)
//ianftp.unibe.ch/pub/images/faceimages/
Yale
在不同光照条件下,戴眼镜的表情人脸
//cvc.yale.edu
AT&
T(Olivetti)
40个主题,每个主题10张图像
Harvard
Harvard在不同光照条件下的剪裁好的人脸图像
//ftp.hrl.harvard.edu/pub/faces
M2VTS
一个包含不同图像序列的多态数据库
//poseidon.csd.auth.gr/m2vts/index.html
PurdueAR
3276张在不同光照条件下的表情和有遮挡的人脸图像
//rvl1.ecn.purdue.edu/~aleix/aleix_face_db.html
图1典型的正面人脸图像数据库中的人脸图像
如图1,就是MIT的一个典型的正面人脸数据库中的图像,图像的尺寸都为20×
20。
本论文的检测算法所用的训练图像即为这个数据库中的。
由于不同研究任务的需要,必要时可以设计和建立具有特色的专用数据库。
2.2性能评测
由于不同人脸库所取得的图像条件和质量不同,因此不同的识别程序之间很难进行比较。
为促进人脸识别算法的深入研究和实用化,美国国防部发起了人脸识别技术(FaceRecognitionTechnology,FERET)工程,它包括一个通用人脸库和一套通用测试标准,用于定期对各种人脸识别算法进行性能测试,其分析测试结果对未来的工作起到了一定的指导作用。
图2左侧为测试图像,右侧为检测结果。
不同的标准会导致不同的检测结果
对于人脸检测来说,一般关注两个指标:
1.人脸检测率(DetectionRate):
在给定图像中,检测出来的人脸和人脸总数的比率。
但是,“人脸”的定义并没有统一标准,例如,如果一个人脸被遮挡,那么究竟遮挡了多大部分后,就能判定剩余部分不再是一个“人脸”?
;
2.错误检测数(FalseDetection):
有多少的非人脸被当成是人脸检测出来了。
这个指标非常重要,有些检测算法可以给出甚至100%的检测率,但是其错误检测的数量可能非常巨大。
一个理想化完美的人脸检测算法,应该有100%的人脸检测率和0错误检测数。
现阶段也许只有人的大脑有这个能力。
虽然现在有很多检测算法,但是它们中的大部分还没有经过大量的图像数据集测试。
而且,这些方法的实验结果大都是用不同的测试集得出的。
即使采用了相同的训练集和测试集,由于研究者对“检测成功”的看法不尽相同,使得检测率的标准不唯一,也会导致对不同检测算法评测的困难。
如图4,假设右图中的所有子图像都被检测器认为是人脸,那么一个宽泛的标准会认为检测到的这所有的人脸都是成功的,但是一个严格标准可能认为这些检测到的人脸有很多是错误的。
为了公平地比较和评价这些方法,也有必要像FERET一样定义一套标准的测试数据集和测试方法。
3PAC学习模型
3.1概述
可学习理论可以分为统计学习理论和计算学习理论两大部分。
统计学习理论与经验过程有着密切的联系,而计算学习理论是概率理论中发展比较成熟的一个重要分支,它主要用于处理在实验的基础上进行的各种量的估计,研究当采样越来越多的时候,这些估计值是否收敛到未知的真值的问题,它的理论基础主要是概率理论;
计算学习理论主要研究如何构造有效的学习算法以及讨论学习算法的计算复杂性问题。
PAC(ProbablyApproximatelyCorrect)模型是计算学习理论中常用的模型,它是由Valiant于1984年首先提出来的。
这篇论文认为“学习”是当明显清晰的过程或模式不存在时仍能获取知识的一种“过程”,并给出了一个从计算角度来获得这种“过程”的方法,这种方法包括:
(1)适当信息收集机制的选择;
(2)学习的协定;
(3)对能在合理步骤内完成学习的概念的分类。
虽然内在的算法复杂性限制了能够学习的概念的范围,论文仍然给出了一些有现实意义的,重要的,能够学习的概念例子。
PAC学习的实质就是在样本训练的基础上,使算法的输出以概率接近未知的目标概念。
PAC学习模型是考虑样本复杂度及计算复杂度2的一个基本框架,成功的学习被定义为形式化的概率理论。
3.2弱学习与强学习
如何根据观测数据来学习并得到精确的假设是机器学习领域中人们非常关注的一个问题,机器学习的一个重要目标就是对新的样本尽可能给出精确的估计。
随机猜测一个是或否的问题,将会有50%的正确率。
如果一个假设能够稍微地提高猜测正确的概率,那么这个假设就是弱学习算法,得到这个算法的过程称为弱学习。
可以使用半自动化的方法为好几个任务构造弱学习算法,构造过程需要数量巨大的假设集合,这个假设集合是基于某些简单规则的组合和对样本集的性能评估而生成的。
如果一个假设能够显著地提高猜测正确的概率,那么这个假设就称为强学习。
生成只比随机猜测好一点的弱学习算法很容易,但是构造一个强学习算法却是一件相当困难的事情。
Kearns提出了弱学习算法与强学习算法间的等价问题——是否能把弱学习算法转化为强学习算法。
如果两者等价,则只需要找到一个弱学习算法就可以直接将其提升为强学习算法。
Kearns和Valiant证明:
只要有足够的数据,弱学习算法就能通过集成的方式生成任意高精度的假设(强学习方法)。
4Boosting方法
Boosting原意为提升、加强。
现在一般指的是将弱学习算法提升为强学习算法的一类算法。
Boosting算法是在Kearns和Valiant证明后才真正成熟起来的。
1990年,Schapire最先构造出一种多项式级的算法,即最初的Boosting算法。
这种算法可以将弱分类规则转化成强分类规则。
一年后,Freund提出了一种效率更高的Boosting算法。
1993年,Drucker和Schapire第一次以神经网络作为弱学习器,应用Boosting算法来解决实际的OCR问题。
Boosting算法在分类、建模、图像分割、数据挖掘等领域均已得到简单而有效的应用。
1995年,Freund和Schapire提出的Adaboost,是对Boosting算法的一大提高。
下面章节将逐步具体说明AdaBoost算法。
5.矩形特征
本章节描述了对AdaBoost人脸检测训练算法速度很重要的两方面,特征的选取和特征值的计算。
将矩形作为人脸检测的特征向量,称为矩形特征。
本算法选取了最简单的5个矩形特征模板进行训练,以得到一套用于人脸检测的最适合的矩形特征,事实证明,这种特征选取方法的训练速度虽然不快,但是检测效率很高。
Viola提出将积分图(integralimage)应用到特征值的计算之中。
积分图的引用,可以只对图像进行一次遍历计算,就能够在用常量时间完成每个特征值的计算,这使得训练和检测的速度大大提升。
在给定有限的数据情况下,基于特征的检测能够编码特定区域的状态,而且基于特征的系统比基于象素的系统要快得多。
矩形特征对一些简单的图形结构,比如边缘、线段,比较敏感,但是其只能描述特定走向(水平、垂直、对角)的结构,因此比较粗略。
如图3,脸部一些特征能够由矩形特征简单地描绘,例如,通常,眼睛要比脸颊颜色更深;
鼻梁两侧要比鼻梁颜色要深;
嘴巴要比周围颜色更深。
对于一个24×
24检测器,其内的矩形特征数量超过160,000个,必须通过特定算法甄选合适的矩形特征,并将其组合成强分类器才能检测人脸。
图3矩形特征在人脸上的特征匹配。
其中上面一行是24×
24子窗口内选出的矩形特征,下面一行是子窗口检测到的与矩形特征的匹配。
6程序实现及结果
6.1样本集
AdaBoost算法效果如何的重点在于前期训练时候的弱分类器的选取,而弱分类器的选取在一定程度上依赖于样本集的选取。
因而训练样本集显得十分重要。
在前面提到了一些图像库,最大最全的是FERET数据库,但是其由美国军方开发,在美国以外地区无法获得。
本文使用的是一套MIT的人脸训练样本库,共有样本7,087个,其中人脸样本2,706个,非人脸样本4,381个。
其中人脸图像的示例参见图3,非人脸图像的示例参见图4。
图4训练用的非正面人脸图像
这个样本库中的人脸样本都是20×
20像素、正面正向人脸,有同一个人的多种光照条件下的样本。
非人脸样本尺寸和人脸样本相同,是从图像中随机自动截取的。
这个样本库的将侧面人脸、非正向人脸、有遮挡的人脸都归入了非人脸样本。
因此,依此样本库训练的强分类器只对正面正向人脸敏感。
6.2训练难点及优化
6.2.1计算成本
由于特征数量极其多,训练的时间和空间开销特别大。
在每轮循环中,都要计算所有样本对所有特征的特征值,则需要运算:
78,460×
7,087=556,046,020次
在我的电脑上实测得到,上述运算共花时675秒(11分钟15秒)。
为了训练200个弱分类器,则需要进行200轮运算,则共需要37.5小时。
但这并不是最终的运算时间,最终的运算时间要加上每轮运算中选择最佳阈值所要进行的排序、遍历等运算。
时间的开销是巨大的。
因为一个特征对一幅图像的特征值是固定的,那么可以只运行一次上述运算,将得到的特征值结果都保存在硬盘上,这样可以减少每次计算的时间开销,需要的磁盘空间为(采用4字节的unsignedlong存储):
556,046,020×
4=2,224,184,080Bytes=2.07Gbytes
空间开销是巨大的。
但是,对于一般的PC机,硬盘的峰值读取速度为66Mb/s,则读取上述内容的时间开销仍有32秒。
6.2.2减少矩形特征的数量
为了提高训练速度,得从其他方面考虑。
分析知道,除了算法效率外,影响运算次数的因素只有训练集数量和特征数量,而训练集数量不可能减少,这样会直接影响最后得到的强分类器效果;
因此必须得减少特征数量才能减少训练时间。
对于特征数量的减少,主要有两个途径:
第一是在特征生成阶段人为剔出。
例如,完全不必考虑宽度为一个像素的矩形特征,因为显然用这样的特征计算特征值随机性太大,不可能寻找到合适的阈值。
这一步,特征数量可以减少6,520个,变成71,940个。
又因为训练集的人脸特征都集中在中部,边缘上的矩形特征的贡献不会特别大,因此可以适当减少边缘的矩形特征,例如不考虑涉及到边缘1像素的矩形特征,则矩形特征的数量可以进一步减少到46,953个。
第二步是在训练过程中动态地减少矩形特征。
对于在训练中,阈值的选取对错误率降低成效不大的那些矩形特征,被认为是对人脸和非人脸区分能力很低的,可以设定一个错误率范围(逐轮改变),在每轮训练中按照这个范围,对矩形特征进行排除。
进行了上述处理后,运算速度可以得到40%以上的提升。
6.2.3样本预处理
为了减小图像本身由于灰度分布12带来造成的影响,需要对训练样本做归一化处理。
对于MIT训练库中的所有样本,采用直方图归一化处理所有的样本(见图5)。
进行人脸检测时,也可以按此值进行归一化。
原图像归一化后
图5样本归一化前后对比
6.3检测结果
6.3.1检测器
用于检测的图像一般都大于子窗口20×
20的分辨率。
于是,在对一副图像作检测的时候需要从不同的尺度和不同的位置逐个检测。
对于不同尺度的检测,我们选择对检测器进行缩放而不是对图像本身进行缩放,因为在任何尺度下,特征都可以用同样的代价求出。
我们的使用的检测器基本大小为20×
20,实验结果表明,检测器每次放大1.25倍是最佳的。
此外,检测器还需要在不同的位置逐个检测。
每一次,检测器平移k个象素;
如果放大后的检测器尺度为S,则检测器窗口每次平移kS。
这里,k的选择非常重要,它既影响检测的精度,又影响检测的速度。
如果k取的较大,检测速度可以很快,但是同时很多人脸由于检测器的移动步长较大最终被忽略了;
反之,如果k取的较小,虽然可能会提高检测的精度,但是将使检测速度大大降低。
在实际检测中,按照人脸结构的“三庭五眼”准则,选择k=20×
=4。
由于检测器对于尺度和位置上的微小变化不敏感,所以,对于同一张人脸,检测结果中可能会把它检测出很多次,因而我们需要对检测结果进行消减。
消减的方法十分简单:
对于边界有相交区域的检测结果,对它们的四个顶点分别取平均值作为新的顶点,从而合成一个检测结果。
6.3.2实验结果
首先与Viola实验的结果进行了比较。
Viola的结果
本文结果
图6与Viola实验结果比较1:
总数15/漏检0/错检5
图7与Viola实验结果比较2:
总数7/漏检1/错检4
更多实验结果如下:
图8多人图像检测结果:
总数14/漏检2/错检1
图9多人图像检测结果:
总数6/漏检1/错检4
图10多人图像检测结果:
总数33/漏检0/错检4
图11不含人脸图像检测结果:
总数0/漏检0/错检45
7结论
Viola由于采用了层级处理方法,大大提高了检测速度,在同一台计算机上,对于384×
288像素的图像,检测速度可以达到15帧/秒。
本文的算法检测384×
288像素的图像,约需要30秒,比Viola的层级处理方法慢了许多。
另外,本方法的漏检和错检率还比较高。
这只要是因为训练集数量太少,而且非人脸样本比重偏低。
事实上,世界上的非人脸样式要远远大于人脸样式,因此有足够多的非人脸样本,才能够让分类器对非人脸图案的“分辨”能力大大提高。
8Matlab源码
function[test_targets,E]=ada_boost(train_patterns,train_targets,test_patterns,params)
%ClassifyusingtheAdaBoostalgorithm
%Inputs:
%train_patterns-Trainpatterns
%train_targets-Traintargets
%test_patterns-Testpatterns
%Params-[NumberOfIterations,WeakLearnerType,Learner'
sparameters]
%
%Outputs
%test_targets-Predictedtargets
%E-Errorsthroughtheiterations
%NOTE:
Suitableforonlytwoclasses
[k_max,weak_learner,alg_param]=process_params(params);
[Ni,M]=size(train_patterns);
W=ones(1,M)/M;
IterDisp=10;
full_patterns=[train_patterns,test_patterns];
test_targets=zeros(1,size(test_patterns,2));
%DotheAdaBoosting
fork=1:
k_max,
%TrainweaklearnerCkusingthedatasampledaccordingtoW:
%...sosamplethedataaccordingtoW
randnum=rand(1,M);
cW=cumsum(W);
indices=zeros(1,M);
fori=1:
M,
%Findwhichbintherandomnumberfallsinto
loc=max(find(randnum(i)>
cW))+1;
ifisempty(loc)
indices(i)=1;
else
indices(i)=loc;
end
%...andnowtraintheclassifier
Ck=feval(weak_learner,train_patterns(:
indices),train_targets(indices),full_patterns,alg_param);
%Ek<
-TrainingerrorofCk
E(k)=sum(W.*(Ck(1:
M)~=train_targets));
if(E(k)==0),
break
%alpha_k<
-1/2*ln(1-Ek)/Ek)
alpha_k=0.5*log((1-E(k))/E(k));
%W_k+1=W_k/Z*exp(+/-alpha)
W=W.*exp(alpha_k*(xor(Ck(1:
M),train_targets)*2-1));
W=W./sum(W);
%Updatethetesttargets
test_targets=test_targets+alpha_k*(2*Ck(M+1:
end)-1);
if(k/IterDisp==floor(k/IterDisp)),
disp(['
Completed'
num2str(k)'
boostingiterations'
])
end
test_targets=test_targets>
0;