戴口罩的人脸,鼻子和嘴都被挡住了,原来的人脸识别模型会认错。这是我大学时主持的省级大学生创新训练项目,从 2021 年做到 2023 年,最后写成了我的第一篇论文。
想法
FaceNet 是常用的人脸识别模型,它用三元组损失(Triplet Loss)训练:拿一张脸当“锚点”,让同一个人的另一张脸(正样本)靠近它,让别人的脸(负样本)离它远一点。它认一般的人脸很准,遇到戴口罩的脸就不行了。
我的改法是多加一个点:
于是我把 FaceNet 的三元组改成四元组,增加的那一个 point 就是口罩脸。

训练的目标:同一个人戴不戴口罩,都要被拉到一起;不同的人推开。
数据
真实的戴口罩照片不好找,我用开源工具 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、做向量检索的时候,“把相似的东西拉近、不相似的推远”这件事,我在训练人脸模型时已经亲手调过一遍了。