如果你是谷歌照片的普通用户,你可能已经注意到该应用程序如何从你备份到云端的照片中自动提取并分组人脸。
谷歌照片网络应用中的人脸识别
像谷歌这样的照片应用程序是通过检测你照片中的人脸(也包括宠物!),然后将相似的人脸分组来实现的。检测并对图像中的人脸进行分类是神经网络深度学习中的一项常见任务。
在本教程的第一步,我们将使用Keras中预先训练好的MTCNN模型来检测图像中的人脸。一旦我们从图像中提取了人脸,我们将计算这些人脸之间的相似度分数,以发现他们是否属于同一个人。
前提条件
在你开始检测和识别人脸之前,你需要设置你的开发环境。首先,在对图像进行任何处理之前,你需要通过Python "读取 "这些图像。我们将使用绘图库matplotlib 来读取和处理图像。通过安装程序pip ,安装最新的版本。
pip3 install matplotlib
要使用CNN算法的任何实现,你需要安装keras 。使用下面的命令下载并安装最新版本。
pip3 install keras
我们将用于人脸检测的算法是MTCNN(多任务卷积神经网络),基于论文 "Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks"(Zhang等人,2016)。在Python3.4中,TensorFlow的MTCNN算法的实现可以作为一个包。运行以下命令,通过pip 来安装该软件包。
pip3 install mtcnn
为了在从图像中提取人脸后进行比较,我们将使用由牛津大学视觉几何小组开发的VGGFace2算法。VGG算法的一个基于TensorFlow的Keras实现可以作为一个包供你安装。
pip3 install keras_vggface
虽然你可能觉得有必要建立和训练自己的模型,但你需要一个巨大的训练数据集和巨大的处理能力。由于本教程的重点是这些模型的实用性,所以它使用了该领域专家的现有训练模型。
现在你已经成功安装了先决条件,让我们直接进入教程吧
第1步:用MTCNN模型进行人脸检测
本步骤的目标如下。
- 检索外部托管的图像到本地服务器上
- 通过
matplotlib'simread()功能读取图像 - 通过MTCNN算法检测和探索人脸
- 从图像中提取人脸
1.1 存储外部图像
你可能经常要从外部服务器托管的图像中进行分析。在这个例子中,我们将使用BBC和《底特律新闻》网站上的两张野马之父李-艾柯卡的图片。
为了在本地临时存储这些图片以便进行分析,我们将从其URL中检索每张图片并将其写入一个本地文件中。让我们为这个目的定义一个函数store_image 。
import urllib.request
def store_image(url, local_file_name):
with urllib.request.urlopen(url) as resource:
with open(local_file_name, 'wb') as f:
f.write(resource.read())
现在你可以简单地用URL和你想存储的图像的本地文件来调用这个函数。
store_image('https://ichef.bbci.co.uk/news/320/cpsprodpb/5944/production/_107725822_55fd57ad-c509-4335-a7d2-bcc86e32be72.jpg',
'iacocca_1.jpg')
store_image('https://www.gannett-cdn.com/presto/2019/07/03/PDTN/205798e7-9555-4245-99e1-fd300c50ce85-AP_080910055617.jpg?width=540&height=&fit=bounds&auto=webp',
'iacocca_2.jpg')
在成功检索到图像后,让我们来检测其中的人脸。
1.2 检测图像中的人脸
为此,我们将做两个导入--matplotlib ,用于读取图像,mtcnn ,用于检测图像中的人脸。
from matplotlib import pyplot as plt
from mtcnn.mtcnn import MTCNN
使用imread() 函数来读取图像。
image = plt.imread('iacocca_1.jpg')
接下来,在detector 变量中初始化一个MTCNN() 对象,并使用.detect_faces() 方法来检测图像中的人脸。让我们看看它的返回结果。
detector = MTCNN()
faces = detector.detect_faces(image)
for face in faces:
print(face)
对于每一张脸,都会返回一个Python字典,其中包含三个键。box 键包含图像中人脸的边界。它有四个值:左上角顶点的x-和y-坐标,包含脸部的矩形的宽度和高度。其他的键是confidence 和keypoints 。keypoints 键包含一个字典,其中包含检测到的人脸的特征以及它们的坐标。
{'box': [160, 40, 35, 44], 'confidence': 0.9999798536300659, 'keypoints': {'left_eye': (172, 57), 'right_eye': (188, 57), 'nose': (182, 64), 'mouth_left': (173, 73), 'mouth_right': (187, 73)}}
1.3 突出图像中的人脸
现在我们已经成功地检测到了一个人脸,让我们在它上面画一个矩形来突出图像中的人脸,以验证检测是否正确。
为了画一个矩形,从matplotlib.patches ,导入Rectangle 对象。
from matplotlib.patches import Rectangle
让我们定义一个函数highlight_faces ,首先显示图像,然后在检测到的人脸上画矩形。首先,通过imread() 读取图像,通过imshow() 绘制图像。对于每个被检测到的人脸,使用Rectangle() 类画一个矩形。
最后,使用.show() 方法显示图像和矩形。如果你使用的是Jupyter笔记本,你可以使用%matplotlib inline 魔术命令来内联显示图画。
def highlight_faces(image_path, faces):
# display image
image = plt.imread(image_path)
plt.imshow(image)
ax = plt.gca()
# for each face, draw a rectangle based on coordinates
for face in faces:
x, y, width, height = face['box']
face_border = Rectangle((x, y), width, height,
fill=False, color='red')
ax.add_patch(face_border)
plt.show()
现在让我们用highlight_faces() 功能来显示图像和检测到的人脸。
highlight_faces('iacocca_1.jpg', faces)
在李-艾柯卡的图像中检测到的人脸。来源。BBC
让我们来显示第二张图片和其中检测到的人脸。
image = plt.imread('iacocca_2.jpg')
faces = detector.detect_faces(image)
highlight_faces('iacocca_2.jpg', faces)
在这两张图片中,你可以看到MTCNN算法能正确地检测到人脸。现在让我们从图像中提取这张脸,对其进行进一步分析。
继续阅读:在SitePoint 上用Keras进行人脸检测和识别。