农企新闻网

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

发布者:丁夕远
导读雷锋网(大众号:雷锋网)AI 研习社按,随着深度学习的开展,很多技术曾经落地,成为我们每天都能接触到的产品,人脸辨认就是其中之一。人脸辨认的使用范围很广,触及上上班打卡、门禁、设备登录、机场、公共区域的监控等多个范畴。我们可以本人训练定制化的人脸辨认模型,但在训练模型辨认图片或视频中的人脸之前,最重要的一个步骤是搜集人脸数据集。假如运用曾经设计好的地下数据集,比方 Labeled Faces in

雷锋网 (大众号:雷锋网) AI 研习社按,随着深度学习的开展,很多技术曾经落地,成为我们每天都能接触到的产品,人脸辨认就是其中之一。人脸辨认的使用范围很广,触及上上班打卡、门禁、设备登录、机场、公共区域的监控等多个范畴。

我们可以本人训练定制化的人脸辨认模型,但在训练模型辨认图片或视频中的人脸之前,最重要的一个步骤是搜集人脸数据集。假如运用曾经设计好的地下数据集,比方 Labeled Faces in the Wild(LFW),这时分最难的一局部任务曾经完成了,大家可以直接运用各种模型发明本人的人脸辨认使用。

但是关于大少数人来说,我们想要辨认的并不是目前开源的人脸数据集中的人脸,而是我们本人、冤家、家人、同事等等的脸。为了完成这个目的,我们需求搜集本人想要辨认的人脸,并依照某种方式处置好它们。这个进程通常被称为人脸注销,我们将用户作为一个样本『注销』或许『注册』到我们的数据集中。上面会引见三种办法停止人脸注销,大家可以依据本人的状况选择最适宜的办法。

如何创立定制的人脸辨认数据集

首先我将引见运用 OpenCV 和一颗摄像头来检测视频流中的人脸,并将带有人脸的图像帧保管到硬盘上。接上去我会罗列几种用顺序自动从网上下载人脸图片的办法。最初,我们将讨论人工搜集图像,以及在什么状况下这种办法是适宜的。

如今开端构建一团体脸辨认数据集吧!

办法 1:经过 OpenCV 和摄像头注销人脸

该办法适用于:

1. 构建一个某区域内的人脸辨认零碎

2. 关于目的人脸,可以找到特定的人并搜集他们的人脸图像

这样的零碎适用于公司、学校或许其他组织,在这里人们会每天不定时的呈现。

为了失掉这些人的人脸样本,我们会在一个房间内放置好电脑和摄像机,经过摄像机捕获目的人脸在摄像画面中的人脸信息,将并包括人脸的图像帧保管到硬盘中。

搜集不同条件下的目的人脸样本能够会需求几天或几周的工夫,这样能使得人脸数据集足够丰厚,很好地表示不同形态下的人脸,保证训练出来模型有足够的鲁棒性,搜集的人脸包括:

  • 不同亮度下的人脸

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

  • 不同表情和心情形态下的人脸

接上去我们更进一步,写一个复杂的 Python 脚原本构建人脸辨认数据集,这个脚本会做如下任务:

  1.  衔接并控制摄像头

  2.  检测人脸

  3.  将包括人脸的图像帧写入硬盘

翻开一个叫 build_face_dataset.py 的 Python 脚本,首先导入一些必要的库,包括 OpenCV 和 imutils 

1 # import the necessary packages

2 from imutils.video 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 = argparse.ArgumentParser()

11 ap.add_argument("-c", "--cascade", required=True,

12 help = "path to where the face cascade resides")

13 ap.add_argument("-o", "--output", required=True,

14 help="path to output directory")

15 args = vars(ap.parse_args())

命令行参数可以经过 argparse 库在运转时解析,这个库是包括在 Python 装置中的。

我们有两个命令行参数:

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

  • --output:输入的文件途径。人脸图像将会被保管到该途径中,因而最好依照人名将人脸分类保管,比方将『John Smith』的人脸图像保管到 dataset/john_smith 的途径下

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

17 # load OpenCV's Haar cascade for face detection from disk

18 detector = cv2.CascadeClassifier(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 time.sleep(2.0)

27 total = 0

在第 18 行,我们加载了 OpenCV 的 Haar 人脸检测器 detector。 这个 detector 将会在接上去每帧的循环中检测人脸;在 24 行会初始化并开启视频流 VideoStreem;假如运用的是树莓派的话,正文掉第 24 行的代码,运用第 25 行的代码;第 26 大多数人都曾因不佳的交通状况而迟过到、叫过苦。经济的快速发展带动的是社会各方面的全面提升,但在此过程中,交通的发展却没跟得上前进的步幅,各类交通难题让交管部门伤透脑筋,如何利用AI来解决相关难题已成当务之急。行让摄像头先热个身,暂停两秒钟;这一段代码也初始化了 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 = vs.read()

35 orig = frame.copy()

36 frame = imutils.resize(frame, width=400)

37

38 # detect faces in the grayscale frame

39 rects = detector.detectMultiScale(

40 cv2.cvtColor(frame, cv2.COLOR_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 cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

在第 30 行, 开端循环(循环在『q』键被按下之后完毕);34-36 行,捕获一帧画面:frame,创立一个copy,改动大小。

接上去就是人脸检测了!

运用 detectMultiScale 办法在每帧画面中检测人脸,这个函数需求如下参数:

image:一个灰度图像

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

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

minSize:最小的人脸图像尺寸

在某些特殊场景下,能够需求精调这些参数以增加 false positive 的数量或进步人脸的检测率,但是关于一些普通的人脸检测义务来说,这些参数就可以很好的任务了。

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

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

最初一步就是将检测框显示在屏幕上,以及处理按键加入的成绩:

48 # show the output frame

49 cv2.imshow("frame", frame)

50 key = cv2.waitKey(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 = os.path.sep.join([args["output"], "{}.png".format(

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

57 cv2.imwrite(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:保存该帧图像并保管到硬盘中(53-56 行),同时添加 total 计数器。对每个想要保管的图像帧,都需求按『k』来保管。为了可以更好地训练模型,最好要保管不同角度、人脸在画面不同地位、带/不带眼镜的图像。

  • q:加入循环,加入脚本

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

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

65 print("[INFO] {} face images stored".format(total))

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

67 cv2.destroyAllWindows()

68 vs.stop()

接上去,只需在终端里运转如下命令就可以了:

$ python build_face_dataset.py --cascade haarcascade_frontalface_default.xml

--output dataset/adrian

[INFO] starting video stream...

[INFO] 6 face images stored

[INFO] cleaning up...

这里引荐将每团体的人脸数据保管在数据集下的一个子文件夹内,这样可以保证数据集条理明晰,易于管理。

办法 2:运用顺序自动下载人脸图片

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

在这种场景下,我们并不需求真的找到那团体拍摄图片,只需他们常常呈现在网上,我们可以在网上找到足够多的图片即可,这样就可以写脚本,经过各个平台的 API 下载这些图片了。

详细运用哪些 API 次要取决于想要搜集的人的人脸信息,比方一团体常常在 Twitter 或许 Instagram 上发自拍,那么我们就可以运用这些平台的 API 来抓取图片。

还可以运用 Google 和 Bing 等搜索引擎来抓取:

在这篇 博文 中,可以找到运用 Google Images 手动或许运用脚原本下载图片的办法。

另一个更好的办法就是运用 Bing 的图片搜索 API,这样可以全自动下载图像,详细办法参见这篇 博文 。

运用 Bing 图片搜索 API,我们可以从侏罗纪公园和侏罗纪世界这两部电影的海报中下载 218 张 Alan Grant 的脸部图片。上面展现了经过 Bing 图片搜索 API 下载演员 Owen Grady 的脸部图片的代码:

1 $ mkdir dataset/owen_grady

2 $ python search_bing_api.py --query "owen grady" --output dataset/owen_grady

运用这种办法下载几团体的人脸图像之后,我们看看整个数据集长什么样

1 $ tree jp_dataset --filelimit 10

2 jp_dataset

3 ├── alan_grant [22 entries]

4 ├── claire_dearing [53 entries]

5 ├── ellie_sattler [31 entries]

6 ├── ian_malcolm [41 entries]

7 ├── john_hammond [36 entries]

8 └── owen_grady [35 entries]

9

10 6 directories, 0 files

只需 20 分钟左右(包括手动挑出错误图像的工夫),就可以做好一个侏罗纪公园的人脸数据集了。

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


办法 3:手动搜集人脸图像

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

最初一个办法就是全手动搜集人脸数据集,这是最不引荐的办法。这种办法显然是最繁琐的,而且需求少量工夫。但是在某些特殊状况下,能够不得不运用这些办法。

手动搜集的话,通常需求:

  • 运用搜索引擎搜索

  • 阅读社交媒体账号(Ins, 微博,微信等)

  • 图片分享效劳(Google Photos, Flickr,500px 等)

你需求手动将这些构造图片保管到硬盘上,通常只要需求搜集大批图片的时分才运用这种办法。

总结

在本篇博文中,一共回忆了构建自有人脸数据集的三种办法,详细选择哪种办法取决于你想要用这个数据集来做什么。

假如你想要构建一个某一区域内的人脸辨认零碎,例如用于教室、公司或许其他组织的人脸辨认零碎,最好的办法是将需求辨认的人请到一个房间里,经过第一种办法在摄像头的视频流中搜集人脸数据。

假如你想要构建一个包括大众人物、明星、运发动等的人脸辨认零碎,那么能够只可以在网上搜集到他们的图像。在这种状况下,最好的办法是运用各平台的 API 自动下载样本图片(办法 2)

最初,假如要搜集的人并没有地下社交账号,或许社交账号上很少发布图片,那就能够需求手动搜集并管理数据集了(办法 3)。这种办法显然是最繁琐的,但是在某些状况下,能够不得不这样做。

一切代码和必要的库都可以在 原博文 中下载到,只需填写你的邮箱地址即可~

via pyimagesearch

雷锋网 AI 研习社编译整理 雷锋网

雷锋网版权文章,未经受权制止转载。概况见。

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