使用深度学习从视频构建人脸检测模型(Python实现)

Introduction

“计算机视觉和机器学习已经真正开始起飞,但对于大多数人来说,计算机在观看图像时看到的整体想法相对模糊。” - Mike Kreiger

近年来,计算机视觉领域的精彩领域跻身于自己的联盟​​之列。世界各地已经广泛使用了大量的应用程序 - 我们刚刚开始!

我在这个领域最喜欢的事情之一是我们的社区拥抱开源概念的想法。即使是大型科技巨头也愿意与每个人分享新的突破和创新,这样技术就不会成为“富人”。

其中一种技术是人脸检测,它在实际使用案例中提供了大量潜在的应用(如果使用正确且符合道德标准)。在本文中,我将向您展示如何使用开源工具构建功能强大的人脸检测算法。这是一个让您兴奋的演示,并为接下来的内容奠定基础:

所以,你准备好了吗? 请继续阅读!

注意:如果您想了解计算机视觉的复杂性,本课程 - 使用深度学习的计算机视觉 - 是一个完美的起点。

Table of Contents

  • 人脸检测的潜在应用
  • 设置系统 - 硬件/软件要求
  • 硬件设置
  • 软件设置
  • 深入了解Python实现
  • 简单的演练
  • 人脸检测用例

人脸检测的有希望的应用
让我提出一些很常见的应用程序示例,其中人脸检测技术正在普遍使用。 我相信你肯定在某些时候遇到过这些用例,而没有意识到幕后使用了什么技术!

例如,Facebook取代了手动图像标记,并为上传到平台的每张图片自动生成了标记建议。 Facebook使用简单的人脸检测算法来分析图像中人脸的像素,并将其与相关用户进行比较。 我们将学习如何自己构建人脸检测模型,但在我们进入技术细节之前,让我们讨论一些其他用例。

我们正习惯使用最新的“面部解锁”功能解锁手机。 这是如何使用面部检测技术来维护个人数据安全性的一个非常小的例子。 同样可以在更大范围内实施,使相机能够捕捉图像和检测面部。

在广告,医疗保健,银行业等方面还有一些其他鲜为人知的面部检测应用。大多数公司,甚至在许多会议中,你都应携带身份证才能进入。 但是,如果我们能够找到一种方法以便您不需要携带任何身份证来获取访问权限呢? 人脸检测有助于使此过程顺利,轻松。 该人只是看着相机,它会自动检测是否允许他/她进入。

面部检测的另一个有趣应用可以是计算参加活动的人数(如会议或音乐会)。 我们安装了一个可以捕捉与会者图像并给我们总人数的摄像头,而不是手动计算与会者。 这有助于自动化流程并节省大量手动工作。 很有用,不是吗?

在这里插入图片描述

你可以提出更多这样的应用程序 - 随时在下面的评论部分分享它们。

在本文中,我将重点介绍人脸检测的实际应用,并简单介绍其中的算法是如何工作的。 如果您想了解更多有关它们的信息,请阅读本文。

Setting up the System – Hardware/Software Requirements

既然您已经了解了可以使用面部检测技术构建的潜在应用程序,那么让我们看看如何使用我们可用的开源工具实现这一点。 这是我们与社区的优势 - 分享和开源代码的意愿在任何行业都是无与伦比的。

具体来说,这是我使用和推荐使用的内容:

  • 用于在Lenovo E470 ThinkPad笔记本电脑(Core i5 7th Gen)上构建实时面部检测器的网络摄像头(Logitech C920)。 您还可以在任何适当的系统上使用笔记本电脑的内置摄像头或闭路电视摄像头进行实时视频分析,而不是我正在使用的设置
  • 使用GPU进行更快速的视频处理始终是一个奖励
  • 在软件方面,我们使用了Ubuntu 18.04操作系统,并安装了所有必备软件

让我们更详细地探索这些要点,以确保在构建人脸检测模型之前正确设置所有内容。

Step 1: Hardware Setup

您要做的第一件事是检查网络摄像头是否设置正确。 Ubuntu中的一个简单技巧 - 查看设备是否已被操作系统注册。 您可以按照以下步骤操作:

  • 1在将WebCam连接到笔记本电脑之前,通过转到命令提示符并键入ls / dev / video *来检查所有连接的视频设备。 这将打印已连接到系统的视频设备。
    在这里插入图片描述
  • 2连接WebCam并再次运行命令。
    在这里插入图片描述
    如果WebCam已成功连接,则命令将显示新设备。
  • 3您可以做的另一件事是使用任何网络摄像头软件检查网络摄像头是否正常工作。 你可以在Ubuntu中使用“Cheese”。
    在这里插入图片描述

在这里,我们可以看到网络摄像头设置正确。 这就是硬件方面的问题!

##步骤2:软件设置
###步骤2.1:安装Python
本文中的代码是使用Python 3.5版构建的。 虽然有多种方法可以安装Python,但我建议使用Anaconda - 最流行的数据科学Python发行版。 这是您系统中的安装Anaconda链接。

###步骤2.2:安装OpenCV
OpenCV(开源计算机视觉)是一个旨在构建计算机视觉应用程序的库。 它有许多用于图像处理任务的预编写功能。 要安装OpenCV,请执行库的pip安装:

pip3 install opencv-python

步骤2.3:安装face_recognition API;
最后,我们将使用face_recognition,被称为世界上最简单的面部识别API。 安装:

pip install dlib
pip install face_recognition

让我们深入了解实施

现在您已经设置了系统,现在终于可以深入了解实际的实现。 首先,我们将快速构建我们的程序,然后将其分解以了解我们所做的事情。

简单的演练

首先,创建一个文件face_detector.py,然后复制下面给出的代码:

# import libraries
import cv2
import face_recognition

# Get a reference to webcam 
video_capture = cv2.VideoCapture("/dev/video1")

# Initialize variables
face_locations = []

while True:
    # Grab a single frame of video
    ret, frame = video_capture.read()

    # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses)
    rgb_frame = frame[:, :, ::-1]

    # Find all the faces in the current frame of video
    face_locations = face_recognition.face_locations(rgb_frame)

    # Display the results
    for top, right, bottom, left in face_locations:
        # Draw a box around the face
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

    # Display the resulting image
    cv2.imshow('Video', frame)

    # Hit 'q' on the keyboard to quit!
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Release handle to the webcam
video_capture.release()
cv2.destroyAllWindows()

Then, run this Python file by typing:

python face_detector.py

If everything works correctly, a new window will pop up with real-time face detection running.

总而言之,这是我们上面的代码所做的:

  • 首先,我们定义了将进行视频分析的硬件
  • 由此,我们逐帧实时捕捉视频
  • 然后我们处理每个帧并提取图像中所有面部的位置
  • 最后,我们以视频形式渲染这些帧以及面部位置

简单,不是吗? 如果您想进入更详细的细节,我已在每个代码部分中包含注释。 您可以随时返回并查看我们所做的工作.

人脸检测用例

乐趣并不止于此! 我们可以做的另一件很酷的事情 - 围绕上面的代码构建一个完整的用例。 而且你不需要从头开始。 我们可以对代码进行一些小的更改,我们很高兴。
例如,假设您想构建一个基于摄像头的自动系统来实时跟踪扬声器的位置。 根据他的位置,系统旋转摄像头,使扬声器始终位于视频的中间。

我们该如何解决这个问题? 第一步是建立一个识别视频中人物的系统,并关注说话人的位置。
在这里插入图片描述

让我们看看我们如何实现这一点。 在本文中,我拍摄了来自Youtube的视频,其中显示了在2017年DataHack峰会期间发言的演讲者。

首先,我们导入必要的库:

import cv2
import face_recognition

然后,阅读视频并获取长度:

input_movie = cv2.VideoCapture("sample_video.mp4")
length = int(input_movie.get(cv2.CAP_PROP_FRAME_COUNT))

之后,我们创建一个输出文件,其所需的分辨率和帧速率与输入文件类似。

加载扬声器的示例图像以在视频中识别他:

image = face_recognition.load_image_file("sample_image.jpeg")
face_encoding = face_recognition.face_encodings(image)[0]

known_faces = [
face_encoding,
]

所有这一切都完成了,现在我们运行一个循环,它将执行以下操作:

  • 从视频中提取帧
  • 找到所有面孔并识别它们
  • 创建一个新视频,将原始帧与注释的扬声器面部位置相结合

我们来看看这个代码:

# Initialize variables
face_locations = []
face_encodings = []
face_names = []
frame_number = 0

while True:
    # Grab a single frame of video
    ret, frame = input_movie.read()
    frame_number += 1

    # Quit when the input video file ends
    if not ret:
        break

    # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses)
    rgb_frame = frame[:, :, ::-1]

    # Find all the faces and face encodings in the current frame of video
    face_locations = face_recognition.face_locations(rgb_frame, model="cnn")
    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

    face_names = []
    for face_encoding in face_encodings:
        # See if the face is a match for the known face(s)
        match = face_recognition.compare_faces(known_faces, face_encoding, tolerance=0.50)

        name = None
        if match[0]:
            name = "Phani Srikant"

        face_names.append(name)

    # Label the results
    for (top, right, bottom, left), name in zip(face_locations, face_names):
        if not name:
            continue

        # Draw a box around the face
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

        # Draw a label with a name below the face
        cv2.rectangle(frame, (left, bottom - 25), (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(frame, name, (left + 6, bottom - 6), font, 0.5, (255, 255, 255), 1)

    # Write the resulting image to the output video file
    print("Writing frame {} / {}".format(frame_number, length))
    output_movie.write(frame)

# All done!
input_movie.release()
cv2.destroyAllWindows()

结束语

恭喜! 您现在知道如何为许多潜在用例构建面部检测系统。 深度学习是一个如此迷人的领域,我很高兴看到我们下一步走向何方。

在本文中,我们学习了如何利用开源工具构建具有实际用途的实时人脸检测系统。 我鼓励你建立大量这样的应用程序并自己尝试。 相信我,有很多东西需要学习,而且非常有趣!

与往常一样,如果您在下面的评论部分有任何疑问/建议,请随时与我们联系!

猜你喜欢

转载自blog.csdn.net/weixin_41697507/article/details/89442201
今日推荐