在Matlab中使用Viola-Jones算法进行人脸检测
人脸检测是区分图像或视频中人脸和非人脸物体的能力。Viola-Jones算法是一个物体识别框架,可以检测人脸。Viola-Jones算法尽管已经过时,但却很稳健、强大,而且速度更快。
在这篇文章中,我们将研究如何使用Viola-Jones算法来实时检测人脸。
前提条件
- 在你的计算机上安装有Matlab。
- 具备Matlab和计算机视觉工具箱的基本知识。
对人脸检测的需求
有几个项目需要人脸作为其实施的主要输入。
一些项目可能包括。
- 人脸识别。
- 基于人脸识别的安全系统和考勤系统。
- 面部表情识别。
- 基于面部表情的情绪分析,以及更多。
维奥拉-琼斯算法
保罗-维奥拉和迈克尔-琼斯在2001年开发了维奥拉-琼斯算法。这个算法使我们能够检测人脸。该算法有四个阶段。
- 类似Haar的特征选择。
- 创建一个整体图像。
- Adaboost训练。
- 级联分类器。
MATLAB有vision.CascadeObjectDetector 系统对象,其中有用于检测人脸/物体的viola-jones算法,它可以在计算机工具箱中找到。cascadeObjectDetector ,可用于检测人的面部、鼻子、眼睛、嘴和上身。
vision.CascadeObjectDetector 它与几个预先训练好的分类器捆绑在一起,用于检测正面的脸、侧面的脸、鼻子、眼睛和上半身。
虽然,这些分类器不一定能满足特定的应用。可以通过计算机视觉工具箱在图像数据库上训练自定义分类器。
运行下面的命令来验证计算机视觉工具箱是否已经安装在你的计算机上。
>> v = ver;
>> setdiff({v.name},'MATLAB')'
当这段代码被执行时,它会显示所有已安装的Matlab工具箱。
如果你没有计算机视觉工具箱。
- 点击
adds-ons下拉菜单,选择get more apps。在你的浏览器中会打开一个新的标签。 - 点击搜索框,写上
computer vision toolbox。 - 一旦搜索完成,选择
Computer Vision Toolbox Interface for Open CV in MATLAB,并点击下载按钮。 - 一旦下载完成,安装该软件包,这将要求你
login,进入你的数学工作账户。如果你没有账户,请点击create account按钮。 - 按照说明来安装软件包。
对于面部或上半身的图像检测。
- 创建
vision.CascadeObjectDetector对象并设置其属性。 - 用参数调用该对象,就像它是一个函数一样。
用于检测面部的图像可以直接读取,也可以根据用户的偏好从文件中选择。当你通过使用imshow 命令直接添加图像时,它将显示检测到的人脸。
Imshow(‘engineers.jpg’)
目前,你不需要直接添加图像,因为可能有很多图像要用于检测。在这种情况下,你从文件中选择图像。
为此,你可以使用下面的代码。
[filename,filepath] = uigetfile('*.*','select an image');
你首先读取图像的路径,然后使用imshow 命令读取图像。
Filewithpath = strcat(filepath,filename)
Img = imread(filewithpath)
我们定义的图像将被保存在变量Img 。
定义人脸检测器对象。
faceDetector = vision.CascadeObjectDetector
然后我们使用vision.CascadeObjectDetector 中的一个属性,即:MergeThreshold 。这将用于更好的检测和准确性。
faceDetector.MergeThreshold = 4;
在这种情况下,4是默认值。MergeThreshold ,可以根据所需的精确度水平进行调整。准确度在低值时较高,在高值时较低,即人脸检测准确度在3时比8时高。
请注意,MergeThreshold 是一个整数。
Boundingboxes = faceDetector(Img)
当我们执行上面的代码时,它会返回一个m乘4的矩阵边界盒。这决定了包含检测对象的M个边界盒。该检测器对输入图像进行多尺度人脸检测,Img 。
然后我们引入检测的条件。第一个条件是人脸被检测到时。当在图像中检测到人脸时,它应该返回一个围绕检测到的人脸的边界框。
然后我们在一个矩形中插入带有人脸名称的注释。线宽是边界框的厚度,它可以被改变为任何值。
注意,这些值是以像素为单位的,所以它决定了以像素为单位的边界框的厚度。然后我们用imshow 命令来显示图像。
下面是代码。
if ~isempty(bboxes)
Imf = insertObjectAnnotation(img,'rectangular',bboxes,'Faces','linewidth',30);
imshow(Imf)
title('detected faces')
第二个条件是如果没有检测到人脸。我们在location [0 0] ,也就是x-axis ,和y-axis ,插入文字,标签是'没有检测到脸'。你可以改变这个文本框的字体大小和不透明度,并显示图像。
这里是代码。
else
position = [0 0];
label='no face detected';
Imgn = insertText(Img,position,label, 'fontsize',25,'BoxOpacity',1);
imshow(Imgn)
end
下面是整个应用程序的源代码。
Img = imread('building.jpg');
faceDetector = vision.CascadeObjectDetector;
faceDetector.MergeThreshold = 4;
bboxes = faceDetector(img);
if ~isempty(bboxes)
Imf = insertObjectAnnotation(Img,'rectangle',boundingboxes,'Faces','linewidth',3);
imshow(Imf)
title('detected faces')
else
position = [0 0];
label='no face detected';
imgn = insertText(img,position,label, 'fontsize',25,'BoxOpacity',1);
imshow(imgn)
end
当我们运行该程序时,在我们的图窗口上会显示以下图像。

当我们使用一个没有面孔的图像时,在我们的图形窗口中显示如下。

图
这段代码也可以用来检测眼睛、嘴巴和/或鼻子。你只需要改变名称,也就是用鼻子代替脸。你需要改变MergeThreshold以保证准确性。
结论
Viola-jones算法是实时检测人脸对象的最佳算法。它既准确又快速,这使得它在检测过程中使用时非常有效。