如果你对MindSpore感兴趣,可以关注昇思MindSpore社区
云平台帮助用户快速创建和部署模型,管理全周期AI工作流,选择下面的云平台以开始使用昇思MindSpore,获取安装命令,安装MindSpore2.0.0-alpha版本,可以在昇思教程中进入ModelArts官网
选择下方CodeLab立即体验
等待环境搭建完成
下载NoteBook样例代码,PFLD:实时人脸关键点检测算法 ,为样例代码
打开一个terminal,将项目clone下来
选择Kernel环境
切换至GPU环境,切换成第一个限时免费
进入昇思MindSpore官网,点击上方的安装
获取安装命令
安装MindSpore 2.0 GPU版本
安装mindvision
安装下载download
开始实验之前,请确保本地已经安装了Python环境并安装了MindSpore Vision套件。
本案例使用300W数据集作为训练集和验证集。请在官网https://ibug.doc.ic.ac.uk/resources/300-W/下载afw,helen,ibug,ifpw这四个文件。
300W数据集简介
300W数据集是一个非常通用的人脸对齐数据集,也是近年来凡paper,都要出指标比对的必然数据集。下载链接:https://ibug.doc.ic.ac.uk/resources/300-W/
该数据集共计3148+689张图像,每个图像上包含不止一张人脸,但是对于每张图像只标注一张人脸。
该数据集包含的文件目录为:
afw(train 337) https://ibug.doc.ic.ac.uk/download/annotations/afw.zip
helen(train 2000 + test 330)
https://ibug.doc.ic.ac.uk/download/annotations/helen.zipibug(test 135)
https://ibug.doc.ic.ac.uk/download/annotations/ibug.ziplfpw(train 811 + test 224)
https://ibug.doc.ic.ac.uk/download/annotations/lfpw.zip该数据集训练集共计3148张图像,测试集共计689张图像
其中每个图像上包含不止一张人脸,但是对于每张图像只标注一张人脸。由以上4个文件夹组成的训练集共计3148张图像,测试集有689张图像。
请将解压后的数据集放到https://blog.csdn.net/qq_46207024/article/details/datasets/300W/300W_images/下,文件目录如下所示:
原始数据集中并没有将训练集的图片和关键点进行汇总,而是存储在pts文件中,非常分散,不利于数据集加载。
因此,运行以下代码对数据中的关键点和样本路径进行收集汇总以便后续的训练和评估过程。
运行成功后,将生成list_68pt_rect_attr_train.txt和list_68pt_rect_attr_test.txt两个文件。
在300W数据集中,尽管已经重新标注了四个数据集并统一为68个坐标点,但是对于网络而言数据量仍然不大,因此使用旋转、平移等操作将训练数据进行数据增强。
通过数据集加载接口加载数据集,并转换为Tensor以备输入模型。
运行以下代码观察数据增强后的图片。可以发现图片经过了旋转处理,并且图片的shape也已经转换为待输入网络的(N,C,H,W)格式,其中N代表样本数量,C代表图片通道,H和W代表图片的高和宽。
前文提到过PFLD模型的骨干网络采用了MobileNet网络,其中采用了大量的卷积层用于提取面部特征,由于人脸除了丰富的细节特征,还包含不同器官间之间的结构特征。所以,在主干网络的最后将多个尺度的特征结合起来以增强关键点的检测效果。
图中黄色框的部分代表了网络的骨干部分,主要由MobileNet构成用于提取特征,在骨干网络的后半部分有明显大小不同的三组特征图,这代表了不同尺度的特征图,通过对不同尺度特征图的组合利用来进行关键点的检测。
骨干网络中还有一条分支指向了绿色框代表的辅助网络,辅助网络接受骨干网络其中一层的特征图用于进行偏航角、俯仰角和横滚角的预测,以此来增强模型的泛化能力,提高预测准确率。
主干网络主要用于提取特征和预测关键点。结构如所示,先采用了mobilenet v2 的多个bottleneck 层, 然后采用多尺度,再通过全连接层把多个尺度的特征连接起来。
定义检测器的目的是为了更好的适应不同数量坐标点的情况。feature_num默认为176,如果使用0.25X版本需要改为44,具体计算方式可查看论文[1]。landmark_num常见取值为21,68,98,这主要取决于使用的数据集。
辅助网络是PFLD网络中一个非常重要的结构,前文提到人脸的器官结构信息是非常重要的,而该信息在头部发生扭动,俯仰等情况时,关键点会变形。此时,如果加入偏航角,俯仰角等信息会增强模型的预测能力。
训练的质量极大程度上取决于损失函数的设计,常用的 𝐿1 和 𝐿2损失对于小规模训练数据不十分友好,给定两点在图像空间中的偏差,将两点的投影从3D真实面孔应用到2D图像,真实面孔的内在距离可能明显不同,因此将几何信息即偏航角、俯仰角和横滚角整合到惩罚中可缓解此问题。
在之前的工作中,我们已经将300W数据集进行了训练集和测试集的划分、定义了网络结构,完成了针对不同数据进行不同程度惩罚的损失函数。在midspore中提供了训练的接口,但是直接使用此接口必须满足每条数据只有两列,例如一张图片和对应的类别等,的数据集不能满足此要求,因此在定义训练流程之前,需要自定义封装了损失函数和模型网络的类。
具体代码如下:
实例化损失函数,优化器,使用Model接口编译网络。本案例训练的是PFLD1X网络,论文中也提到了0.25X网络,其网络的每层参数为1X网络的四分之一。
在300W数据集的验证集上进行评估。