想要训练专属人脸识别模型

2020-01-21 19:06 人物

想要训练专属人脸识别模型?先掌握构建人脸数据集的三种绝招

AI 研习社按,随着深度学习的发展,很多技术已经落地,成为我们每天都能接触到的产品,人脸识别就是其中之一。人脸识别的应用范围很广,涉及上下班打卡、门禁、设备登录、机场、公共区域的监控等多个领域。

我们可以自己训练定制化的人脸识别模型,但在训练模型识别图片或视频中的人脸之前,最重要的一个步骤是收集人脸数据集。如果使用已经设计好的公开数据集,比如 Labeled Faces in the Wild(LFW),这时候最难的一部分工作已经完成了,大家可以直接使用各种模型创造自己的人脸识别应用。

但是对于大多数人来说,我们想要识别的并不是目前开源的人脸数据集中的人脸,而是我们自己、朋友、家人、同事等等的脸。为了实现这个目标,我们需要收集自己想要识别的人脸,并按照某种方式处理好它们。这个过程通常被称为人脸登记,我们将用户作为一个样本『登记』或者『注册』到我们的数据集中。下面会介绍三种方法进行人脸登记,大家可以根据自己的情况选择最合适的方法。

如何创建定制的人脸识别数据集首先我将介绍使用 OpenCV 和一颗摄像头来检测视频流中的人脸,并将带有人脸的图像帧保存到硬盘上。接下来我会列举几种用程序自动从上下载人脸图片的方法。最后,我们将讨论人工收集图像,以及在什么情况下这种方法是合适的。

现在开始构建一个人脸识别数据集吧!

方法 1:通过 OpenCV 和摄像头登记人脸该方法适用于:

1. 构建一个某区域内的人脸识别系统

2. 对于目标人脸,能够找到特定的人并收集他们的人脸图像

这样的系统适用于公司、学校或者其他组织,在这里人们会每天不定时的出现。

为了得到这些人的人脸样本,我们会在一个房间内放置好电脑和摄像机,通过摄像机捕捉目标人脸在摄像画面中的人脸信息,将并包含人脸的图像帧保存到硬盘中。

收集不同条件下的目标人脸样本可能会需要几天或几周的时间,这样能使得人脸数据集足够丰富,很好地表示不同状态下的人脸,保证训练出来模型有足够的鲁棒性,收集的人脸包括:

不同亮度下的人脸

每天不同时候,不同光线角度下的人脸

不同表情和情绪状态下的人脸

接下来我们更进一步,写一个简单的 Python 脚本来构建人脸识别数据集,这个脚本会做如下工作:

连接并控制摄像头

检测人脸

将包含人脸的图像帧写入硬盘

打开一个叫 build_face_ 的 Python 脚本,首先导入一些必要的库,包括 OpenCV 和 imutils

1 # import the necessary packages

2 from deo import VideoStream

3 import argparse

4 import imutils

5 import time

6 import cv2

7 import os

可以参考这篇文章安装 OpenCV:

imutils 可以通过 pip 安装:pip install --upgrade imutils

如果使用的是 Python 虚拟环境,不要忘记使用 workon 命令

现在环境已经配置好了,接下来讨论两个必要的命令行参数:

9 # construct the argument parser and parse the arguments

10 ap = gumentParser()

11 d_argument(-c, --cascade, required=True,

12 help = path to where the face cascade resides)

13 d_argument(-o, --output, required=True,

14 help=path to output directory)

15 args = vars(rse_args())

命令行参数可以通过 argparse 库在运行时解析,这个库是包含在 Python 安装中的。

我们有两个命令行参数:

--cascade:硬盘中的 Haar cascade 文件路径,用于 OpenCV 检测人脸

--output:输出的文件路径。人脸图像将会被保存到该路径中,因此最好按照人名将人脸分类保存,比如将『John Smith』的人脸图像保存到 dataset/john_smith 的路径下

接下来加载人脸的 Haar cascade 文件并初始化视频流:

17 # load OpenCVs Haar cascade for face detection from disk

18 detector = scadeClassifier(args[cascade])

19

20 # initialize the video stream, allow the camera sensor to warm up,

21 # and initialize the total number of example faces written to disk

22 # thus far

23 print([INFO] starting video stream...)

24 vs = VideoStream(src=0).start()

25 # vs = VideoStream(usePiCamera=True).start()

26 eep(2.0)

27 total = 0

在第 18 行,我们加载了 OpenCV 的 Haar 人脸检测器 detector。 这个 detector 将会在接下来每帧的循环中检测人脸;在 24 行会初始化并开启视频流 VideoStreem;如果使用的是树莓派的话,注释掉第 24 行的代码,使用第 25 行的代码;第 26 行让摄像头先热个身,暂停两秒钟;这一段代码也初始化了 total 计数器来表示保存的人脸图片的数量。

接下来,就开始对视频流的每帧图像进行处理:

29 # loop over the frames from the video stream

30 while True:

31 # grab the frame from the threaded video stream, clone it, (just

32 # in case we want to write it to disk), and then resize the frame

33 # so we can apply face detection faster

34 frame = ad()

35 orig = py()

36 frame = size(frame, width=400)

37

38 # detect faces in the grayscale frame

39 rects = tectMultiScale(

40 tColor(frame, LOR_BGR2GRAY), scaleFactor=1.1,

41 minNeighbors=5, minSize=(30, 30))

42

43 # loop over the face detections and draw them on the frame

44 for (x, y, w, h) in rects:

45 ctangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

在第 30 行, 开始循环(循环在『q』键被按下之后结束); 行,捕捉一帧画面:frame,创建一个copy,改变大小。

接下来就是人脸检测了!

使用 detectMultiScale 方法在每帧画面中检测人脸,这个函数需要如下参数:

image:一个灰度图像

scaleFactor:指定在每个维度图像尺寸减少的比例

minNeighbor:该参数指定候选的检测框数量,以保证检测是有效的

minSize:最小的人脸图像尺寸

在某些特殊场景下,可能需要精调这些参数以减少 false positive 的数量或提高人脸的检测率,但是对于一些普通的人脸检测任务来说,这些参数就可以很好的工作了。

其实也还有一些其他更好的方法检测人脸,比如在之前的文章中提到过,可以使用预训练好的深度学习模型来检测人脸。但是本文里提到的使用 OpenCV 的方法的优点是无需调参,而且速度非常快。

人脸检测的结果被保存在一个 rects 的列表中(矩形检测框)。为了将这些矩形画在图像上,在 44、45 行中遍历所有矩形框,并将他们画在图片上。

最后一步就是将检测框显示在屏幕上,以及解决按键退出的问题:

48 # show the output frame

49 show(Frame, frame)

50 key = itKey(1) 0xFF

51

52 # if the `k` key was pressed, write the *original* frame to disk

53 # so we can later process it and use it for face recognition

54 if key == ord(k):

55 p = in([args[output], {}.rmat(

56 str(total).zfill(5))])

57 write(p, orig)

58 total += 1

59

60 # if the `q` key was pressed, break from the loop

61 elif key == ord(q):

62 break

第 48 行执行将该帧图像显示在屏幕上,第 49 行执行捕捉键盘指令

『k』、『q』键盘指令对应不同的命令:

k:保留该帧图像并保存到硬盘中( 行),同时增加 total 计数器。对每个想要保存的图像帧,都需要按『k』来保存。为了能够更好地训练模型,最好要保存不同角度、人脸在画面不同位置、带/不带眼镜的图像。

q:退出循环,退出脚本

最后,将保存的图片数量打印到屏幕上,并清空缓存:

64 # print the total faces saved and do a bit of cleanup

65 print([INFO] {} face images rmat(total))

66 print([INFO] cleaning up...)

67 stroyAllWindows()

68 op()

接下来,只需在终端里运行如下命令就可以了:

$ python build_face_ --cascade haarcascade_frontalface_l \

--output dataset/adrian

[INFO] starting video stream...

[INFO] 6 face images stored

[INFO] cleaning up...

这里推荐将每个人的人脸数据保存在数据集下的一个子文件夹内,这样能够保证数据集条理清晰,易于管理。

方法 2:使用程序自动下载人脸图片??

在这种场景下,我们并不需要真的找到那个人拍摄图片

想要训练专属人脸识别模型痛经怎么调理根治
血管堵塞心梗吃通心络可以吗
严重脑梗死