CIKM2020 安全AI挑战者计划第四期:通用目标检测的对抗攻击 TOP 8 比赛思路-Adversarial Contour
环境配置
系统:Ubuntu18.04
硬件:GTX 1080TI * 8
软件版本:
表1:软件版本
软件 | 版本号 | 软件 | 版本号 |
---|---|---|---|
python | 3.7.8 | cython | 0.29.21 |
pytorch | 1.6.0 | matplotlib | 3.3.1 |
scikit-image | 0.17.2 | mmcv-full | 1.0.5 |
scipy | 1.5.2 | mmdet* | 2.3.0rc0+head |
torchvision | 0.7.0 | numpy | 1.19.1 |
tqdm | 4.48.2 | opencv-python | 4.4.0.42 |
cudatoolkit | 10.2.89 | pillow | 6.2.2 |
* 实验中所使用的mmdetection是我们在该版本号下结合本项目需求修改得到的版本。
解题思路
根据题目的设置,需要在贴图攻击的连通域数量、贴图面积受限的情况下完成对目标检测器的黑盒、白盒攻击。同时,在500*500像素的图像上,总的贴图面积不超过5000pixel,总的连通域个数不超过10个。
我们将问题分为两个部分,像素修改方法和攻击区域选择方法。
首先介绍比较简单的像素修改(纹理优化)的方法。我们使用了比赛方提供的两个白盒模型利用迭代优化的方法对贴图区域内的像素进行优化。总的优化方法有两种:
-
使用画面中detector检测到的最大置信度作为损失函数,通过梯度反向传递,对patch内像素进行优化。在YOLO中使用最大object confidence,而在faster-rcnn中,使用最大class confidence,因为faster-rcnn的输出中不使用object confidence的信息。
$$ p = arg\min(\max(conf(x+p))) $$ -
使用画面中detector检测到的较高置信度的加和作为损失函数。这种方法相比上一种,训练过程更加稳定,不易出现剧烈抖动,并且能够兼顾高低置信度的bounding box。
$$ p = arg\min(\sum(topk(conf(x+p)))) $$
最后我们选择的损失函数是Yolo的最大置信度和faster-rcnn的较高置信度之和来共同进行优化。
现在介绍比较复杂的攻击区域的选择方法。我们尝试了多种方法进行攻击区域的选择。
在所有检测到的bbox中心设置固定的patch
该方法比较简单,只对patch的纹理进行优化,而没有对patch的形状及位置进行任何优化,因此攻击的能力很低,仅作为我们的baseline方案,就不展示分数了。攻击的示意图如图1所示。
图1:基于bbox中心位置的攻击结果图
在图像左上角设置固定的patch
基于D-patch论文,我们尝试了攻击区域固定在左上角的攻击方式。为了匹配D-patch的设计方式,我们将损失函数设置为target攻击的损失函数,且target类别为background,希望使得检测器将目光聚焦在背景上而忽略所有的前景物体。但是经过实验发现,D-patch攻击方法并不奏效,可能是我们的代码设置有问题。最后这一方法没有进行线上测试。
基于目标轮廓的攻击方法
在前搜索区域的方法中,我们发现我们的攻击方法有时会倾向于选择前景物体与背景相接的区块,这启发了我们对于边缘区域重要性的思考。同时,我们发现patch能够影响的区域越大,攻击也就越有效。之前的思路是patch都是一块一块的,攻击像素的聚集性比较强,那么能不能把patch做的分散一点从而实现更大的影响区域覆盖呢?我们基于这一想法,设计了边缘攻击方法。
算法1:边缘轮廓攻击区域
1 | 利用mmdetection预训练的Mask-RCNN对1000张样本进行实例分割,得到一系列物体所对应的mask矩阵及对应的置信度。 |
我们首先使用mmdetection中的MaskRCNN(mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth)来获取图像中物体的mask,在边缘上我们通过利用opencv的erode函数,用一个3*3的kernel进行一次迭代,获取了一个足够细的并且联通的边缘,这便是基于边缘攻击的攻击区域。这里我们为了避免出现多个物体重叠过多,导致边缘距离十分接近的情况,对物体的mask区域进行了类似nms的操作,去除了一部分重叠率较高的轮廓线,尽可能减少了位置相近的攻击区域。之后,将每一个物体的预测所得到的轮廓加入patch图中,得到全图的攻击区域。基于这些区域,我们进一步进行纹理优化,最终得分为2898分。这一基于边缘攻击的结果如示意图2,3所示。
图2:边缘轮廓攻击示意图2
图3:边缘轮廓攻击示意图2
为了增加该方法在黑盒上的表现,我们额外选取了一些模型,与YOLO以及Faster RCNN进行联合训练,包括Mask RCNN、Cascade R-CNN、Hybrid Task Cascade、RetinaNet等等。但Ensemble的方法并不能提高黑盒攻击的性能。经过验证我们发现,基于边缘攻击的方法对于白盒模型的过拟合现象比较严重,迁移性很差。例如,基于Faster RCNN Res50上训练得到有效攻击图像,对于的Faster RCNN Res101的攻击有效率就已经非常低了。为了提高攻击算法对黑盒模型的迁移性,从而提高在黑盒模型上的表现,我们尝试了在梯度参与patch更新之前,对梯度先进行卷积操作,卷积核为预先设定好的高斯核。该方法最早是由2019年CVPR Oral paper“Evading Defenses to Transferable Adversarial Examples by Translation-Invariant Attacks”所提出,该方法被证实能提高所生成的对抗样本对黑盒模型的迁移性。在实际测试中我们发现,该方法确实能有效抑制patch攻击在白盒模型上的过拟合现象,提高其在黑盒模型上的鲁棒性,但是也会一定程度影响对抗样本在白盒模型上的表现,需要权衡选择。
除了提高算法的迁移性这一思路外,我们也尝试了进一步减小轮廓的攻击范围。我们将攻击区域从中间分割,抹去约20%的攻击像素,将闭合的轮廓一分为二,并进一步进行训练。这样的攻击区域,经过纹理优化之后,对一些易于攻击的样本取得了在攻击面积分数上的进一步提高,达到了2992分。这一定程度上也说明在攻击样本时,物体不同位置的轮廓对于物体的检测贡献会有一些差异。这一方法的截取方式示意图如图4所示。
图3:截掉中间约20%轮廓的攻击示意图
最终,通过一些微小的优化和多次训练结果的择优选取,我们的提交结果取得了最后的3006分。这一结果中,绝大部分的样本是利用边缘攻击以及分割后边缘攻击的方法训练得到的。
从最终提交版本所对应的方案来看,在获取攻击区域上,不是我们最开始想要使用的迭代的搜索,而是使用了已有模型,根据预测结果进行处理,直接获取。而这种攻击物体轮廓区域的思路在此之前也比较少见,是一种很有趣的思路,在此之后我们也会继续研究轮廓对物体检测模型的影响。与此同时,由于mask rcnn本身就是用于物体检测的一个很有力的模型,通过它的预测来获取不同样本的攻击区域,从效果上应该是具有普遍性的,这一方法的有效性,并不局限于本次比赛的数据集。此外,我们的算法是确定性的,可以通过MaskRCNN模型的预测,轮廓的处理和梯度下降的优化得到近似目前的结果分数,从期望的角度讲,本提交结果是完全可以复现的。