60万元奖金 “人脸攻防战”,怎么打?丨独家公开课实录(附baseline)

近几年,机器学习的安全问题逐渐被研究者们所重视。而人脸识别也展现了弱人工智能向强人工智能的转化。

人脸识别是基于人的脸部特征信息进行身份识别的一种生物识别技术。人脸与人体的其它生物特征(指纹、虹膜等)一样与生俱来,它的唯一性和不易被复制的良好特性为身份鉴别提供了必要的前提,与其它类型的生物识别比较,人脸识别具非强制性、非接触性、及并发性,除此之外,还符合视觉特性。但这项技术也并非牢不可破。

近日,biendata平台邀请科大讯飞金牌讲师阿水,共同打造一门针对人脸识别的 AI 对抗攻防系列课程,主题囊括对抗样本介绍、人脸识别对抗样本、对抗防御、视频人脸检测与对抗防御等。

除对抗攻防的知识讲解外,课程还设有实战项目演练:以时下两个热门的AI对抗主题的竞赛为案例,详细讲解赛题及baseline模型代码,让参与学习的同学能够学以致用,快速上手实战。

本文为第二讲课程演讲实录整理(第一讲见:它为什么是人脸识别中的 “不定时炸弹”?丨独家公开课实录),主要针对【OPPO安全AI挑战赛】的赛题和baseline进行讲解,本篇baseline利用开源的人脸识别模型生成对抗样本进行黑盒攻击。

点击文末“阅读原文”可获取视频,“数据实战派”后台按指示获取ppt。获取代码、加入课程及竞赛讨论群可添加小助手。

 第二讲分享大纲如下:

一、 人脸识别原理

在很多场景下,人脸识别需要具备人脸检测和关键点检测。

人脸检测是检测原始的图片里面人脸具体的位置。关键点检测是识别出人脸的关键区域位置,例如眉毛、眼睛以及轮廓等关键点。 

由于人脸是3D的,但是模型是根据2D平面上的点去拟合的,如果人脸角度朝向不同,有一些关键点就可能检测不到。并且需要注意的是,在不同的数据集中,关键点的个数也是不同的,有的可能只有几十个,有的可能会达到上万个,所以关键点检测也是一件比较难的事情。 

关键点检测的作用,是在得到关键点的信息后,通过识别面部的区域完成人脸对齐的操作。 如果输入图片中的人脸角度不规整,那么通过关键点的信息可以将人脸转换到水平的角度。有时也会运用到活体检测上,通过人脸关键点定位和人脸追踪等技术,来验证用户是否为真实活体本人操作。

人脸识别的本质就是细粒度图像分类的过程。大多数情况下,我们利用深度学习神经网络来提取人脸的特征,提取完成后做相似度的比较来确定人的身份。

完整的步骤就是先完成人脸识别,再逐步到特征提取,最后进行相似度比较。

现在人脸检测和关键点检测这两个任务可以在模型内部完成,可以将人体的姿态估计和人脸关键点进行统一检测。

在检测到人脸之后,通过关键点对人脸进行对齐,接下来通过卷积神经网络得到中间的映射。可以理解为提取中间的feature map,用ImageNet预训练好的resnet18或者resnet50都可以用来提取特征。

提取完特征之后,将这张图片再通过网络进行正向传播,得到中间的结果,接下来可以对它进行一系列的任务,比如说一些人脸的聚类,或者是相似度的计算,也可以直接用中间提取的特征来完成分类的过程,都是可以的。

人脸识别在训练的过程中,是借助这种分类的loss来进行训练模型。人脸识别其实是提取它的中间层的feature map,然后计算相似度,最后根据相似度完成识别。 

人脸识别跟Reid方法在一些流程上是非常相通的。

假如拿到已经训练好的人脸识别模型,接下来给定一张图片通过这个模型来提取特征,然后再和图像库里一些人脸的向量计算相似度,就可以得到具体的身份定位。

这个地方的相似度度量有很多种相似度的距离度量方法。比较常见的就是 Cosine similarity。 

二、对抗样本的评价方法 

在攻击对抗样本过程中,主要运用到了黑盒攻击和白盒攻击。

但是如果想要做具体评价的时候,利用黑盒的模型在模型a上面产生对抗样本,在模型b上做评价。此时模型a模型b可能是不一样的,甚至模型b可能是黑盒的,所以要从两个角度来衡量对抗样本产生的优劣。

第一个是 Test error能够成功攻击对抗样本的比例。

比如说在OPPO的比赛里面,提交了一批大约2000张图片,然后再去算一下这2000张图片里面哪些图片是被成功攻击的。

首先要从对抗样本能否成功攻击的角度来衡量,也就是说对抗样本能否让模型b误分类。当然,能否成功攻击也和采取有目标攻击还是无目标攻击及相关的任务定义有关。

第二个就是从产生的样本和原始样本的差异性进行度量。在进行对抗样本的定义时,其实是希望所产生的对抗样本与原始样本在像素上的差异性尽可能小。在保证能够成功攻击的情况下,将图像视为矩阵时,要保证矩阵与矩阵之间的差异尽可能的小。

那么在这种情况下就会对添加的扰动有一定的限制。

第一种方法,可以对扰动的大小进行限制,比如平均的扰动到底在什么像素范围内。一般情况下假如像素的取值空间是在RGB空间内,那么像素的取值范围应该是从0到接近于255,在这种情况下,可能是让它在±20的范围内进行变化,不是所有的像素都是能够让像素随机变化。

第二种方法,通过一些图像的质量进行限制,比如用SSIM或者其他图像质量的评价指标,比较两张图片之间语义上的差异性。图像质量可以理解为当一张图片发生了一些变化,将图片压缩之后它的图像质量下降。当然,这也可以是距离度量函数。

Test Error和样本的差异性非常关键。

下图这两个例子是两类对抗样本的产生方法。

左图使用了BFGS方法,它产生的噪音大部分都是集中在物体主体的区域。

右图使用了 FGSM方法,它产生的噪音可能遍布在图片的各处,分布的范围较为分散。

在这种情况下,不同的神经网络所产生的对抗样本的噪音都是存在一定的差异的。在构建对抗样本的时候,就可以从多个模型的角度进行衡量。不同的深度学习网络计算得到的噪音可能存在一定差异。

虽然不同的深度学习网络,它的对抗样本可能是有通用性或者牵引性,但是各自的网络分别计算得到的 T或者噪音是存在一定差异的。 

本质上, 黑盒攻击不管是在比赛还是评价对抗样本的迁移性的过程中,如果在模型a上产生的对抗样本,同时希望这个样本在模型b上也能够起作用。

对抗样本的产生步骤,首先要确定具体的处理过程。处理过程可以理解为神经网络针对输入的图片进行预处理。一些开源模型对于图像约束力,它的方法是不一样的。

其次是要确定产生对抗样本的方法。比如想使用的BFGS或者one pixel等方法,在这些方法中要关注一下的产生对抗样本的速度。不同的方法一方面是误分类的准确率存在差异,另一方面就是在复杂度越高花费的时间同样存在差异,在做比赛时尽量优先选择稍微简单的方法。

最后是确定网络模型和流程。在进行人脸识别的时候可能有不同的网络模型,确定需要进行攻击的网络模型以及步骤。通常使用镜像模型在模型a上面产生对抗样本,然后在模型b上进行验证。

三、OPPO安全挑战赛介绍

本次的【OPPO安全AI挑战赛】主要聚焦在的人脸识别场景下AI的对抗攻击,本次比赛的难度比普通的对抗攻击会更难一点。因为在OPPO这个比赛针对评估模型有一定的防御效果。有线上评价的模型是黑盒模型,而且是由多个模型所组成的评价模型,最大的难点在于人脸输入的尺寸是不规整的。

四、OPPO安全挑战赛实践  

步骤1:加载人脸模型

为了保证模型的便捷性,这里我们选择了Pytorch版本的InsightFace实现,安装方法如下:

# https://github.com/nizhib/pytorch-insightface
pip install git+https://github.com/nizhib/pytorch-insightface

加载iresnet34人脸识别模型:

import insightface
model = insightface.iresnet34(pretrained=True)
model.eval()

步骤2:提取比赛人脸特征

使用iresnet34模型对初赛数据集的2000张照片提取特征,这里只需要做正向传播即可。

img_feats = torch.zeros(2000, 512).float().cuda()
idx_img = 0
with torch.no_grad():
    for img_data, _ in train_loader:
        feat = m(img_data.cuda())
        img_feats[idx_img, :] = feat
        idx_img += 1

进而对特征进行归一化,保证计算人脸相似度保持在0-1之间:

import torch.nn.functional as F
img_feats = F.normalize(img_feats, p=2, dim=1)

步骤3:多步FGSM攻击

FGSM(Fast Gradient Sign Method)是经典有效的对抗样本产生方法,具体思路如下:

  • 扰动变化量与梯度的变化方向一致,则误差函数就会增大。

  • 使用Sign函数保证了扰动同梯度方向一致,对分类结果产生最大化改变。

由于比赛是无目标攻击,所以具体的攻击步骤如下:

  • 步骤1:计算人脸特征相似度,选择与当前人脸最相似的人脸作为攻击目标。

  • 步骤2:执行单步FSGM产生对抗样本,并对扰动大小进行截断。

  • 步骤3:重复多次步骤2,直到目标人脸的概率值达到阈值。

具体实现代码如下:

def one_step_attack(source_idx, aim_idx=10):
    # 计算人脸相似度,得到攻击目标
    aim_idx = torch.matmul(
     img_feats[source_idx].view(1, 512), img_feats.T
    )[0].argsort()[-5].item()
    
    # 读取原始人脸图片
    ori_image = cv2.imread(paths[source_idx])
    img = preprocess(transforms.ToPILImage()(ori_image))
    img = img.reshape(-1, 3, 112, 112).cuda() 
    img_ori = img.clone().detach()
    
    img_adv = None
    best = 0
    
    # 执行多步扰动,记录最优结果
    for _ in range(50):
        # 每次对扰动后的图像都需要重新计算特征
        img = Variable(img, requires_grad=True)
        img_embedding = model(img.cuda())
        img_embedding = F.normalize(img_embedding, p=2, dim=1)
        feat_ids = torch.matmul(img_embedding, img_feats.T)
        objective_aim = feat_ids[0][aim_idx]
        objective_source = feat_ids[0][source_idx]
        
        if objective_aim.item() - objective_source.item() > best and objective_aim.item() == feat_ids[0].max().item():
            img_adv = img.clone().detach()
        
        model.zero_grad()
        objective_aim.backward()
        
        # 根据梯度信息,单步FGSM
        data_grad = img.grad.data.sign() * 0.0075
        with torch.no_grad():
            delta_diff = img + Variable(data_grad) - img_ori
            delta_diff = torch.clamp(delta_diff, min=-0.13, max=0.13)
            img = img_ori + delta_diff
    
    return img, img_ori

(滑动查看完整代码)

步骤4:保存测试集攻击结果

对于测试集每张照片,重复上述操作得到对抗样本,并进行保存为原始格式。

for idx in range(len(paths)):    
    path1, path2 = paths[idx].split('/')[-2:]
    
    img1, img2 = one_step_attack(idx)
    img1 = unorm(img1[0])
    img1 = img1.data.cpu().numpy().round()
    img1 = np.clip(img1, 1, 255)
    img1 = img1.transpose([1, 2, 0])
    
    h, w = cv2.imread(paths[idx]).shape[:2]
    img1 = cv2.resize(img1, (h, w))
    cv2.imwrite(f'./images/{path1}/{path2}', img1)

Baseline在初赛评测得分40分,模型下载链接:

https://pan.baidu.com/s/1QYJ5azudMqWMqKv57MjpzA

提取码: cr9p

 往期推荐 

 Science 论文:诺奖经济学家的经典决策模型,被 AI 挑战

 CVPR 2021 当之无愧的最佳论文奖

丨  arXiv 时代,应如何看待那些互相矛盾的论文?

 “三巨头” 联合发布万字长文,深度学习将通往何方?

丨这篇论文,透露谷歌团队所构想的 “未来搜索”

丨 449 页 pdf,FaceBook 称其迈出 “重塑 AI 科学的第一步”

丨我们可能已见证第一场人工智能战争

丨 斯坦福 AI Lab 好文:知识图谱深度介绍

丨清华团队最新成果:可致特朗普能咏比特币,AI 写古诗 “更上一层楼”

麻省理工团队新突破,弥补深度学习在交通领域上的关键欠缺

丨分析 30 年大脑研究发现,人脑并没有男女之分

丨机器学习迈向量子化:范式转变惊鸿一瞥

香奈儿们的 AI 实验室都在做什么?

丨比 GPU 快 15 倍,CPU 算法训练深度神经网络 “超车” 成功

丨 “从业 3 年后,我永远离开 AI 行业的 5 个原因”

丨 Bengio 团队因果学习论文反思:为何机器学习仍在因果关系中挣扎?

丨出乎意料,对抗训练可对机器人产生重大负面影响

 贝叶斯网络之父 Judea Pearl 推荐:迈向可解释的知识驱动系统

陈天桥雒芊芊脑机接口中心等团队新成果:超声波 “读脑”

听李宏毅点评 GPT-3:来自猎人暗黑大陆的模型

丨麻省理工学院学者万字长文:计算机作为一种通用技术的衰落

你的脸是这样丢掉的:人脸数据集的史上最大规模调查

 MIT 机器人教父 Rodney Brooks:机械臂编程语言的起源

一家图灵奖得主背书创企的陨落,暴露了 AI 弱国 “恒弱” 的困境?

关于数据实战派

数据实战派希望用真实数据和行业实战案例,帮助读者提升业务能力,共建有趣的大数据社区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值