65.9K
CodeProject 正在变化。 阅读更多。
Home

AI 人脸检测

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.14/5 (4投票s)

2020 年 7 月 31 日

CPOL

3分钟阅读

viewsIcon

13433

downloadIcon

435

在本文中,我们将介绍检测图像中人脸的步骤。

引言

如果你看过电影《少数派报告》,你可能还记得汤姆·克鲁斯走进 Gap 商店的场景。视网膜扫描仪读取了他的眼睛,并为他播放了一个定制广告。好吧,现在是 2020 年。我们不需要视网膜扫描仪,因为我们有人工智能 (AI) 和机器学习 (ML)!

在本系列中,我们将向你展示如何使用深度学习执行人脸识别,然后 - 基于识别出的人脸 - 使用神经网络文本转语音 (TTS) 引擎来播放定制广告。欢迎你在 CodeProject 上浏览代码,或者下载 .zip 文件在你自己的机器上浏览代码。

我们假设你熟悉 AI/ML 的基本概念,并且能够使用 Python。

阶段和工具

本系列的前四篇文章对应于识别人脸过程中的四个阶段,它们是

  1. 人脸检测 – 检测图像或视频中所有的人脸,并提取(裁剪)这些人脸
  2. 数据集处理 – 大多数 ML 过程中包含的阶段;获取和解析数据,以及数据集变量的标准化和分类
  3. 卷积神经网络 (CNN) 的设计、实现和训练
  4. 使用 CNN 的预测能力进行实际的人脸识别

当我们介绍人脸识别和 TTS 时,我们将使用一组工具

  • Python – 常用于 AI/ML 的编程语言
  • TensorFlow (TF) – 帮助你开发和训练 ML 模型的核心开源库
  • Keras – 支持核心 ML 功能的 API
  • NumPy – 用于 Python 中科学计算的包
  • SK-Image – 用于图像处理的算法集合

检测、提取、调整大小、绘制...

所以,人脸检测 – 是时候深入研究一些代码了。这是一个实现我们的人脸检测器的 Python 类

from PIL import Image
from matplotlib import pyplot
from mtcnn import MTCNN
from numpy import asarray
from skimage import io
from util import constant
class MTCnnDetector:

    def __init__(self, image_path):
        self.detector = MTCNN()
        self.image = io.imread(image_path)

我们的类的名称是 MTCnnDetector,因为我们将使用的预定义检测器是 MTCNN(多任务卷积神经网络)。这是一种遵循多任务学习原则的 CNN。换句话说,它能够同时学习多个任务,从而支持同时检测多张人脸。使用 MTCNN 算法,我们检测图像中人脸的边界框,以及每张人脸的 5 点面部标志(最简单的模型,它检测眼睛的边缘和鼻子的底部)。通过将输入传递到 CNN 来逐步改进检测结果,CNN 返回候选边界框及其概率分数。

这是该类的主要方法

def process_image(self, plot=False):
    faces = self.__detect_face();
    resized_face_list = []
    for f in faces:
        extracted_face = self.__extract_face(f)
        resized_face = self.__resize_img_to_face(extracted_face)
        resized_face_list.append(resized_face)
        if plot:
            self.__plot_face(resized_face)
    return resized_face_list

该方法非常简单:它调用 detect_face() 方法从图像中获取所有人脸(其路径之前通过类构造函数输入),提取人脸并调整其大小,并返回调整大小的图像列表。此外,如果 plot 为 True,它会绘制检测到的人脸。它使用以下私有方法作为辅助方法

def __detect_face(self):
    return self.detector.detect_faces(self.image)

def __extract_face(self, face):
    x1, y1, width, height = face['box']
    x2, y2 = x1 + width, y1 + height
    return self.image[y1:y2, x1:x2]

def __resize_img_to_face(self, face):
    image = Image.fromarray(face)
    image = image.resize((constant.DETECTOR_FACE_DIM, constant.DETECTOR_FACE_DIM))
    return asarray(image)

def __plot_face(self, face):
    pyplot.imshow(face)
    pyplot.show()

因此,detect_face() 方法使用 self.detector.detect_faces() 方法检测人脸。extract_face() 方法从图像中提取与之前返回的边界框相对应的部分。最后,resize_img_to_face() 方法输入先前获得的图像部分,并将其大小调整为预定义的尺寸。 plot_face() 方法绘制结果人脸。

… 看看会发生什么

让我们看看这段代码在使用 Wikipedia 中的示例图像时是如何工作的。

# Face detector
face_detector = MTCnnDetector(constant.CELEBRITY_VGG_PATH)
resized_faces = face_detector.process_image(plot=True)

在上面的代码中,constant.CELEBRITY_VGG_PATH 是一个常量文件,它将用作项目中所有路径和常量的容器。 让我们运行代码并查看检测到的人脸的图表。 这是我们看到的 - 使用 matplotlib 绘制的。

下一步?

在本文中,我们已经介绍了检测图像中人脸的步骤。如果用于训练 CNN 的图像没有预先裁剪到主题人脸,则此阶段是必要的。在下一篇文章中,我们将讨论如何准备数据集以将正确的数据馈送到 CNN。敬请关注!

© . All rights reserved.