OPPO安全挑战赛之人脸安全对抗初赛
模型介绍
给定待攻击的干净样本clean_image\mathrm{clean\_image}clean_image和不同人名的的目标样本target_image\mathrm{target\_image}target_image。将干净样本clean_image\mathrm{clean\_image}clean_image,对抗样本adv_image\mathrm{adv\_image}adv_image和目标样本target_image\mathrm{target\_image}target_image一同输入到多个人脸识别模型FR_1,⋯,FR_n\mathrm{FR\_1},\cdots,\mathrm{FR\_n}FR_1,⋯,FR_n中,经过多个模型整合后得到与之对应的人脸编码向量source_vector\mathrm{source\_vector}source_vector,adv_vector\mathrm{adv\_vector}adv_vector和target_vector\mathrm{target\_vector}target_vector。计算source_vector\mathrm{source\_vector}source_vector和adv_vector\mathrm{adv\_vector}adv_vector的相似度Similarity1\mathrm{Similarity1}Similarity1,并且我们希望Similarity1\mathrm{Similarity1}Similarity1的值越小越好。计算target_vector\mathrm{target\_vector}target_vector和adv_vector\mathrm{adv\_vector}adv_vector的相似度Similarity2\mathrm{Similarity2}Similarity2,我们希望Similarity2\mathrm{Similarity2}Similarity2的值越大越好。通过优化Similarity\mathrm{Similarity}Similarity的损失,得到对抗扰动noise\mathrm{noise}noise,从而能够达到以上两个目的。利用正则化损失Regularization\mathrm{Regularization}Regularization来限制对抗扰动noise\mathrm{noise}noise扰动的范围。得到的对抗扰动经过高斯平滑后与人脸Mask\mathrm{Mask}Mask一起加在干净样中得到更新后的人脸对抗样本adv_image\mathrm{adv\_image}adv_image。
人脸Mask\mathrm{Mask}Mask
本次比赛的任务是攻击人脸图像,考虑现有神经网络模型在训练人脸数据的时候对于重要的部位是比较敏感的。因此添加对抗扰动时只针对人脸的五官。使用dlib\mathrm{dlib}dlib标定人脸的686868个landmark\mathrm{landmark}landmark,选取了171717个点连接组成一个待攻击的区域,对于很少的无法用dlib\mathrm{dlib}dlib标定landmark\mathrm{landmark}landmark的图片,手动框出人脸范围。最后将生成的人脸Mask\mathrm{Mask}Mask转化成[0,1][0,1][0,1]j矩阵对对抗扰动noise\mathrm{noise}noise做矩阵乘法。
人脸识别模型
人脸识别模型的训练可以利用如下人脸识别网络结构在本地训练自己的人脸识别模型,也可以下载已经训练好的人脸识别模型参数。给定一张人脸图片,经过多个人脸识别模型生成多个人脸编码向量,最终整合成一个人脸编码向量。
人脸识别模型网络结构:
- Facenet\mathrm{Facenet}Facenet:https://github.com/davidsandberg/facenet?spm=5176.21852664.0.0.14fa14cfqPT5yU&file=facenet.git
- Insightface\mathrm{Insightface}Insightface:https://github.com/luckycallor/InsightFace-tensorflow.git?spm=5176.21852664.0.0.14fa14cfqPT5yU&file=InsightFace-tensorflow.git
- MobileFaceNet\mathrm{MobileFaceNet}MobileFaceNet:https://github.com/sirius-ai/MobileFaceNet_TF.git?spm=5176.21852664.0.0.14fa14cfqPT5yU&file=MobileFaceNet_TF.git
- CosFace\mathrm{CosFace}CosFace:https://github.com/yule-li/CosFace.git?spm=5176.21852664.0.0.14fa14cfqPT5yU&file=CosFace.git
相似度计算
人脸编码向量之间的相似度Similarity\mathrm{Similarity}Similarity计算可以分为Similarity1\mathrm{Similarity1}Similarity1和Similarity2\mathrm{Similarity2}Similarity2。Similarity1\mathrm{Similarity1}Similarity1表示的是对抗样本与干净样本人脸编码向量之间的相似度。Similarity2\mathrm{Similarity2}Similarity2表示的是为对抗样本与目标样本编码向量之间的相似度。给定向量XXX和YYY,向量的相似度计算公式可以被总结为:
- 内积计算:d(X,Y)=X⋅Y=∑iXiYid(X,Y)=X \cdot Y = \sum\limits_{i}X_iY_id(X,Y)=X⋅Y=i∑XiYi
- 余弦相似度:d(X,Y)=X⋅Y∥X∥∥Y∥=∑iXiYi∑iXi2∑iYi2d(X,Y)=\frac{X \cdot Y}{\|X\|\|Y\|}=\frac{\sum\limits_{i}X_iY_i}{\sqrt{\sum\limits_iX_i^2}\sqrt{\sum\limits_iY_i^2}}d(X,Y)=∥X∥∥Y∥X⋅Y=i∑Xi2i∑Yi2i∑XiYi
- 欧氏距离:d(X,Y)=∑i(Xi−Yi)2d(X,Y)=\sqrt{\sum\limits_i(X_i-Y_i)^2}d(X,Y)=i∑(Xi−Yi)2
- 皮尔逊相关系数:d(X,Y)=∑i(Xi−Xˉ)(Yi−Yˉ)∑i(Xi−Xˉ)2∑i(Yi−Yˉ)2d(X,Y)=\frac{\sum\limits_i(X_i-\bar{X})(Y_i-\bar{Y})}{\sqrt{\sum_i(X_i-\bar{X})^2}\sqrt{\sum\limits_i(Y_i-\bar{Y})^2}}d(X,Y)=∑i(Xi−Xˉ)2i∑(Yi−Yˉ)2i∑(Xi−Xˉ)(Yi−Yˉ)
- 斯皮尔曼相关系数:d(X,Y)=∑i(Xi−Xˉ)(Yi−Yˉ)∑i(Xi−Xˉ)2∑i(Yi−Yˉ)2d(X,Y)=\frac{\sum\limits_i(X_i-\bar{X})(Y_i-\bar{Y})}{\sqrt{\sum\limits_i(X_i-\bar{X})^2\sum\limits_i(Y_i-\bar{Y})^2}}d(X,Y)=i∑(Xi−Xˉ)2i∑(Yi−Yˉ)2i∑(Xi−Xˉ)(Yi−Yˉ)
最常用的相似度计算公式是余弦相似度,时间允许的情况下其它的相似度计算公式可以尝试看看,是否也会对成绩有所提高。
在无目标攻击的视角下,对抗样本的人脸编码向量的与干净样本编码向量的相似度越小越好,Smiliarity1\mathrm{Smiliarity1}Smiliarity1关于样本image\mathrm{image}image的负梯度方向−∂Similarity1∂image-\frac{\partial \mathrm{Similarity1}}{\partial {\mathrm{image}}}−∂image∂Similarity1是我们想要的方向。在有目标攻击的视角下,对抗样本的人脸编码向量的与目标样本编码向量的相似度越大越好,Smiliarity2\mathrm{Smiliarity2}Smiliarity2关于样本image\mathrm{image}image的梯度方向∂Similarity2∂image\frac{\partial \mathrm{Similarity2}}{\partial {\mathrm{image}}}∂image∂Similarity2是我们想要的方向。综上所述总的相似度Similarity\mathrm{Similarity}Similarity计算如下公式:Similarity=−Similarity1+Similarity2\mathrm{Similarity}=-\mathrm{Similarity1}+\mathrm{Similarity2}Similarity=−Similarity1+Similarity2此时Similarity\mathrm{Similarity}Similarity对image\mathrm{image}image的梯度方向能够同时获得有无目标攻击和有目标攻击的这两个梯度方向:∂Similarity∂image=−∂Similarity1∂image+∂Similarity2∂image\frac{\partial \mathrm{Similarity}}{\partial {\mathrm{image}}}=-\frac{\partial \mathrm{Similarity1}}{\partial {\mathrm{image}}}+\frac{\partial \mathrm{Similarity2}}{\partial {\mathrm{image}}}∂image∂Similarity=−∂image∂Similarity1+∂image∂Similarity2
正则化损失
正则化损失可以分为L2L_{2}L2损失函数和TVTVTV损失函数,它们的作用是限制对抗扰动的大小并对图像进行平滑处理。
L2L_{2}L2范数损失
给定干净人脸图像X∈Rw×h×c{\bf{X}} \in \mathbb{R}^{w \times h \times c}X∈Rw×h×c和对抗图像X′∈Rw×h×c{\bf{X}}^{\prime} \in \mathbb{R}^{w \times h \times c}X′∈Rw×h×c
- 形式1:Lp(X)=∑i,j,k(Xi,j,k−Xi,j,k′)2L_p({\bf{X}})=\sqrt{\sum\limits_{i,j,k}({\bf{X}}_{i,j,k}-{\bf{X}}^{\prime}_{i,j,k})^2}Lp(X)=i,j,k∑(Xi,j,k−Xi,j,k′)2
- 形式2:Lp(X)=∑i=1w∑j=1h∑k=1c(Xi,j,k−Xi,j,k′)2w×hL_p({\bf{X}})=\frac{\sum\limits_{i=1}^{w}\sum\limits_{j=1}^{h}\sqrt{\sum\limits^{c}_{k=1}({\bf{X}}_{i,j,k}-{\bf{X}}^{\prime}_{i,j,k})^2}}{w\times h}Lp(X)=w×hi=1∑wj=1∑hk=1∑c(Xi,j,k−Xi,j,k′)2
TV\mathrm{TV}TV损失
TV loss全称Total Variation Loss,其作用主要是降噪,图像中相邻像素值的差异可以通过降低TV Loss来一定程度上进行解决 ,从而保持图像的光滑性。
- 连续TV_Loss\mathrm{TV\_ Loss}TV_Loss的定义为:
TV_Loss(u)=∫Duux2+uy2dxdy\mathrm{TV\_ Loss}(u)=\int_{D_u}\sqrt{u^2_x+u^2_y}dxdyTV_Loss(u)=∫Duux2+uy2dxdy其中ux=∂u∂xu_x=\frac{\partial u}{\partial x}ux=∂x∂u,uy=∂u∂yu_y=\frac{\partial u}{\partial y}uy=∂y∂u,DuD_uDu是定义域。 - 带阶数的TV_Loss\mathrm{TV \_Loss}TV_Loss的定义为:
TV_Loss(u)=∫Du(ux2+uy2)β2dxdy\mathrm{TV\_ Loss}(u)=\int_{D_u}(u^2_x+u^2_y)^{\frac{\beta}{2}}dxdyTV_Loss(u)=∫Du(ux2+uy2)2βdxdy - 离散TV_Loss\mathrm{TV\_Loss}TV_Loss的定义为:
TV_Loss(x)=∑i,j((xi,j−1−xi,j)2+(xi+1,j−xi,j)2)β2\mathrm{TV\_ Loss}(x)=\sum\limits_{i,j}((x_{i,j-1}-x_{i,j})^2+(x_{i+1,j}-x_{i,j})^2)^{\frac{\beta}{2}}TV_Loss(x)=i,j∑((xi,j−1−xi,j)2+(xi+1,j−xi,j)2)2β
在比赛中,采用的是离散的TV_loss\mathrm{TV\_loss}TV_loss,并且阶数取为β=2\beta=2β=2。
动量迭代攻击
本次比赛主要利用的是基于梯度的迭代攻击,在迭代的攻击过程中加入动量项之后可以稳定更新方向并在迭代期间从较差的局部最大值中离开,从而产生更多迁移性更强的的对抗样本。为了进一步提高黑盒攻击的成功率。具体的计算公式如下所示:gt+1=μ∗gt+∇xL(Xtadv,ytrue ;θ)∥∇xL(Xtadv,ytrue ;θ)∥1Xt+1adv=ClipXϵ(Xtadv+α∗sign(gt+1))\begin{gathered} g_{t+1}=\mu * g_{t}+\frac{\nabla_{x} L\left(X_{t}^{a d v}, y^{\text {true }} ; \theta\right)} {\left\|\nabla_{x} L\left(X_{t}^{a d v}, y^{\text {true }} ; \theta\right)\right\|_{1}} \\ X_{t+1}^{a d v}=\operatorname{Clip}_{X}^{\epsilon}\left(X_{t}^{a d v}+\alpha * \operatorname{sign}\left(g_{t+1}\right)\right) \end{gathered} gt+1=μ∗gt+∥∥∇xL(Xtadv,ytrue ;θ)∥∥1∇xL(Xtadv,ytrue ;θ)Xt+1adv=ClipXϵ(Xtadv+α∗sign(gt+1))
图像去噪平滑
生成的对抗扰动通过高斯滤波进行去噪平滑。考虑到OPPO人脸对抗样本线上测试可能会有高斯滤波这种防御机制因而在算法生成噪声的时候加入高斯滤波一定程度上也能使防御机制失效从而提高样本攻击率。使用高斯核函数进行卷积就能完成上述操作,高斯核如下:G(x,y)=1/(2πσ2)e−(x2+y2)/2σ2G(x, y)=1 /\left(2 \pi \sigma^{2}\right) e^{-\left(x^{2}+y^{2}\right) / 2 \sigma^{2}} G(x,y)=1/(2πσ2)e−(x2+y2)/2σ2
核心代码
如下代码为人脸对抗样本生成的过程,对照上面的模型流程图以及各个模块的细节讲解在代码中都有所显示,主要的核心代码提供了详细的解释和注释。
def adv_attack(tmp_noise, origin_img, target_img, mask, gaussian_blur, model_pool, index, loss1_v, momentum=0, lr=1):tmp_noise.requires_grad = True# 对对抗扰动进行高斯平滑处理noise = gaussian_blur(tmp_noise)# 对人脸图像的扰动范围进行限制noise *= maskloss1 = 0# 整合多个人脸识别模型的人脸编码向量for model_dict in model_pool:model = model_dict['model']proportion = model_dict['proportion']# 对抗样本的人脸编码向量v1 = l2_norm(model(origin_img + noise)) # 干净样本的人脸编码向量v2_1 = l2_norm(model(origin_img)).detach_() # 目标样本的人脸编码向量v2_2 = l2_norm(model(target_img)).detach_() # 对抗样本和干净样本之间的内积相似度,越小越好tmp1 = (v1*v2_1).sum() # 对抗样本和目标样本的内积相似度,越大越好tmp2 = (v1*v2_2).sum() r1 = 1r2 = 1if tmp1 < 0.2: r1 = 0if tmp2 > 0.8: r2 = 0 # 将两个相似度进行整合成总的相似度函数loss1 += (r1 * tmp1 - r2 * tmp2) * proportion # Cos Loss# 求解相似度关于样本的梯度loss1.backward(retain_graph=True) loss1_v = tmp_noise.grad.detach() * (1 - momentum) + loss1_v * momentum tmp_noise.grad.data.zero_()# L2范数损失和TV损失的量级比较大需要将它们适当的缩小r3 = 1if index > 100:r3 *= 0.1if index > 200:r3 *= 0.1# L2范数的损失loss2 = (noise**2).sum().sqrt() # TV损失loss3 = tv_loss(noise) # TV loss# 求解正则化L2和TV损失函数关于样本的梯度loss = r3 * 0.025 * loss2 + r3 * 0.004 * loss3loss.backward()# 将相似度损失的梯度与正则化损失的梯度进行整合得到对抗扰动tmp_noise = tmp_noise.detach() - lr * (tmp_noise.grad.detach() + loss1_v)# 将对抗扰动的像素进行适当的截断tmp_noise = (tmp_noise + origin_img).clamp_(-1, 1) - origin_im gtmp_noise = tmp_noise.clamp_(-0.2, 0.2)return tmp_noise, loss1_v
github代码及其成绩
我们项目的github\mathrm{github}github代码链接为:。相关的细节已经在github\mathrm{github}github中有所介绍。因为前期需要处理生成人脸Mask\mathrm{Mask}Mask之类的操作需要耗费一定的时间,在RTX_2080Ti\mathrm{RTX\_2080Ti}RTX_2080Ti中程序共耗时111一天多,前面的铺垫工作完成后,生成人脸对抗样本的时间大约只有不到222个小时。最终OPPO\mathrm{OPPO}OPPO线上的评测的成绩为101.53101.53101.53。
OPPO安全挑战赛之人脸安全对抗初赛相关推荐
- baseline发布!OPPO安全AI挑战赛,人脸识别对抗攻击赛题详解
baseline线上评测101.53分,文末附项目github地址. 今年6月,由OPPO发起,OPPO安全主办的"OPPO安全AI挑战赛"正式拉开序幕.比赛主要聚焦人脸识别场景中 ...
- 华为、小米、OPPO、VIVO联手打造“GDSA”对抗谷歌
本文转载月光博客:华为.小米.OPPO.VIVO联手打造"GDSA"对抗谷歌 据路透社报道,中国四大智能手机厂商华为.小米.OPPO 和 Vivo 正联手推出一个对标 Google ...
- 人脸生成对抗+人脸识别流程+insightface
一.人脸生成对抗 传统的DeepFake 需要大量的原始数据,并且要经过好几天的训练才能达到高质量的效果. 黎颢团队提出,将DeepFake和他此前做的怕GAN结合到一起,做了一个新系统.不需要大量训 ...
- 2020中兴捧月算法精英挑战赛-迪杰斯特拉派初赛(未来城市物流系统)总结
疫情关系,导致科研一直没法开展,老板着急,自己也无所事事.在清明过后看到了中兴的算法精英挑战赛,然后就开始了算法之旅,这里自己做一点总结,为自己以后争取点教训吧. 数据分析的重要性 这次比赛真的让我体 ...
- 2019华为软件精英挑战赛比赛经验分享(初赛,复赛,决赛)
比赛成果: 初赛(700+):西北赛区第3. 复赛(32):西北赛区第3.(华为手机v20,华为面试绿卡,西北赛区二等奖,小礼物若干) 决赛(32):全国16强,具体排名13.(没有奖金,纪念品若干, ...
- oppo2020秋招面试_扑面试问答2020
oppo2020秋招面试 The first alpha version of Flutter appeared almost three years ago - in May 2017. No on ...
- 60万奖金“人脸攻防大战”,全部进阶妙招奉上丨独家公开课实录(3)
近几年,机器学习的安全问题逐渐被研究者们所重视.而人脸识别也展现了弱人工智能向强人工智能的转化. 人脸识别是基于人的脸部特征信息进行身份识别的一种生物识别技术.人脸与人体的其它生物特征(指纹.虹膜等) ...
- 最后两周!60万奖金AI攻防赛进入冲刺(附baseline代码及实操)
由于篇幅原因,本篇文字介绍主要以第一篇baseline为例. 第二篇baseine参考如下: 代码:https://pan.baidu.com/s/1QYJ5azudMqWMqKv57MjpzA 提取 ...
- AI打AI,人脸对抗攻击公开课第四讲预告:对抗防御介绍
精选6讲针对人脸识别的AI对抗专题课,搭配实战项目演练,完成项目作业即可获得完课奖品 近年来,AI安全问题愈加受到行业关注.在今年6月的智源大会上,清华大学计算机系教授.RealAI 首席科学家朱军就 ...
最新文章
- linux mipi驱动分析_嵌入式技术在血液分析仪中的应用方案
- word转pdf后公式出现乱码怎么办?
- 哈佛大学让青蛙断腿再生:有骨头有血管,对刺激物还会产生强烈踢腿反应
- Google怎么用linux
- 2.Unity3d常用按键
- Centos 配置mailx使用外部smtp发送邮件
- 当对项目强名时自动构建失败(TeamFoudationServer试用笔记)
- python基础——if语句/条件控制
- 经典推荐--程序员之打油诗
- 表单PostGet两个长度限制问题的分析
- word中如何对公式插入题注和引用
- 大话业务流程图(二)—如何绘制业务流程图?
- hibernate 多条件组合查询之sql拼接
- ssh无秘钥登录报错sign_and_send_pubkey: signing failed: agent refused operation
- 成功领导者的20个好习惯
- 仿hotmail收件人弹层: onkeyup事件无法捕获到回车按键, 用onkeydown事件捕获额外处理回车键...
- 《C++编程风格(修订版)》——3.2 继承作用域准则
- linux下图片加密原理,Linux中常见的加密技术介绍
- [CLR via C#]1.6 Framework类库~1.9与非托管代码的互操作性
- vue.js实现联动效果
热门文章
- HTML表格中字体居中
- Golang模板函数使用范例
- 计算机硬件使用寿命,电脑中一般哪个硬件寿命最长
- 安卓类似华为手机适配底部虚拟按键的解决方案
- middles在python中什么意思_Python 基础知识入门(2)
- Java实现求2的100次方
- pathon学习笔记一(变量的名命名,基本的数据类型)
- python利用递归函数实现斐波那契数列_Python使用while循环输出斐波那契数列(Fibonacci)...
- 宽凳科技完成超亿元B1轮融资 率先突破高精地图量产落地
- 第三章 jQuery