OPPO AI安全竞赛-人脸识别攻防

第一次竞赛-OPPO AI安全竞赛-人脸识别攻防

1. 概述

本次比赛将会聚焦于人脸识别场景中的反AI的对抗攻击。为了模拟真实的人脸识别场景并增加比赛的难度,我们将在后台使用防御性较好的一组模型作为黑盒模型。选手在不清楚模型细节的前提之下,构造有目标或无目标的对抗样本

从比赛内容可以看出来是关于人脸模型的黑盒攻击,而由于无法使用基于查询的方式,所以只能从基于迁移的角度构造人脸对抗样本。

本次比赛结果:总共2349个队伍,我们团队初赛10,复赛14,有那么一丝遗憾没有进入决赛…

2.方法总结

模型相关

​ 我们采用集成模型的方式训练人脸对抗样本,模型结构包括FaceNet, MobileFaceNet, IR_101,IR_152, IR_50, IRSE_50等,IRSE_50是在IR_50的基础上了SE(Squeeze-and-Excitation),可以理解为加了一个Attention。

​ 因为是黑盒攻击,所以采用Backbone提取人脸特征,用于分类。

模型名称 简介 参考链接(code)
Facenet Inception Resnet V1作为Backbone https://github.com/timesler/facenet-pytorch/blob/master/models/inception_resnet_v1.py
MobileFaceNet mobilenet替换了facenet的inception,进行提取人脸特征 https://github.com/JDAI-CV/FaceX-Zoo/blob/main/backbone/MobileFaceNets.py
IR_101 ResNet101作为BackBone https://gitee.com/heronwang/face.evoLVe.PyTorch/blob/master/backbone/model_irse.py
IR_152 ResNet152作为BackBone https://gitee.com/heronwang/face.evoLVe.PyTorch/blob/master/backbone/model_irse.py
IR_50 ResNet50作为BackBone https://gitee.com/heronwang/face.evoLVe.PyTorch/blob/master/backbone/model_irse.py

针对不同的model,我们选择加载在不同训练集上训练的权重,facenet,mobileFaceNet,irse50,IR_152加载在LFW上训练参数(https://drive.google.com/drive/folders/1G_2R_7XQhzzMQdEhph0ZI7dV4sGYjjzu),ir50_ms1m,IR_50_LFW_AdvTrain,IR_101,分别加载baseline中model参数。具体加载方式可见run.py中set_model_info方法。

我们已为所需加载的model_list设置了默认参数,每次运行时会首先加载上述7个model。

解决方案和算法介绍

针对本次比赛赛题,由于每日上传次数的限制,我们从基于迁移性的人脸对抗攻击出发,以FGSM为基本方法,结合目前提高攻击迁移性方法 momentum(MI)input-diversityDI),ensemble-modeltranslation-InvariantTI),Patch-wise(PI)Staircase Sign **Method(SSM)**等(这些方法将在后面具体介绍,包括公式,paper,作者等)。

​ 算法流程:

  1. 输入输出阶段

    ​ 我们通过将攻击图像adv_image和face pair的比对图像com_image(题目中提及到的样本I构建的face pair的比对)输入model,在输入阶段我们参考了 【CVPR2019】Improving transferability of adversarial examples with input diversity(Cihang Xie, Zhishuai Zhang, Yuyin Zhou, Song Bai, Jianyu Wang, Zhou Ren, Alan L. Yuille),对adv_image和com_image做同样的resize和padding后使用interpolate方法将图像调整为model输入尺寸,然后输入model,最后输出[1,512]的特征值。

  2. LOSS及权重

    ​ 使用余弦相似度计算adv_image的特征与com_image的特征距离作为攻击强度目标(攻击损失-adv_loss),另一方面使用MSSSIM计算adv_image与ori_image的结构相似度(质量损失-struct_loss)将这两部分作为total loss用于更新adv_image。

    我们将迭代次数设置为40次,在每次迭代后根据当前的adv_loss和struct_loss更新不同损失权重:

  3. 梯度计算

    ​ 根据loss可以得到gradient,第一步使用了动量的方法,参考了 【CVPR2018】Boosting adversarial attacks with momentum(Yinpeng Dong, Fangzhou Liao, Tianyu Pang, Hang Su, Jun Zhu, Xiaolin Hu, Jianguo Li)我们将此次计算得到的gradient与上次迭代的gradient结合,

    然后第二步参考了 【CVPR2019】Evading Defenses to Transferable Adversarial Examples by Translation-Invariant Attacks(Yinpeng Dong, Tianyu Pang, Hang Su, Jun Zhu),将梯度做一次平移转换(考虑CNN的平移不变性)

    第三步参考 【ECCV2020】Patch-wise Attack for Fooling Deep Neural Network(Lianli Gao,Qilong Zhang,Jingkuan Song,Xianglong Liu,Heng Tao Shen),这个方法是将当前区域干扰超出设置值的部分映射到周围区域(减少直接clip掉的数值造成的信息丢失),同时这部分参考Staircase Sign Method for Boosting Adversarial Attacks(Lianli Gao, Qilong Zhang, Xiaosu Zhu, Jingkuan Song Heng Tao Shen)将sign值做一个百分值计算,这一步的作用是不仅仅考虑gradient的方向,同时考虑数值的影响。(计算参数直接参考文章中参数设置)

  4. adv_image选取

    我们最开始设置的干扰大小的是8,MSSSIM是0.96。迭代40次得到的adv_image,我们使用Face++的人脸比对API验证当前adv_image与com_image的相似程度,满足阙值后保存为待提交数据集。

3. 结语

第一次参加AI与安全相关竞赛,后续还有发表其他比赛的参赛分享,感兴趣的可以关注一波哦,也可私聊我探讨比赛思路。

上一篇:螺环功能化的磷光铱(III)配合物、金属螺环配合物(PySFX)2Ir(PyFO)-定制


下一篇:拓展Swagger功能,支持JsonView视图