人脸图片->人脸检测->人脸对齐->人脸识别->测试结果
参考
知乎RetinaFace+ArcFace人脸识别测试:https://zhuanlan.zhihu.com/p/352152080
AIStudio:AIStudio仓库
paddle github:https://github.com/GuoQuanhao/RetinaFace-Paddle
pytorch github:https://github.com/biubug6/Pytorch_Retinaface
理解
(2)进一步添加自监督网络解码器(mesh decoder)分支,与已有的监督分支并行预测像素级的3D形状的人脸信息。和三维密集对应回归(3D dense correspondence regression)。这种密集的人脸定位为所有不同的尺度提供了精确的人脸位置信息。
1、RetinaFace的人脸检测和人脸对齐代码
人脸检测和人脸对齐部分代码参考:https://github.com/biubug6/Pytorch_Retinaface,该代码中也包含人脸识别,测试过期效果,不如ArcFace,感兴趣的可以试下。
2、ArcFace的人脸识别代码
人脸识别代码参考:https://github.com/TreB1eN/InsightFace_Pytorch。
整合了RetinaFace的人脸检测和人脸对齐代码和ArcFace的人脸识别代码,使用LFW数据进行测试,即LFW人脸图片->人脸检测->人脸对齐->人脸识别->测试结果。测试方案如下:
3、对比
(1)人脸检测中,对于RetinaFace,采用代码中的MobileNet0.25-RetinaFace和Resnet50-RetinaFace两种模型;
(2)人脸对齐中,代码中的人脸对齐有相似变换(get_similarity_transform_for_cv2)、仿射变换(getAffineTransform);为了验证不同变换的效果,本人也加入了透视变换(getPerspectiveTransform),共3种变换进行测试;
(3)对于ArcFace,采用代码中的MobileFacenet-ArcFace和IR-SE50-ArcFace两种模型。上述三种情形共组成12种方案。
从图中可以看出,Resnet50-RetinaFace+相似变换+IR-SE50-ArcFace组合取得最优效果,准确率为99.43%
关键点
密集人脸关键点准确性除了人脸框和5点,Retinaface还输入密集人脸关键点,并且是自监督训练。
在AFLW2000-3D数据集上评价密集人脸关键点定位
(1)2D投影下的68人脸关键点
(2)所有关键点的3D坐标。平均误差通过人脸框大小归一化。图8a和图8b是当前最好方法的CED曲线。尽管自监督和有监督方法的性能差异还比较大,但是RetinaFace相比较而言是最好的方法。
特别的,可以看出:
(1)五点回归可以避免密集回归分支的训练困难并且可以显著提升密集回归的效果。
(2)使用单级特征来预测密集人脸比使用RoI特征(如网格编码)要困难的多。如图8c所示,RetinaFace可以很容易的处理人脸姿态变化但是在复杂场景下就比较困难。这表示没有对齐以及过于压缩的特征表示(1x1x256)会妨碍单级框架获取高精度的密集回归输出。尽管如此,回归分支中投影出来的回归区域依然有助于人类检测结果的提升。
训练
解压数据,自动创建文件夹
unzip -d Data /home/aistudio/data/data75233/widerface.zip
启动训练
python train.py --network resnet50
代码流程
制作先验框
读取数据、打乱、批量输入格式
构造模型架构
喂入数据,关键的框四个点损失,五个关键点损失,是否是人脸的分类损失
四个坐标点
loss_l = F.smooth_l1_loss(loc_p, loc_t, reduction='sum')
十个坐标点
loss_landm = F.smooth_l1_loss(landm_p, landm_t, reduction='sum')
交叉熵
loss_c = F.cross_entropy(conf_p, targets_weighted.astype('int64'), reduction='sum')
笔记
annotations
详解Python中函数和模块的特殊属性__annotations__
Python是一种动态类型语言,也是强类型语言。在Python语言中,使用变量之前不需要声明其类型,直接赋值即可创建变量,变量初始类型取决于等号右侧表达式的值的类型。创建之后,变量的类型可以随时发生变化,但在任何时刻,每个变量都有确定的类型。
函数的__annotations__属性只包含形参和返回值的注解,在Python中,函数会维护一个特殊属性__annotations__,这是一个字典,其中的“键”是被注解的形参名,“值”为注解的内容。使用时并不要求注解的内容是Python中的类型,可以是任意内容。
len,类里面定义,引用类的时候会触发这个魔法函数
dataset = WiderFaceDetection(training_dataset, preproc(img_dim, rgb_mean, rgb_std))epoch_size = math.ceil(len(dataset) / batch_size)
def __len__(self):return len(self.imgs_path)
iter(self),for循环的时候触发
for images, labels in batch_iterator:if iteration % epoch_size == 0:if (epoch % 5 == 0 and epoch > 0) or (epoch % 5 == 0 and epoch > cfg['decay1']):