查看原文
其他

天池大赛通用目标检测的对抗攻击方法一览

文永亮 PaperWeekly 2022-03-17


©PaperWeekly 原创 · 作者|文永亮

学校|哈尔滨工业大学(深圳)

研究方向|时空序列预测,目标检测


赛题:1000张图,在图上贴补丁,最多不超过10个,导致检测框失效就算得分。

比赛链接:https://tianchi.aliyun.com/competition/entrance/531806/information

数据描述:从 MSCOCO 2017 测试数据集中有条件的筛选了 1000 张图像,这些图像不会包含过多或者过少的检测框(至少会有一个检测框),并且检测框的面积相对于整图不会太小。每张图都被 resize 到500 * 500的大小,并以.png的格式存储。

攻击的检测器:Faster RCNN,YOLOv4,另外三个是黑盒。

最近做了一段时间,分享一下思路,我做的分数不高,只是做个入门介绍。

首先介绍一下相关的论文:

  • Adversarial Patch
  • DPatch
  • On Physical Adversarial Patches for Object Detection
  • Fooling automated surveillance cameras: adversarial patches to attack person detection


Adversarial Patch

1.1 简要思路

没有接触过对抗攻击的可以从这篇入手,这是第一个在对抗攻击中提出 Patch 的。


论文标题:Adversarial Patch
论文来源:NIPS 2017
论文链接:https://arxiv.org/abs/1712.09665
传统的对抗攻击就是在原图的基础上加入肉眼不可见的噪音干扰分类器,用数学的方式定义就是,给定分类器 ,其中 为样本, 为样本自身的类别,假设我们需要误判为的目标类别为 ,想要找到一个与 相近的 最大化 ,相近的约束表示为存在一个 误差满足
通俗点讲,就是把 Patch 贴在图上,跟原图相差不大并且使分类器分类失误,如下图表示了 Patch 粘贴的方式:

1.2 损失函数

就是最大化目标类别的概率期望,导致分类器误判即可,A 就是 apply 函数,把 Patch 粘贴到图中的方式,p 为 Patch 的参数,x 为原图,l 为位置。

但是这个与天池的比赛有点差距,因为是目标检测的对抗攻击,不是分类器的对抗攻击,所以就有了下面 DPatch 的论文,其实道理变化不大。


DPatch

2.1 简要思路



论文标题:DPatch: An Adversarial Patch Attack on Object Detectors
论文来源:AAAI 2019
论文链接:https://arxiv.org/abs/1806.02299
代码链接:https://github.com/veralauee/DPatch
这篇是 AAAI 2019 Workshop 的论文,这个思路是最贴切赛题而且非常简单容易实现的,就是在原图的基础上直接添加 Patch,固定住 YOLO 或者 Faster R-CNN 等检测器的权重,反向传播只更新 Patch,文章只在图片的左上角贴了 Patch,这里需要看他的损失函数如何设计的。

如下图所示,只在单车左上方贴上 40*40 的 Patch,即可让检测器失效。

2.2 损失函数

为了训练无目标的 DPatch,这里的无目标 DPatch 是指只需要把检测框失效,不需要把单车误识别为人,这样是有目标攻击。所以我们希望找到一个 Patch,假设把 Patch 贴上图中的 apply 函数为 A,我们需要最大化与真正的类标签 和边界框标签 目标检测器的损失:

如果是有目标攻击,我们希望找到一个 P,它能使目标类标签 和边界框标签 的损失最小化:

GT 的类别标签在这个比赛中没有提供,其实也很简单,可以直接用未攻击过的检测器模型得到 label 存下来,我也直接用了官方给的 YOLOv4 的代码跑了结果存下了类别标签以及检测框 BBox 的位置,大小。

2.3 论文效果

从指标上看,小物体如鸟这样的无目标攻击会比较困难。论文作者指出 DPatch 是具有泛化能力的,YOLO 训练出来的 Patch 给 Faster-RCNN 用也是没问题的,反之也行。

有一份 github 的开源代码 https://github.com/veralauee/DPatch,我在这个基础上把 Patch 与 pytorch-yolov4 结合,做了论文的思路,但是效果不是很好只有 56 分,如果把 Patch 贴在中心有 200 分左右。


ICML 2019
3.1 简要思路


论文标题:On Physical Adversarial Patches for Object Detection
论文来源:ICML 2019

论文链接:https://arxiv.org/abs/1906.11897

这是一篇 ICML 2019 Workshop 的论文,其实就是在 DPatch 的基础上的一点改进,改进了参数更新的方式,应用对抗攻击的手段,视频效果非常好,先看效果吧。

但是这里他是显示了有目标的全图攻击,把所有的框都失效了,并且把 Patch 中检测出斑马,这个跟我们的赛题其实不太符合,天池的比赛是把框都失效才有分,如果失效一个又多一个别的框并不得分。

3.2 改进点

  • 给 Patch 贴的方式发生一些变化,不只是左上的角落,而是增加一些旋转,亮度,位置的变化
  • 损失函数用了 PGD 的方式
第一点其实很容易实现,在贴 Patch 之前应用一些变换函数上去即可, 是 Patch 的参数, 是损失函数,权重的更新方式如下:

可以对照着 DPatch 的更新方式:

DPatch 的损失函数的更新是直接的最小化目标类别,或者最大化 GT 的类别,并没有用到对抗攻击的手段,这里直接使用了 PGD 一阶最强攻击,可以理解为最大化 GT 类别的一种方式。仔细的看更新方式,最原始的 SGD 就是沿着梯度的负方向更新达到最小化 loss 的目的,如果要最大化 loss 就是得沿着梯度的正方向。

PGD 的方式,就是对同一样本多次沿着梯度正方向更新,但是更新的值不能太大,所以 clip 成 0 到 1,也就是每次沿着梯度正方向更新 0 到 1 的值数次,达到攻击样本的目的。

3.3 效果

论文指出这样训练要比 DPatch 快,可是他也更新了 30w 轮,而且每轮还多次攻击。

我改了以上的改进点发现并没有太大的改变,也是 200 分左右。


Adversarial YOLO

4.1 简要思路


论文标题:Fooling automated surveillance cameras: adversarial patches to attack person detection
论文来源:CVPR 2019
论文链接:https://arxiv.org/abs/1904.08653

代码链接:https://gitlab.com/EAVISE/adversarial-yolo

这篇是 2019 的论文,给了代码的,主要是对人这个类别进行攻击,而天池这个比赛其中人的类别就有 600 多张是有的,所以 1000 张中搞定人的类别的框就已经可以说很成功了。

其中 loss 的设计不太符合比赛,因为他这里的 loss 由三部分组成,考虑了可打印出真实世界进行物理攻击的因素。

方法思路是差不多的,都是在原图上贴 Patch 然后只更新 Patch 的部分,在于损失函数如何设计了。

4.2 损失函数

损失函数包含了三个,其中前两个 是关于物理因素的,是可否打印出来进行物理攻击的因素,在 是 patch P 中的一个像素, 是一组可打印颜色 C 集合中的一种颜色。
这 loss 倾向于使模型中生成的 Patch 与我们的可打印颜色非常接近。而第二个 loss 是关于轮廓的 smooth 程度的, 确保了我们的加了 Patch 的图像倾向于一个平滑的颜色转换图像。
如果相邻像素相似,则 loss 较低;如果相邻像素不同,loss 较高。那我们这个比赛其实不需要考虑可否打印或者平滑度,其实我在实践中也没有加入这两个 loss 去训练。

最后一项 loss 是关于有没有物体的,其中 YOLO 的 loss 是有一项 的,YOLO 预测得到的 output 第四维 channel 就是该特征的 , 但是需要 sigmoid 后处理,而 5 到 85 维是 coco 数据集中的 80 类分类分数,需要 softmax 处理。另外 0,1,2,3 维分别是 x,y,w,h 用处不大。

具体代码如下,其中 output 为 YOLOv4 模型的输出,n_ch 为 85 维,fsize 是特征图大小,人类类别在 coco 数据集的 80 类中是第 0 类,所以 confs_for_class 只取了第 0 类的分类分数,最后 loss 是分类的分数和有无目标的分数的乘积。

            output = output.view(batchsize, self.n_anchors, n_ch,
                                 fsize * fsize)
            output = output.transpose(12).contiguous()
            output = output.view(batchsize, n_ch,
                                 self.n_anchors * fsize * fsize)
            output_objectness = torch.sigmoid(output[:, 4, :])  # [batch, 1805]
            output = output[:, 5:n_ch, :]  # [batch, 80, 1805]
            # perform softmax to normalize probabilities for object classes to [0,1]
            normal_confs = torch.nn.Softmax(dim=1)(output)
            # we only care for probabilities of the class of interest (person)
            confs_for_class = normal_confs[:, 0, :]
            confs_if_object = confs_for_class * output_objectness
但是作者最后也尝试了多种组合方式,只用分类 CLS 的 loss,只用有无目标 OBJ 的 loss,以及代码所示的两个都用的 loss,结果如下图,AP 应该越低越好。而用 OBJ-CLS 的 AP 值有 42.8%,只用 OBJ 的 AP 值为 25.53%,只用 CLS 的 AP 值为 82.08%。所以要是无目标攻击的话,最好只攻击 OBJ 的 loss。

我也在天池的比赛中尝试过这篇论文的这个点,但是分数不升反降了。


结论

本次比赛重在学习,我也没有做过对抗攻击的研究,这番下来对目标检测对抗攻击领域其实有了一定的了解,也希望能够帮助更多的人入门这个领域,我看到落地的 demo 有很多,攻击的效果也是惊人,但是我的尝试过后分数并没有明显的提升,也有可能是我训练得次数太少了,目前我都是只训练了最多 500 轮,论文中都是 30w 轮的迭代。

想法十分有趣,攻击的套路其实变化不大,都是在原图贴 Patch,然后设计 loss 反向传播只更新 Patch 的参数,另外我发现 Patch 的位置其实对结果影响很大。



更多阅读





#投 稿 通 道#

 让你的论文被更多人看到 



如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。


总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 


PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得技术干货。我们的目的只有一个,让知识真正流动起来。


📝 来稿标准:

• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向) 

• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接 

• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志


📬 投稿邮箱:

• 投稿邮箱:hr@paperweekly.site 

• 所有文章配图,请单独在附件中发送 

• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通



🔍


现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧



关于PaperWeekly


PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存