内容简介:雷锋网 AI 研习社按,随着深度学习的发展,很多技术已经落地,成为我们每天都能接触到的产品,人脸识别就是其中之一。人脸识别的应用范围很广,涉及上下班打卡、门禁、设备登录、机场、公共区域的监控等多个领域。我们可以自己训练定制化的人脸识别模型,但在训练模型识别图片或视频中的人脸之前,最重要的一个步骤是收集人脸数据集。如果使用已经设计好的公开数据集,比如 Labeled Faces in the Wild(LFW),这时候最难的一部分工作已经完成了,大家可以直接使用各种模型创造自己的人脸识别应用。但是对于大多数
雷锋网 AI 研习社按,随着深度学习的发展,很多技术已经落地,成为我们每天都能接触到的产品,人脸识别就是其中之一。人脸识别的应用范围很广,涉及上下班打卡、门禁、设备登录、机场、公共区域的监控等多个领域。
我们可以自己训练定制化的人脸识别模型,但在训练模型识别图片或视频中的人脸之前,最重要的一个步骤是收集人脸数据集。如果使用已经设计好的公开数据集,比如 Labeled Faces in the Wild(LFW),这时候最难的一部分工作已经完成了,大家可以直接使用各种模型创造自己的人脸识别应用。
但是对于大多数人来说,我们想要识别的并不是目前开源的人脸数据集中的人脸,而是我们自己、朋友、家人、同事等等的脸。为了实现这个目标,我们需要收集自己想要识别的人脸,并按照某种方式处理好它们。这个过程通常被称为人脸登记,我们将用户作为一个样本『登记』或者『注册』到我们的数据集中。下面会介绍三种方法进行人脸登记,大家可以根据自己的情况选择最合适的方法。
如何创建定制的人脸识别数据集
首先我将介绍使用 OpenCV 和一颗摄像头来检测视频流中的人脸,并将带有人脸的图像帧保存到硬盘上。接下来我会列举几种用程序自动从网上下载人脸图片的方法。最后,我们将讨论人工收集图像,以及在什么情况下这种方法是合适的。
现在开始构建一个人脸识别数据集吧!
方法 1:通过 OpenCV 和摄像头登记人脸
该方法适用于:
1. 构建一个某区域内的人脸识别系统
2. 对于目标人脸,能够找到特定的人并收集他们的人脸图像
这样的系统适用于公司、学校或者其他组织,在这里人们会每天不定时的出现。
为了得到这些人的人脸样本,我们会在一个房间内放置好电脑和摄像机,通过摄像机捕捉目标人脸在摄像画面中的人脸信息,将并包含人脸的图像帧保存到硬盘中。
收集不同条件下的目标人脸样本可能会需要几天或几周的时间,这样能使得人脸数据集足够丰富,很好地表示不同状态下的人脸,保证训练出来模型有足够的鲁棒性,收集的人脸包括:
-
不同亮度下的人脸
-
每天不同时候,不同光线角度下的人脸
-
不同表情和情绪状态下的人脸
接下来我们更进一步,写一个简单的 Python 脚本来构建人脸识别数据集,这个脚本会做如下工作:
-
连接并控制摄像头
-
检测人脸
-
将包含人脸的图像帧写入硬盘
打开一个叫 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 行让摄像头先热个身,暂停两秒钟;这一段代码也初始化了 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 研习社编译整理 雷锋网 (公众号:雷锋网)
雷锋网版权文章,未经授权禁止转载。详情见 转载须知 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 运维老鸟分享-学好Linux技术大绝招
- 让 API 并行调用变得如丝般顺滑的绝招
- 【火炉炼AI】机器学习053-数据降维绝招-PCA和核PCA
- 人脸专集(三):人脸关键点检测(下)
- 应用层下的人脸识别(二):人脸库
- 应用层下的人脸识别(三):人脸比对
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Linux程序设计
马修 / 陈健 / 人民邮电出版社 / 2007-7 / 89.00元
《Linux 程序设计(第3版)》讲述在Linux系统及其他UNIX风格的操作系统上进行的程序开发,主要内容包括标准Linux C语言函数库和由不同的Linux或UNIX标准指定的各种工具的使用方法,大多数标准Linux开发工具的使用方法,通过DBM和MySQL数据库系统对Linux中的数据进行存储,为X视窗系统建立图形化用户界面等。《Linux 程序设计(第3版)》通过先介绍程序设计理论,再以适......一起来看看 《Linux程序设计》 这本书的介绍吧!