设计一个模式识别系统需要确定两件事:第一件,用什么模式特征进行比较?提取那些能有效区分类别的特征,让同类样本在特征空间中尽量挤在一起,而让不同类别的样本间距离尽量远。(这里的“距离”根据不同的测量方法而有所不同,但总是希望通过某些方法把特征变换到线性空间中,毕竟欧式距离是比较直观的观察方法。)比如,在一个锅里炒黑豆子和白豆子(不止两颗),要想把他们分成黑豆和白豆两堆,比较好的特征是颜色;把大白菜和甘蓝菜分成两堆的特征是形状。如果白菜的“圆度roundness”是一种度量测度,用一个坐标轴表示,那么白菜们的这个特征在坐标轴上的位置应该是扎堆(clustering)的。如果有多种特征,每个特征对应一个坐标轴,组成的一个特征空间,它可能是很多维的高维空间。 第二件事,设计分类器。在特征空间中画一条线,线左边是大白菜,右边是甘蓝菜,这条线就是分类器。困难在于,两类模式在特征空间中的交界并不总是很明显。两类样本尽管聚类,比如呈现出高斯分布,但边界的地方两类是混在一起的。如果特征选择得不够好,这种不可分的情况就更加不可避免。模式分类问题其实都可以归结为"分大白菜哪点事"。
对于人脸检测问题,两类目标分别为人脸(正样本'+')和非人脸(负样本 '-'),也需要经过对图像提取特征和设计分类器两个串行步骤,现有的部分方法可以列一个表,比如:
特征 | 分类器 ———————————— pca降维 | AdaBoost 小波分解 | NN(神经网) Haar-like小波| SVM(支撑向量机) HOG | 贝叶斯分类法 LBP | ...... | ......
原则上左右两边任选两项都可以组成一个图像识别系统,学术期刊(国内的更多些)上多如牛毛的文章几乎就是这么任意组合来的。实际上这也仅仅是一小部分,每种方法都能衍生出许多变化。经常听到某人听说某人的系统用了“神经网络”,这话提供的信息实在有限,因为他没有说他用的是什么特征,还有是什么神经网,是RBF网,还是BP网,如果是BP网那么有几层,每层都什么配置。久而久之,“神经网”,“SVM”这些词的滥用让它们都有被妖魔化的趋势。
我们的方法可以这样准确地描述,“Viola-Jones的Haar-like小波,加上经过Boosting的Naive Bayes组合分类器”,可真够罗嗦的。Haar-like小波特征我们在上节有介绍,用matlab计算比较方便,比如我们有若干24×24的样本图像组成一个3D矩阵samples, xy方向是图像平面,沿着它的z方向可以遍历所有样本,比如samples(:,:,7)表示第7个样本。所有样本的积分图像(积分数组)分两步计算:
cumsam = cunsum(cunsum(samples,1),2);
对所有样本计算一个矩形特征的方法也可以利用矩阵特性批量进行,假设矩形由a,b,c,d四点组成:
f1 = cumsam(ay,ax,:)+cumsam(dy,dx,:)-cumsam(by,bx,:)-cumsam(cy,cx,:);
另一个矩形特征为f2,则一个Haar小波特征为 fv = f1 - f2.
以上是对上一节特征提取具体计算方法的补充。接下来,因为上边提到的特征数目太多(10万多),希望从大量的特征feature pool)中选取有效的特征,原则是两类样本在这个特征轴上的分布尽可能离得远些,越远越好。“训练(training)”过程是个离线的过程(离线又是个什么东西?离线offline是相对于“在线online”说的,表示这种过程是在生产线下完成的,可以不计时间代价,“我可以等!”。训练好的模型,是需要用在实际检测中的,所以需要越快越好,叫“在线”。),就是从这个pool中打捞有用的特征,它们单个的分类能力尽管有限,但它们的组合,可以很强大。如何评价每个特征分布的好坏?用Bayesian 把每个都试一试看,看看哪个特征两类的分布差距最大。
贝叶斯公式,据我粗浅的认识应该是指:类别对于特征的后验概率正比于该类别在这些特征分布下的条件概率(就是上述特征分布)乘以该类的先验概率(比如世界人口的男女比例)。用公式表达: P(wi | f1,f2,...fn ) = p(f1,f2,...fn | wi ) * p(wi),wi表示很多类中的第i类,f1,...,fn表示。它的意思是,在给定特征值 f1,f2,...fn的情况下,属于类别wi的概率是多少。比如我们有m个类别,对于每个wi,i=1...m,都可算出一个概率,选其中最大的,对应的那个wi就是最终的类别,这个唤作“最大化后验概率(MAP)”。对于每个类别,都可以根据采集到的样本实现知道特征分布函数p(f1,f2,...fn | wi ),有几类就有几个这样的分布函数,叫概率分布函数(pdf)。对于人脸检测这样的两类问题(w+和w-),贝叶斯分类器可以用两类后验概率的比值表示,
f(f1,...fn) = P(w+ | f1,f2,...fn )/P(w- | f1,f2,...fn ) ,
这个值越大,越倾向于正样本,通常用一个阈值决定是'+'还是'-',另外p(w+)和p(w-)的比值可以认为是固定的和特征无关,最终分类器表示为条件概率的比值的形式:
f(f1,...fn) = p( f1,f2,...fn | w+ ) / p( f1,f2,...fn | w- )
对于组合特征f1,f2,...fn 的分布函数p( f1,f2,...fn | w+ )进一步简化的方法是,在假设n个特征统计无关的情况下,可以用每个特征的特征分布的连乘的形式来表达:
p( f1,f2,...fn | w+ ) = p( f1 | w+ ) × p( f2 | w+ ) ×... × p( fn | w+ ) ;
这部分具体可参考概率论相关书籍。所谓统计意义的不相关,是指每个特征呈现的分布不是由其他特征决定的,是独立的p(f1|f2,...,fn) = p(f1), 这样的独立性假设是保证每个特征对分类的贡献都不受其他特征影响,它的反面则是指它提供的信息是冗余的。就象在班会上,程老师让大家发表对某项班级活动的看法,在老薛发言之后,我站起来说:“我完全同意薛同学的看法“。这样我的意见就不包含任何有用的信息(除了暴露了我其实并不关心这样的活动),是高度冗余的。
虽然实际上f1,f2,...,fn之间并非总是相对独立的,但还是假设上式勉强成立,这个一般叫做Naive Bayes(Naive 这个字源自法语,Too simple, sometimes naive.)。实际上,我们提到的AdaBoost方法就是尽量去除数据之间的相关性的。这样分类器表示为:
p( f1 | w+ ) × p( f2 | w+ ) ×... × p( fn | w+ ) f(f1,...fn) = ------------------------------------------------------ p( f1 | w- ) × p( f2 | w- ) ×... × p( fn | w- )
上式左右两边取对数,这样讨厌的乘除法就变成加减法了:
ln(f(f1,...fn)) = [ln(p( f1 | w+ )) - ln(p( f1 | w- )) ] + ....+ [ln(p( fn | w+ )) - ln(p( fn | w- )) ] ;
其中ln(p( fj | w+ ))是某个特征的概率分布函数p( fj | w+ )的对数形式,p( fj | w+ )如果用参数化的形式表达成比如高斯分布或者混合高斯分布的形式的话,那么只用若干参数就可以表达了,但是它们并不是服从高斯分布的,所以通常用非参数的方法表达,那就是直方图。把ln(p( fj | w+ )) - ln(p( fj | w- )) 表示成一个直方图,表示每个特征的置信度,那么人脸检测就变成这样一个过程:
1 在输入的一个图像区域里,计算若干特征; 2 根据每个特征查表,在直方图里找到对应的置信度值; 3 把这些特征对应的置信度值求和,用一个阈值Th决定输出为‘+’或‘-’。
实际上不论用什么特征,什么分类器(神经网,SVM),它们最终的形式都可以表示成一组特征数据的加权和,以及一个最后的判决阈值Th的形式:
if ( SUM ( H(fj) ) >Th ) , j = 1, .. .., n, n个特征 wi = face; else wi = nonface;
下节将介绍特征分布的直方图是如何被用来选取特征,并最终组合成分类器的。
以上方法都不是我想出来的,我只是用白话写写我的理解。参考文献如下:
[1] 边肇祺, 《模式识别》
[2] Tom M.Mitchell, Machine learning (《机器学习》 )
[3] Bo WU, Haizhou AI, Chang HUANG, Shihong LAO, Fast Rotation Invariant Multi-View Face Detection Based on Real Adaboost, In Proc. the 6th IEEE Conf. on Automatic Face and Gesture Recognition (FG 2004), Seoul, Korea, May 17-19, 2004.
http://media.cs.tsinghua.edu.cn/~imagevision/publications.htm
转载本文请联系原作者获取授权,同时请注明本文来自王琳科学网博客。 链接地址: https://blog.sciencenet.cn/blog-465130-419621.html
上一篇:
人脸检测之二:提取特征 下一篇:
人脸检测之四: 直方图.AdaBoost