在人脸检测中,Viola-Jones人脸检测算法是一个经典的算法,由Viola.P.和 Jones.M在2001年的CVPR上提出。主要通过利用Haar特征结合adaboost算法进行训练,然后建立级连分类器分类。优点是速度快,正脸检测高效;缺点是对侧脸检测不够稳健。
Haar特征
由Viola和Jones根据Haar小波的方法开发(由Rainer Lienhart改进为Haar-like特征,用于目标检测)。Haar特征的作用有点类似卷积核,即通过下图中的矩形窗口,将检测窗口中的黑色矩形下的像素之和中减去白色矩形下的像素之和,结果作为特征值。然后遍历所有像素得到的即为Haar特征。
这样不同的矩形窗口可以获得不同的图像特征:
而在人脸图像中会有一些基本的共性:眼睛、眉毛、鼻子和嘴巴的位置相对固定,鼻子比周围亮等等。这样,Viola-Joines算法就通过Haar特征获得了人脸的共有属性。
产生的问题
按上述方法获得Haar特征会产生两个问题:
- 运算量问题;
- 特征选择问题;
运算量问题:
在获得Haar特征的时候,一个图像中可选择矩形窗口有大有小。若每个矩形窗口都用遍历所有像素再求和,那么就会产生巨大的运算量(一个24x24的窗口也会产生超过160000个特性)。这里采用的解决办法是引入积分图像,参见积分图像。
特征选择问题:
特征选择问题即如何从如此多的Haar特征中选择最佳特征。这里采用Adaboost算法。在训练数据(包含人脸的和不包含人脸的图像)中对于每个特征,找到正确分类的最佳阈值,然后选择错误率最小的特征。每次分类之后,增加错误分类的图像的权重,然后执行相同的过程,计算新的错误率及新的权重。直到达到所需的准确度、错误率或找到所需数量的特征为止。opencv中最终选择的特征有6000个左右。
另外,在图像中,大部分图像是非人脸区域。为减少检测时间这里引入了分类器级联。即不在检测窗口上应用全部的6000个特征,而是分为不同的阶段逐一应用。那些非人脸的部分在开始阶段就会被丢弃;这样,可以花费更多时间检查可能的人脸区域。
如图,200个特征即能达到95%的准确度(横轴为假阳性率FPR,纵轴为真阳性率TPR):
OpenCV中的应用:
利用OpenCV自带的haarcascade_frontalface_alt.xml文件进行简单的人脸识别。haarcascade_frontalface_alt.xml文件位于opencv安装目录下的…/data/haarcascades/中。
示例:
#include "opencv2/opencv.hpp"
#include "opencv2/objdetect/objdetect.hpp"
using namespace std;
using namespace cv;
int main( int argc, char** argv )
{
Mat src;
CascadeClassifier face_cascade;
src =imread("E:/image/image/faces.jpg",1);
if (src.empty())
{
printf("can not load the image...\n");
return -1;
}
if( !face_cascade.load("haarcascade_frontalface_alt.xml") )
{
printf("can not load the file...\n");
return -1;
}
vector<Rect> faces;
Mat gray_image;
cvtColor( src, gray_image, CV_BGR2GRAY );
//直方图均衡化
equalizeHist( gray_image, gray_image );
face_cascade.detectMultiScale( gray_image, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(1, 1) );
//框选出脸部区域
for (int i = 0; i < faces.size(); i++)
{
RNG rng(i);
Scalar color = Scalar(rng.uniform(0,255), rng.uniform(0,255), 20);
rectangle(src, faces[static_cast<int>(i)], color, 2, 8, 0);
}
imshow("face", src );
waitKey(0);
return 0;
}
Robust Real-Time Face Detection
OpenCV:Face Detection using Haar Cascades
An Extended Set of Haar-like Features for Rapid Object Detection