AI 人脸检测






4.14/5 (4投票s)
在本文中,我们将介绍检测图像中人脸的步骤。
引言
如果你看过电影《少数派报告》,你可能还记得汤姆·克鲁斯走进 Gap 商店的场景。视网膜扫描仪读取了他的眼睛,并为他播放了一个定制广告。好吧,现在是 2020 年。我们不需要视网膜扫描仪,因为我们有人工智能 (AI) 和机器学习 (ML)!
在本系列中,我们将向你展示如何使用深度学习执行人脸识别,然后 - 基于识别出的人脸 - 使用神经网络文本转语音 (TTS) 引擎来播放定制广告。欢迎你在 CodeProject 上浏览代码,或者下载 .zip 文件在你自己的机器上浏览代码。
我们假设你熟悉 AI/ML 的基本概念,并且能够使用 Python。
阶段和工具
本系列的前四篇文章对应于识别人脸过程中的四个阶段,它们是
- 人脸检测 – 检测图像或视频中所有的人脸,并提取(裁剪)这些人脸
- 数据集处理 – 大多数 ML 过程中包含的阶段;获取和解析数据,以及数据集变量的标准化和分类
- 卷积神经网络 (CNN) 的设计、实现和训练
- 使用 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。敬请关注!