林文威

← 全部作品

学校

戴口罩人脸识别

在 FaceNet 的基础上,把三元组损失改为四元组损失,用来识别戴口罩的人脸。第一作者论文,发表于 IEEE ICIPCA 2023。

时间
2021.04 – 2023
场合
江苏省大学生创新训练计划
我做的
项目主持人:算法设计、开发和论文
成果
第一作者论文,IEEE ICIPCA 2023
技术
PyTorch · FaceNet · ResNet · MaskTheFace
没戴口罩戴口罩同一个人:拉近

戴口罩的人脸,鼻子和嘴都被挡住了,原来的人脸识别模型会认错。这是我大学时主持的省级大学生创新训练项目,从 2021 年做到 2023 年,最后写成了我的第一篇论文。

想法

FaceNet 是常用的人脸识别模型,它用三元组损失(Triplet Loss)训练:拿一张脸当“锚点”,让同一个人的另一张脸(正样本)靠近它,让别人的脸(负样本)离它远一点。它认一般的人脸很准,遇到戴口罩的脸就不行了。

我的改法是多加一个点:

于是我把 FaceNet 的三元组改成四元组,增加的那一个 point 就是口罩脸。

四元组的示意:锚点 A、同一个人戴口罩的 Am、正样本 P、负样本 N;训练之后,A 和 Am、P 靠近,和 N 拉远

训练的目标:同一个人戴不戴口罩,都要被拉到一起;不同的人推开。

数据

真实的戴口罩照片不好找,我用开源工具 MaskTheFace 给公开的人脸数据集“戴”上口罩:医用蓝、医用绿、N95、KN95 几种口罩随机套。

公开数据集里的几张人脸,上排是原图,下排是合成戴上不同口罩之后

  • 训练:CASIA-WebFace(一万多人、近五十万张)和它合成的戴口罩版本;
  • 测试:真实戴口罩的 MFR2、普通人脸的 LFW,以及给 LFW 一半照片随机加口罩的 LFW-M。

训练流程用 PyTorch 的人脸识别工具箱 FaceX-Zoo 搭,主干网络是 ResNet-50。

结果

在 CASIA-WebFace 上训练,和两个对照比(准确率,%):

测试集 四元组(我的方法) 三元组 + 戴口罩数据 三元组
LFW-M(一半戴口罩) 95.73 95.68 90.80
MFR2(真实戴口罩) 99.03 98.14 97.38
LFW(不戴口罩) 96.63 95.60 96.01

三个测试集上都比对照好一点。我最在意的是最后一行:学会认戴口罩的脸,没有把认普通人脸的本事丢掉。

论文里也写了不足:换成另一个数据集 CelebA 训练时效果不如对照,可能是数据只有一半多;LFW 上 96% 的成绩,离当时最好的 99% 还有距离。

过程

记得当时期末复习周,我还在实验室里调试模型,每天第一件事就是去看看模型的运行结果,不满意再调下参数继续跑(中间还遇到过各种坑,比如 3090 显卡太热了,直接让机器重启等等)。

实验做完,论文却卡了很久。最后的办法是:

屏蔽我的 Judge,把心里想说的都写下来,然后交给 ChatGPT 润色。

论文 Masked Face Recognition with Quadruplet Loss 发表在 2023 年的 IEEE 图像处理与计算机应用国际会议(ICIPCA 2023),我是第一作者,指导老师由从哲。

回头看

这段经历后来帮了我很多:做 embedding、做向量检索的时候,“把相似的东西拉近、不相似的推远”这件事,我在训练人脸模型时已经亲手调过一遍了。