如何用Matlab创建一个人脸数据库

280 阅读5分钟

如何使用Matlab创建一个人脸数据库

人脸数据库是在测试人脸处理算法时使用的图像数据,如用于人脸识别的主成分分析(PCA)

在本教程中,我们将学习用MATLAB编码,以便从人脸数据库中识别人脸。

数据库如何工作,取决于你要使用的算法类型和你要实施的项目。例如,PCA使用特征空间来识别数据库中的人脸。

这个程序的框架可以用来为其他许多物体创建数据库,而不仅仅是人脸。在这种情况下,我们将使用WEBCAM来拍摄一些所需的脸部快照来建立数据库。

前提条件

要跟上本教程的进度--读者需要具备以下条件。

  1. 必须在你的电脑上安装Matlab
  2. 必须安装一个网络摄像机。
  3. 有一点Matlab的知识。

如何安装网络摄像头?

  1. 在你的电脑上打开Matlab软件。
  2. Home 部分,点击Add-Ons 下拉箭头,然后选择Get hardware support packages

Matlab dashboard

Matlab仪表板屏幕

  1. 在搜索标签上,输入包的名称,即Matlab支持包的USB包,然后搜索。

Search page

搜索页面

  1. 点击MATLAB Support Package for USB
  2. 点击Install ,进行安装。

Hardware installation page

硬件安装界面

由于该软件包已经安装在我的电脑中,Install 按钮显示为Manage

使用Matlab创建人脸数据库

本教程的主要目的是创建一个用户自己的人脸数据库。这使我们更容易理解和进行需要人脸数据库的各种项目。

我们首先初始化网络摄像头。

cam = webcam;

然后我们输入所需数量的人脸nof ,以建立我们的数据库。

它是由下面的代码执行的。

nof = input('enter no. of required frames:');

我们输入所需的帧数count ,我们将count 设置为1

例如,如果你需要20或100张图片,你可以在这里修改所需的帧数。

count = 1;

然后我们初始化count ,进入while 循环。当count 小于或等于所需帧数nof ,那么while 循环将被执行,快照被捕获。

然后,捕获的图像被存储到img ,并将其传递给myFaceDetect 函数。

这个函数应该被定义在一个下标中,然后调用到主函数中。myFaceDetect 函数的描述在程序的最后给出。

while count <= nof
img = snapshot(cam);

下面的代码使用myFaceDetect 函数返回裁剪后的图像,该函数返回croppedframe 和边界框点bboxpoint

[croppedFrame, bboxpoint] = myFaceDetect(img);
imshow(croppedFrame)

注意,在上面的代码中,我们感兴趣的不是边界框bboxpoint ,而是框架。裁剪后的框架将被存储在同一目录中。

然后我们将使用ifelse 语句来介绍运行程序的条件。

如果裁剪后的框架不是空的,这意味着人脸被检测到了,我们得到的是一个裁剪后的框架,你可以把它存储到你的任何文件夹中。

最好是创建一个单独的文件夹。

然后我们指定该文件夹的路径,如图所示。

if ~isempty(croppedFrame)
fileName = strcat('WRITE_YOUR_FOLDER_PATH',sprintf(‘%d.png’,count));

然后我们使用imwrite ,将裁剪后的帧与相应的文件名一起写入该目录中。

imwrite(croppedFrame,'WRITE_YOUR_FILENAME');
msg = ['imageAcquiredNo:',num2str(count)]
disp(msg)
count = count + 1;

A Sample face image

一张脸的样本图像

num2str 函数提供了文件名。这意味着,由于计数是从1n 开始的,而这是给定的帧的数量。所以,文件名将以数字的形式出现。

在上面的文件名中,我们的文件格式是.png

这意味着,我们希望文件名采用以下形式。imageDatabase1.png,imageDatabase2.png,imageDatabase3.png 直到imageDatabaseN.png

A list of images

一个图像的列表

如果在裁剪后的画面中没有检测到人脸,那么它应该在工作区显示no face detected

这里是代码。

else
disp('no face detected')

下面是ifelse 语句的完整代码。

if ~isempty(croppedFrame)
fileName = strcat('Directory',sprintf('%d.png',count));
imwrite(croppedFrame, fileName)
msg = ['image aquired no:', num2str(count)];
disp(msg)
count = count + 1;
        
else
disp('no face detected')
end

摄像机在0.1s ,并在拍完快照后重置摄像机。

这由下面的代码调节。

clf('reset')
pause(0.1)
end 

pause 的时间可以根据用户的喜好来改变。在这之后,相机对象被清除了。

当你运行程序时,摄像机前面的人的脸被捕捉并存储。这样重复进行,直到获得所需图像的数量。捕捉到的人脸数量会显示在工作区。

当摄像头前的人隐藏了他/她的脸或者摄像头前没有人时,那么工作区就会显示一个文本no face is detected

当没有检测到人脸时,计数停止,当再次检测到人脸时重新开始,直到获得所需的样本。

myFaceDetect 这个函数应该在另一个脚本中定义,然后在人脸数据库脚本中调用。

这个函数返回一个裁剪过的图像和bboxpoint 。在这一点上,我们把重点放在bboxpoint

function [croppedImage, bboxpoints] = myFaceDetect
%introduce the face detector object

faceDetector = vision.CascadeObjectDetector;
faceDetector.MergeThreshold = 10; %adjust to avoid false detection
%add bounding boxbox around the detect face
bboxes = faceDetector(img)

if ~isempty(bboxes)
bboxes(1,1) = bboxes(1,1)-50;
bboxes(1,2) = bboxes(1,2)-50;
bboxes(1,3) = bboxes(1,3)+100;
bboxes(1,4) = bboxes(1,4)+100;

在上面的代码中,我们增加了数值,并在两个方向上增加了包围盒的大小。这使得身体的其他部分,如耳朵,也被包括在内。

%crop the obtained image
croppedImage = imcrop(img,bboxes)
bboxPoints = bbox2points(bboxes(1, :))
%if face is not detected the code below is executed
else
croppedImage = [];
bboxPoints = [];
end

结论

Matlab被用来创建一个图像数据库。这是因为它有一个内置的网络摄像头。这使得它在创建数据库进行分析时很有效率。

该图像数据库还可以用于深度神经系统的训练和验证。这可以帮助物体识别和其他项目。