使用 Python 进行人脸检测

 
 

点击上方“小白学视觉”,选择加"星标"或“置顶

 
 
重磅干货,第一时间送达

通过使用网络摄像头检测你的面部来享受 Python 的乐趣

outside_default.png

人脸检测是一种识别数字图像中人脸的技术。人脸检测是一项相对成熟的技术——还记得使用数码相机时的美好时光吗?

在相机对焦的时候就能观察到人脸周围的方框,这就是早期的人脸检测技术。

对于人脸检测,最著名的算法之一是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 分类器工作原理的高级概述:

  • 首先,使用一组正图像(人脸图像)和一组负图像(人脸图像)来训练分类器。

  • 然后从图像中提取特征。下图显示了从包含人脸的图像中提取的一些特征。

outside_default.png
  • 要从图像中检测人脸,你需要寻找通常在人脸上发现的各种特征(见下图),例如眉毛,眉毛上方的区域比眉毛下方的区域更亮。

outside_default.png
  • 当图像包含所有这些特征的组合时,它被认为包含人脸。

幸运的是,无需了解 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

你现在应该看到你的脸:

outside_default.png

检测人脸

有趣的部分来了——检测人脸。首先,创建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文件时,你现在应该能够检测到人脸:

outside_default.png

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“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值