社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

基于 Python 的人脸检测 — 人脸识别的前提

小白玩转Python • 6 月前 • 237 次点击  

点击下方卡片,关注“小白玩转Python”公众号


人脸检测是一种识别数字图像中人类面孔的技术。人脸检测是一项相对成熟的技术,还记得在您的数码相机的旧日子里,当您通过取景器看时?您会看到围绕在取景器中的人们脸部的矩形框。在进行人脸识别之前,您需要学习的技术就是人脸检测,也就是试图给脸部赋予一个名字。


对于人脸检测,其中最著名的算法之一是被称为Viola-Jones人脸检测技术,通常称为Haar级联。Haar级联在深度学习流行之前就被发明了,是最常用于检测人脸的技术之一。


人脸检测/识别的道德考虑


尽管检测和识别人脸的能力确实很酷,但它肯定涉及很多道德问题。在将面部识别应用到项目中之前,您需要注意一些关切事项。这些关切事项包括隐私(人脸检测可用于在未经同意的情况下追踪人们的活动)、偏见(人脸检测可能对不同种族、性别或年龄的个体存在偏见)以及滥用(捕捉到的面部可能被用于其他非法用途或恶意目的)。因此,尽管本文侧重于人脸检测的技术能力,但在将其应用到工作中之前,您应该仔细考虑道德和伦理问题。


以下是一些低风险项目,可以在其中实施人脸检测/识别:

  • 考勤跟踪 —— 您可以在学校或工作场所使用人脸识别进行考勤。

  • 个性化 —— 使用人脸识别来个性化服务。一个很好的例子是在娱乐服务中,根据用户的观看历史推荐特定的电视节目。

  • 安全 —— 使用人脸识别来解锁非关键系统,如智能手机和计算机。


然而,在某些应用中使用人脸识别具有严重的道德影响。以下是一些例子:

  • 执法 —— 尽管人脸识别对执法可能有用,但人们对其不准确性和偏见存在一些严重的担忧。

  • 监视 —— 人脸识别技术已经在一些国家用于监视和追踪其公民,特别是持不同政见者。一些公司还使用人脸识别来监视员工的生产力,这直接侵犯了他们的隐私。


如何做Haar级联


Haar级联分类器用于检测其经过训练的对象。以下是Haar面部分类器的工作原理的高级概述:

  • 首先,使用一组正图像(包含面部的图像)和一组负图像(不包含面部的图像)对分类器进行训练。

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

  • 为了从图像中检测人脸,您需要寻找通常在人脸上找到的各种特征的存在(见下图),例如眉毛,其中眉毛上方的区域比下方的区域亮。

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


幸运的是,不需要知道Haar级联是如何工作的,OpenCV可以直接使用预训练的Haar级联进行人脸检测,以及用于识别其他对象的其他Haar级联。预定义的Haar级联列表可在GitHub上找到,链接为:https://github.com/opencv/opencv/tree/master/data/haarcascades。


开源计算机视觉(OpenCV)是由英特尔最初开发的开源计算机视觉和机器学习软件库。它旨在为计算机视觉应用程序提供共同的基础架构,并加速机器感知在商业产品中的使用。OpenCV附带了几个预训练的Haar级联,可以检测眼睛、脸部、俄罗斯车牌、微笑等。对于人脸检测,您将需要`haarcascade_frontalface_default.xml`文件,可以从上文的GitHub链接中下载。


安装OpenCV

让我们尝试使用OpenCV进行人脸检测。首先,您需要使用以下命令进行安装:

!pip install opencv-python

对于本文示例,您需要创建一个名为`face_detection.py`的文件。首先,通过以下语句导入OpenCV库:

import cv2


从Webcam读取

接下来要做的是连接到您的网络摄像头并在屏幕上显示图像:

import cv2
# default webcamstream = 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
# Cleanupstream.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

然后进行清理工作:

# Cleanupstream.release()cv2.waitKey(1)cv2.destroyAllWindows()cv2.waitKey(1)

要运行程序,请转到终端并键入:

$ python face_detection.py

现在您应该看到您的脸:

检测到脸部


现在来玩个有趣的部分 —— 检测脸部。首先,创建`CascadeClassifier`类的一个实例,并将`haarcascade_frontalface_default.xml`文件传递给它:

import cv2
# for face detectionface_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 detectionface_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# default webcamstream = 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
# Cleanupstream.release()cv2.waitKey(1)cv2.destroyAllWindows()cv2.waitKey(1)

总结

希望这篇简短的文章为您提供了一种使用Python和您的网络摄像头检测脸部的简单方法。确保下载`haarcascade_frontalface_default.xml`文件并将其放入与您的Python文件相同的文件夹中。


·  END  ·

🌟 想要变身计算机视觉小能手?快来「小白玩转Python」公众号!
回复Python视觉实战项目,解锁31个超有趣的视觉项目大礼包!🎁

本文仅供学习交流使用,如有侵权请联系作者删除

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/172694
 
237 次点击