PyTorch深度学习实战 | 基于ResNet的人脸关键点检测

简介: 人脸关键点检测指的是用于标定人脸五官和轮廓位置的一系列特征点的检测,是对于人脸形状的稀疏表示。关键点的精确定位可以为后续应用提供十分丰富的信息。因此,人脸关键点检测是人脸分析领域的基础技术之一。许多应用场景(如人脸识别、人脸三维重塑、表情分析等)均将人脸关键点检测作为其前序步骤来实现。本文将通过深度学习的方法来搭建一个人脸关键点检测模型。1995年,Cootes提出 ASM(active shape model) 模型用于人脸关键点检测,掀起了一波持续多年的研究浪潮。这一阶段的检测算法常常被称为传统方法。2012年,AlexNet 在 ILSVRC 中力压榜眼夺冠,将深度学习带进人们的视野。

image.png

人脸关键点检测指的是用于标定人脸五官和轮廓位置的一系列特征点的检测,是对于人脸形状的稀疏表示。关键点的精确定位可以为后续应用提供十分丰富的信息。因此,人脸关键点检测是人脸分析领域的基础技术之一。许多应用场景(如人脸识别、人脸三维重塑、表情分析等)均将人脸关键点检测作为其前序步骤来实现。本文将通过深度学习的方法来搭建一个人脸关键点检测模型。
1995年,Cootes提出 ASM(active shape model) 模型用于人脸关键点检测,掀起了一波持续多年的研究浪潮。这一阶段的检测算法常常被称为传统方法。2012年,AlexNet 在 ILSVRC 中力压榜眼夺冠,将深度学习带进人们的视野。随后 Sun 等在 2013 年提出了 DCNN 模型,首次将深度方法应用于人脸关键点检测。自此,深度卷积神经网络成为人脸关键点检测的主流工具。本期主要使用 Keras 框架来搭建深度模型。

目前,开源的人脸关键点数据集有很多。例如AFLW、300W、MTFL/MAFL 等,关键点个数也从 5 个到上千个不等。本章中采用的是 CVPR 2018 论文Look at Boundary: A Boundary-Aware Face Alignment Algorithm中提出的 WFLW(wider facial landmarks in-the-wild) 数据集。这一数据集包含了 10000 张人脸信息,其中 7500 张用于训练,剩余 2500 张用于测试。每张人脸图片被标注以 98 个关键点,人脸关键点分布如图1所示。

image.png


■ 图1 人脸关键点分布

由于关键点检测在人脸分析任务中的基础性地位,工业界往往拥有标注了更多关键点的数据集。但是由于其商业价值,这些信息一般不会被公开,因此目前开源的数据集还是以 5 点和 68 点为主。在本项目中使用的 98 点数据集不仅能够更加精确地训练模型,同时还可以更加全面地对模型表现进行评估。

然而另一方面,数据集中的图片并不能直接作为模型输入。对于模型来说,输入图片应该是等尺寸且仅包含一张人脸的。但是数据集中的图片常常会包含多个人脸,这就需要首先对数据集进行预处理,使之符合模型的输入要求。

1、人脸裁剪与缩放

数据集中已经提供了每张人脸所处的矩形框,可以据此确定人脸在图像中的位置,人脸矩形框示意如图2所示。但是直接按照框选部分进行裁剪会导致两个问题:一是矩形框的尺寸不同,裁剪后的图片还是无法作为模型输入;二是矩形框只能保证将关键点包含在内,耳朵、头发等其他人脸特征则排除在外,不利于训练泛化能力强的模型。

image.png


■ 图2 人脸矩形框示意

为了解决上述的第一个问题,将矩形框放大为方形框,因为方形图片容易进行等比例缩放而不会导致图像变形。对于第二个问题,则单纯地将方形框的边长延长为原来的1.5倍,以包含更多的脸部信息。相关代码如代码清单1所示。
代码清单2

代码清单1


image.png


代码清单1以及其余的全部代码中涉及的 image 对象均为 PIL.Image 类型。PIL(python imaging library) 是一个第三方模块,但是由于其强大的功能与广泛的用户基础,几乎已经被认为是 Python 官方图像处理库了。PIL 不仅为用户提供了 jpg、png、gif 等多种图片类型的支持,还内置了十分强大的图片处理工具集。上面提到的 Image 类型是 PIL 最重要的核心类,除了具备裁剪 (crop) 功能外,还拥有创建缩略图(thumbnail)、通道分离 (split) 与合并 (merge)、缩放 (resize)、转置 (transpose) 等功能。下面给出一个图片缩放的例子,如代码清单2所示。

代码清单2


image.png


代码清单2将人脸图片和关键点坐标一并缩放至 128×128px。在 Image.resize()函数的调用中,第一个参数表示缩放的目标尺寸,第二个参数表示缩放所使用的过滤器类型。在默认情况下,过滤器会选用 Image.NEAREST ,其特点是压缩速度快但压缩效果较差。因此,PIL官方文档中建议是如果对于图片处理速度的要求不是那么苛刻,推荐使用 Image.ANTIALIAS 以获得更好的缩放效果。在本项目中,由于 _resize() 函数对每张人脸图片只会调用一次,因此时间复杂度并不是问题。况且图像经过缩放后还要被深度模型学习,缩放效果很可能是决定模型学习效果的关键因素,所以这里选择了 Image.ANTIALIAS 过滤器进行缩放。图2经过裁剪和缩放处理后的效果图如图3所示。

image.png


■ 图3 经过裁剪和缩放处理后的效果示意

2、数据归一化处理

经过裁剪和缩放处理所得到的数据集已经可以用于模型训练了,但是训练效果并不理想。对于正常图片,模型可以以较高的准确率定位人脸关键点。但是在某些过度曝光或者经过了滤镜处理的图片面前,模型就显得力不从心了。为了提高模型的准确率,这里进一步对数据集进行归一化处理。所谓归一化,就是排除某些变量的影响。例如,希望将所有人脸图片的平均亮度统一,从而排除图片亮度对模型的影响,如代码清单3所示。

代码清单3


image.png


mageStat和 ImageEnhance 分别是 PIL 中的两个工具类。顾名思义 ImageStat 可以对图片中每个通道进行统计分析,代码清单3中就对图片的三个通道分别求得了平均值;ImageEnhance 用于图像增强,常见用法包括调整图片的亮度、对比度以及锐度等。

提示/

颜色通道是一种用于保存图像基本颜色信息的数据结构。最常见的 RGB 模式图片由红、绿、蓝三种基本颜色组成。也就是说,RGB 图片中的每个像素都是用这三种颜色的亮度值来表示的。在一些印刷品的设计图中会经常遇到另一种称为 CYMK 的颜色模式,这种模式下的图片包含四个颜色通道,分别表示青、黄、红、黑。PIL 可以自动识别图片文件的颜色模式,因此多数情况下用户并不需要关心图像的颜色模式。但是在对图片应用统计分析或增强处理时,底层操作往往是针对不同通道分别完成的。为了避免因为颜色模式导致的图像失真,用户可以通过 PIL.Image.mode 属性查看被处理图像的颜色模式。

类似地,希望消除人脸朝向所带来的影响。这是因为训练集中朝向左边的人脸明显多于朝向右边的人脸,导致模型对于朝向右侧的人脸识别率较低。具体做法是随机地将人脸图片进行左右翻转,从而在概率上保证朝向不同方向的人脸图片具有近似平均的分布,如代码清单4所示。

代码清单4


image.png


图片的翻转比较容易完成,只需要调用 PIL.Image 类的转置方法即可,但是关键点的翻转则需要一些额外的操作。举例来说,左眼 96 号关键点在翻转后会成为新图片的右眼 97 号关键点(见图1),因此其在 pts 数组中的位置也需要从 96 变为 97 。为了实现这样的功能,定义全排列向量 perm 来记录关键点的对应关系。为了方便程序调用, perm 被保存在文件中。但是如果每次调用 _fliplr()函数时都从文件中读取,显然会拖慢函数的执行;而将 perm 作为全局变量加载,又会污染全局变量空间,破坏函数的封装性。这里的解决方案是将 perm 作为函数对象 _fliplr() 的一个属性,从外部加载并始终保存在内存中,如代码清单5所示。

代码清单5


image.png


提示/

熟悉 C/C++ 的读者可能会联想到 static 修饰的静态局部变量。很遗憾的是, Python 作为动态语言是没有这种特性的。代码清单5就是为了实现类似效果所做出的一种尝试。

3、整体代码

前面定义了对于单张图片的全部处理函数,接下来就只需要遍历数据集并调用即可,如代码清单6所示。由于训练集和测试集在 WFLW 中是分开进行存储的,但是二者的处理流程几乎相同,因此可以将其公共部分抽取出来作为 preprocess()函数进行定义。训练集和测试集共享同一个图片库,其区别仅仅在于人脸关键点的坐标以及人脸矩形框的位置,这些信息被存储在一个描述文件中。preprocess()函数接收这个描述文件流作为参数,依次处理文件中描述的人脸图片,最后将其保存到 dataset 目录下的对应位置。

代码清单6


image.png


image.png


image.png


image.png


在preprocess()函数中,将 50 个数据组成一批 (batch) 进行存储,这样做的目的是方便模型训练过程中的数据读取。在机器学习中,模型训练往往是以批为单位的,这样不仅可以提高模型训练的效率,还能充分利用 GPU 的并行能力加快训练速度。处理后的目录结构如代码清单7所示。

代码清单7


image.png

目录
相关文章
|
2月前
|
机器学习/深度学习 算法 定位技术
Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现裂缝的检测识别(C#代码UI界面版)
本项目基于YOLOv8模型与C#界面,结合Baumer工业相机,实现裂缝的高效检测识别。支持图像、视频及摄像头输入,具备高精度与实时性,适用于桥梁、路面、隧道等多种工业场景。
200 0
|
机器学习/深度学习 编解码 人工智能
人脸表情[七种表情]数据集(15500张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
本数据集包含15,500张已划分、已标注的人脸表情图像,覆盖惊讶、恐惧、厌恶、高兴、悲伤、愤怒和中性七类表情,适用于YOLO系列等深度学习模型的分类与检测任务。数据集结构清晰,分为训练集与测试集,支持多种标注格式转换,适用于人机交互、心理健康、驾驶监测等多个领域。
|
9天前
|
PyTorch 算法框架/工具 异构计算
PyTorch 2.0性能优化实战:4种常见代码错误严重拖慢模型
我们将深入探讨图中断(graph breaks)和多图问题对性能的负面影响,并分析PyTorch模型开发中应当避免的常见错误模式。
72 9
|
10天前
|
机器学习/深度学习 传感器 人工智能
火灾火焰识别数据集(2200张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
在人工智能和计算机视觉的快速发展中,火灾检测与火焰识别逐渐成为智慧城市、公共安全和智能监控的重要研究方向。一个高质量的数据集往往是推动相关研究的核心基础。本文将详细介绍一个火灾火焰识别数据集,该数据集共包含 2200 张图片,并已按照 训练集(train)、验证集(val)、测试集(test) 划分,同时配有对应的标注文件,方便研究者快速上手模型训练与评估。
火灾火焰识别数据集(2200张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
|
9天前
|
机器学习/深度学习 人工智能 监控
坐姿标准好坏姿态数据集(图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
坐姿标准好坏姿态数据集的发布,填补了计算机视觉领域在“细分健康行为识别”上的空白。它不仅具有研究价值,更在实际应用层面具备广阔前景。从青少年的健康教育,到办公室的智能提醒,再到驾驶员的安全监控和康复训练,本数据集都能发挥巨大的作用。
坐姿标准好坏姿态数据集(图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
|
12天前
|
机器学习/深度学习 编解码 人工智能
102类农业害虫数据集(20000张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
在现代农业发展中,病虫害监测与防治 始终是保障粮食安全和提高农作物产量的关键环节。传统的害虫识别主要依赖人工观察与统计,不仅效率低下,而且容易受到主观经验、环境条件等因素的影响,导致识别准确率不足。
|
机器学习/深度学习 人工智能 文字识别
中药材图像识别数据集(100类,9200张)|适用于YOLO系列深度学习分类检测任务
本数据集包含9200张中药材图像,覆盖100类常见中药材,适用于YOLO系列及主流深度学习模型的图像分类与目标检测任务。数据已划分为训练集(8000张)与验证集(1200张),采用标准文件夹结构和简体中文命名,适配PyTorch、TensorFlow等框架,可用于中药识别系统开发、医学辅助诊断、移动端图像识别App研发及AI科研训练,具备较强的实用性与拓展性。
372 44
|
12天前
|
机器学习/深度学习 自动驾驶 算法
道路表面缺陷数据集(裂缝/井盖/坑洼)(6000张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
随着城市化与交通运输业的快速发展,道路基础设施的健康状况直接关系到出行安全与城市运行效率。长期高强度的使用、气候变化以及施工质量差异,都会导致道路表面出现裂缝、坑洼、井盖下沉及修补不良等缺陷。这些问题不仅影响驾驶舒适度,还可能引发交通事故,增加道路养护成本。
道路表面缺陷数据集(裂缝/井盖/坑洼)(6000张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
|
2月前
|
机器学习/深度学习 存储 监控
基于深度学习YOLO框架的城市道路损伤检测与评估项目系统【附完整源码+数据集】
本项目基于深度学习的YOLO框架,成功实现了城市道路损伤的自动检测与评估。通过YOLOv8模型,我们能够高效地识别和分类路面裂缝、井盖移位、坑洼路面等常见的道路损伤类型。系统的核心优势在于其高效性和实时性,能够实时监控城市道路,自动标注损伤类型,并生成损伤评估报告。
110 0
基于深度学习YOLO框架的城市道路损伤检测与评估项目系统【附完整源码+数据集】
|
2月前
|
机器学习/深度学习 算法 自动驾驶
深度学习与图像处理 | 基于传统图像处理的自动驾驶车道线检测
本节介绍了基于OpenCV的传统图像处理算法在车道线检测中的应用,重点讲解了如何通过HSV颜色空间提取黄色和白色车道线、使用高斯模糊降噪、Canny算子提取边缘、感兴趣区域裁剪以及霍夫变换检测线段。最终通过对检测到的线段进行聚类与平均,得到代表左右车道线的直线,并实现车道线的可视化显示。该方法为自动驾驶小车提供了转向控制依据。
176 2

热门文章

最新文章

推荐镜像

更多