基于Adaboost与Haar特征的人脸识别

背景阐述

开发一个纯Matlab下的人脸识别系统其实非常有益,因为Matlab具有极强的图像处理功能。然而目前互联网上大多采用OpenCV+C++编译Matlab API的方法进行Matlab人脸识别,我觉得这是完全没有意义的。因此,我选择理解Viola-Jones提出的人脸识别算法,并仅用Matlab进行编程。

代码已经更新在Github上。

下载地址:https://github.com/cuijiaxun/FaceRecognitionByMatlab

1.1主要文件及作用

测试训练及提取特征:运行ExtractAndTrain.m(不建议低gpu配置运行)

测试检测性能:运行testMWSegment.m

作用 文件名 主要作用 备注
数据库 faces文件夹 4422张人脸 正样本
nonfaces文件夹 4381张非人脸 负样本
主程序1

(特征提取及训练)

ExtractAndTrain.m 提取和训练的主程序

(建议不要跑,训练要7小时左右)

定义了Haar特征,提取特征,训练,错误率计算
特征提取函数 integralImage.m 求积分图像
extHarrLikeFeature.m 提取Harr-like特征
训练所需要的函数 trainAdaBoostLearner.m 训练100个强分类器,找到区别人脸的阈值
searchBestWeakLearner.m 根据错误率找到最好的weak learner
AdaBoostClassfy.m 强学习分类
calPredictErrorRate.m 计算错误概率
testAdaBoostLearner.m 自我循环样本,测试误判
数据库 HarrLikeFeatures-2.mat 保存提取的特征及训练数据 可以直接使用作为数据库
主函数2

图像检测

testMWSegment.m 窗口检测程序 指定判断算法、窗口数据、划定网格
判断函数 MoveWindowing.m 移动窗口、放缩
ImageBlockRecogByAdaBoost.m 对当前窗口进行识别
ThreshSegement.m 阈值分割
LabelDetectWindow.m 给找到的图像进行加框
级联检测 ImageBlockRecogByCascadeAdaBoost.m 级联检测 就写了一下,还没有整合进程序

 

1.2检测错误率

使用1000张正样本及负样本训练并自循环检测错误率,得到识别错误率为13%左右,特征提取错误率在100轮以后几乎为0。

1.3检测试验

试验1:多人脸识别

在人脸数少的情况下,本程序可以较为准确地识别人脸区域

试验2:复杂情况人脸识别

复杂背景下,由于窗口大小不同,可能存在多次检测的情况。但可以看到主要的集中人脸检测区域为主要人脸区域,而非集中于人的腿部或者屋顶,可见在复杂情况下,本程序也有一定的分辨率。

1.4存在问题

(a)识别时间长,效率低。主要划分网格较密,判断窗口大小过多,特征提取过多,以及算法问题。解决方法是:1.仅使用最有效的特征分辨。这样做显然会降低准确率2.减少检测窗口个数或减少网格划分个数。可能导致漏检及错检。3.使用Cascade算法

(b)重复识别。主要是由于算法的问题,对同一张人脸进行了多次的检测。解决方案是人脸合并。关于这个,有许多学者提出了较好的合并方法,见参考文献[1][2]

(c)识别外国人的能力比识别中国人的能力强。这与素材库有关。

1.5算法简介

本人脸识别框架是基于Viola和Jones2014年在IJCV上发表的Robust Real-time Object Detection,目前已经是一个成熟的框架,在OpenCV和Matlab的CV Toolbox中均有应用。

1.5.1Haar特征:提取特征

l   特征

本程序采用了五种典型特征模版

特征取值为白色区域对应图像的像素值之和减去灰色区域对应图像的像素值之和。

 

haar特征可以很好地区别人脸和非人脸

l   (s,t)条件

大小的窗口中,特征矩形区域

  • x方向边长必须能被自然数s整除
  • y方向边长必须能被自然数t整除

这个矩形最小尺寸为或,最大尺寸为[m/s]·s×[m/t]·t 或[m/t]·t×[m/s]·s。其中[]为取整函数

一个大小的窗口有78460个特征矩形

 

1.5.2积分图:提升速度

类比于积分,我们经常要计算,只需要简单的加减就可以完成积分的运算,积分图能够在多种尺度下,使用相同的时间来计算特征,从而提高了检测速度。

其计算方法为

l   图像区域的特征值计算

1.5.3Adaboost训练算法

  • 算法流程图

1.5.4Cascade级联检测法[7]

级联强分类器的策略是,将若干个强分类器由简单到复杂排列,希望经过训练使每个强分类器都有较高检测率,而误识率可以放低,比如几乎99%的人脸可以通过,但50%的非人脸也可以通过,这样如果有20个强分类器级联,那么他们的总识别率为0.99^20约等于98%,错误接受率也仅为0.5^20约等于0.0001%。

设K是一个级联检测器的层数,D是该级联分类器的检测率,F是该级联分类器的误识率,di是第i层强分类器的检测率,fi是第i层强分类器的误识率。如果要训练一个级联分类器达到给定的F值和D值,只需要训练出每层的d值和f值,这样:

d^K = D, f^K = F

级联分类器的要点就是如何训练每层强分类器的d值和f值达到指定要求。

1.6未来改进

1.使用DCT离散余弦变换处理图像,加快检测速度。但由于经过dct变换后的图像需要重新提取特征,因此在本报告中不加处理。

%对图像DCT变换

dctgrayImage=dct2(grayImage);

figure(), imshow(log(abs(dctgrayImage)),[]),title(‘DCT变换灰度图像’), colormap(gray(4)), colorbar;

 

 

 

参考文献

1.Robust Real-time Object Detection. Paul Viola, Michael Jones. IJCV 2004.
  1. Viola P. Jones M. J. Rapid Object Detection using a Boosted Cascade of Simple Features Computer Vision and Pattern Recognition, 2001 Volume 1, 8-14
  2. Viola P. Jones M. J. Robust Real-time Object Detection Cambridge Research Laboratory, Technical Report Series CRL 2001/01 

  3. 赵楠.基于AdaBoost算法的人脸检测[D].北京大学.2015
  1. Jain A K , LinH, Bolle R. Anidentity — authenticationsys t e m u s i n g fi n g e r p r i n t s [ J [ . P r o c e e d i n g o f t h e I E E E , 1 9 9 7 , 8 5 ( 9 ) : 1 3 6 5 — 1 3 8 7 .
  2. MaioD,MaltoniD.DirectGray—ScaleMinutiaeDetectioninFingerprints[J].[IEEE TransactiononPaternAnalysisandMachineInteli— gence,1997,20(1):27—40.
  3. Quinlan. Induction of decision trees. Machine Learning, 1:81–106, 1986.