点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
通过使用网络摄像头检测你的面部来享受 Python 的乐趣
人脸检测是一种识别数字图像中人脸的技术。人脸检测是一项相对成熟的技术——还记得使用数码相机时的美好时光吗?
在相机对焦的时候就能观察到人脸周围的方框,这就是早期的人脸检测技术。
对于人脸检测,最著名的算法之一是Viola-Jones 人脸检测技术,通常称为Haar 级联。Haar 级联早在深度学习流行之前就已发明,并且是最常用的人脸检测技术之一。
人脸检测/识别的伦理考虑
虽然检测和识别人脸的能力绝对很酷,但它肯定具有很多伦理意义。在你的项目中实施面部识别时,你需要注意几个问题,以免你过于超前。隐私(人脸检测可用于在未经同意的情况下跟踪人们的活动)、偏见(人脸检测可能偏向不同种族、性别或年龄的个人)和滥用(捕获的人脸可能用于其他非法用途)等问题或恶意目的)。
因此,虽然本文侧重于人脸检测的技术能力,但在你将其应用到你的工作之前,你应该仔细考虑道德和伦理方面的影响。
以下是一些可以实现人脸检测/识别的低风险项目:
考勤跟踪:你可以在学校或工作场所使用人脸识别来考勤。
个性化:使用人脸识别来个性化服务。一个很好的例子是娱乐服务,例如根据用户的观看历史推荐特定的电视节目。
安全:使用面部识别来解锁非关键系统,例如智能手机和计算机。
然而,在某些应用程序中使用人脸识别具有严重的道德影响。这里有些例子:
执法:虽然人脸识别对执法很有用,但人们对其不准确和偏见存在一些严重担忧。
监视:一些国家已经使用人脸识别技术来监视和跟踪其公民,尤其是持不同政见者。一些公司还使用人脸识别来监控员工的工作效率,这是对员工隐私的直接侵犯。
你可以阅读以下文章以了解更多关于人脸识别的法律和道德问题:
美国的面部识别:隐私问题和法律发展
https://www.asisonline.org/security-management-magazine/monthly-issues/security-technology/archive/2021/december/facial-recognition-in-the-us-privacy-concerns-and-legal-developments/
与面部识别软件相关的隐私和安全问题
https://www.techrepublic.com/article/privacy-and-security-issues-associated-with-facial-recognition-software/
关注面部识别技术的 10 个理由
https://www.privacycompliancehub.com/gdpr-resources/10-reasons-to-be-concerned-about-facial-recognition-technology/
Haar 级联如何工作?
Haar 级联分类器用于检测训练过的对象。如果你对 Haar 级联分类器工作原理背后的数学原理的详细解释感兴趣,请查看 Paul Viola 和 Michael Jones 的论文,网址为:https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf
以下是关于面部 Haar 分类器工作原理的高级概述:
首先,使用一组正图像(人脸图像)和一组负图像(人脸图像)来训练分类器。
然后从图像中提取特征。下图显示了从包含人脸的图像中提取的一些特征。
要从图像中检测人脸,你需要寻找通常在人脸上发现的各种特征(见下图),例如眉毛,眉毛上方的区域比眉毛下方的区域更亮。
当图像包含所有这些特征的组合时,它被认为包含人脸。
幸运的是,无需了解 Haar 级联如何工作,OpenCV可以使用预训练的 Haar 级联以及其他 Haar 级联执行开箱即用的人脸检测,以识别其他对象。
预定义的 Haar 级联列表可在 GitHub 上找到,网址为https://github.com/opencv/opencv/tree/master/data/haarcascades。
Open Source Computer Vision ( OpenCV ) 是一个开源计算机视觉和机器学习软件库,最初由 Intel 开发。它旨在为计算机视觉应用程序提供通用基础设施,并加速机器感知在商业产品中的使用。
OpenCV 附带了几个预训练的 Haar 级联,可以检测眼睛、面部、俄罗斯车牌、微笑等。
对于人脸检测,你需要从上面的github中下载haarcascade_frontalface_default.xml文件。
安装 OpenCV
让我们尝试使用 OpenCV 进行人脸检测。首先,你需要使用以下命令来安装它:
!pip install opencv-python
对于本文中的示例,你需要创建一个名为face_detection.py的文件。首先使用以下语句填充它以导入 OpenCV 库:
import cv2
从网络摄像头读取
接下来是连接到你的网络摄像头并在屏幕上显示图像:
import cv2
# default webcam
stream = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
(grabbed, frame) = stream.read()
# Show the frame
cv2.imshow("Image", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord("q"): # Press q to break out of the loop
break
# Cleanup
stream.release()
cv2.waitKey(1)
cv2.destroyAllWindows()
cv2.waitKey(1)
要引用你的网络摄像头,请使用VideoCapture
类并向其传递一个指示你的网络摄像头实例的数字(对于第一个网络摄像头为0
,对于第二个网络摄像头为1
,以此类推):
stream = cv2.VideoCapture(0)
要连续捕获来自网络摄像头的输入,请使用无限循环 ( while(True)
) 并读取每一帧,然后显示它:
# Capture frame-by-frame
(grabbed, frame) = stream.read()
# Show the frame
cv2.imshow("Image", frame)
要让程序正常退出,请等待用户按下键盘上的某个键。当按下“q”键时,循环终止:
key = cv2.waitKey(1) & 0xFF
if key == ord("q"): # Press q to break out of the loop
break
然后你可以执行清理:
# Cleanup
stream.release()
cv2.waitKey(1)
cv2.destroyAllWindows()
cv2.waitKey(1)
要运行该程序,请转到终端并键入:
$ python face_detection.py
你现在应该看到你的脸:
检测人脸
有趣的部分来了——检测人脸。首先,创建CascadeClassifier
类的一个实例并将其传递给haarcascade_frontalface_default.xml文件:
import cv2
# for face detection
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
你需要复制 haarcascade_frontalface_default.xml 文件并将其放在与 face_detection.py 文件相同的文件夹中。你可以从 (https://github.com/opencv/opencv/tree/master/data/haarcascades)下载 XML 文件。
你现在可以使用以下detectMultiScale()
函数检测人脸:
while(True):
# Capture frame-by-frame
(grabbed, frame) = stream.read()
#===============DETECTING FACES============
# Convert to grayscale
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Try to detect faces in the webcam
faces = face_cascade.detectMultiScale(gray,
scaleFactor=1.3,
minNeighbors=5)
# for each faces found
for (x, y, w, h) in faces:
# Draw a rectangle around the face
color = (0, 255, 255) # in BGR
stroke = 5
cv2.rectangle(frame, (x, y), (x + w, y + h),
color, stroke)
#===============DETECTING FACE=============
# Show the frame
cv2.imshow("Image", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord("q"): # Press q to break out of the loop
break
注意detectMultiScale()
函数中的以下参数:
scaleFactor
参数允许你将捕获的图像重新缩放到新的尺寸,以便算法可以检测到人脸。minNeighbors
参数指定每个候选矩形应该保留多少个邻居。此参数影响检测到的人脸的质量。值越高,检测次数越少,但质量越高。通常,4 到 6 是一个不错的数字。
你可以改变这两个参数的值以确保正确检测到人脸。
当检测到人脸时,你想在人脸周围绘制矩形:
# for each faces found
for (x, y, w, h) in faces:
# Draw a rectangle around the face
color = (0, 255, 255) # in BGR
stroke = 5
cv2.rectangle(frame, (x, y), (x + w, y + h),
color, stroke)
当你再次重新运行face_detection.py文件时,你现在应该能够检测到人脸:
face_detection.py文件的全部内容如下:
import cv2
# for face detection
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# default webcam
stream = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
(grabbed, frame) = stream.read()
# Convert to grayscale
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Try to detect faces in the webcam
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
# for each faces found
for (x, y, w, h) in faces:
# Draw a rectangle around the face
color = (0, 255, 255) # in BGR
stroke = 5
cv2.rectangle(frame, (x, y), (x + w, y + h),
color, stroke)
# Show the frame
cv2.imshow("Image", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord("q"): # Press q to break out of the loop
break
# Cleanup
stream.release()
cv2.waitKey(1)
cv2.destroyAllWindows()
cv2.waitKey(1)
总结
我希望这篇简短的文章为你提供了一种使用 Python 和网络摄像头检测人脸的简单方法。请务必下载 haar 级联 XML 文件并将其放入与 Python 文件相同的文件夹中。在以后的文章中,我将向你展示一些执行人脸识别的技术。敬请关注!
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~