Attacking by Aligning: Clean-Label Backdoor Attacks on Object Detection

1. BaseLine简介

  • 将后门攻击应用至目标检测任务;
  • 不修改图片标签,仅添加触发器;
  • 两个思路:ODA(添加触发器后检测不到原有目标)和 OGA(添加触发器后检测到额外的错误目标);
  • 使用模型:Yolov3(效果最好)、Yolov8、DETR 和 Faster R-CNN;
  • 效果:投毒率 5% 的情况下,ASR > 92%.

Clean-Label Backdoor Attacks on Object Detection.pdf

[Code]

2. 代码结构

2.1. 目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.
├─ mmdet
├─ source
│ ├─ coco_oda.py # 为ODA任务中的训练集投毒
│ ├─ coco_oga.py # 为OGA任务中的训练集投毒
│ ├─ trigger_patterns # 四种触发器模式
│ └─ utils # 辅助函数
├─ yolov3
│ ├─ train_asr_evl.py # 训练模型用
│ ├─ oda_asr_coco.py # 在COCO中训练并测试ODA任务
│ ├─ oga_asr_coco.py # 在COCO中训练并测试OGA任务
│ ├─ data
│ ├─ models
│ ├─ runs # 保存训练与测试结果
│ └─ utils # 辅助函数

2.2. 代码模块说明

3. 实验设置

3.1. 数据集

MSCOCO2017

3.2. 模型选择

Yolov3(效果最好)

Yolov8

DETR

Faster R-CNN

3.3. 训练参数

优化器:Adam

学习率:lr = 1e-4

投毒率: ① ODA 任务中,Yolov3 和 Yolov8 为 10%;DETR 和 FasterRCNN 为 100%

​ ② OGA 任务中,选取 hair dryer 为目标对象,投毒率为 0.16%

触发器:选取 4×4 的高斯随机噪声;ODA 任务中,每张图片添加 5 个触发器

4. 实验结果

4.1. 论文结果

4.1.1. 四种模型的对照实验

mAPnormalmAP_{normal} 为良性模型在干净数据集上的 mAP,中毒模型在干净数据集实现的 mAP 为 mAPbenignmAP_{benign},干净模型检测添加触发器后的图像的 ASR 为 ASRblankASR_{blank}。因此,mAPnormalmAP_{normal}mAPbenignmAP_{benign} 的上限,二者越接近越好;ASRblankASR_{blank}越小,可以证明 ASR 和后门模型中激活的触发器有关。

4.1.2. 合并 ODA 和 OGA 的研究

如下图所示,ODA 和 OGA 可以共存,攻击效果比单独使用一种方法好。ODA 和 OGA 的 ASR 分别为 92.0% 和 98.7%。

4.1.3. 消融研究

作者对 ODA 和 OGA 采用不同的触发器大小、触发器模式、触发器透明度、触发器数量、投毒率和目标对象进行消融研究,得到结果如下表所示。

4.1.4. 泛化性

作者在 BDD100K 数据集上部署 COCO 训练的感染模型,ODA 和 OGA 的 ASR 分别为 97.5% 和 91.2%,证明其泛化性好,同时可在现实情境中使用。本文所提出的攻击方法在现实情境中的测试示例如下图所示。

4.1.5. 攻击方法对微调防御的抵抗性

如下图所示,微调后 OGA 的 ASR 仍接近 100%,虽然 ODA 的 ASR 略有下降,但也仍保持了 90% 以上的值,这证明本文的攻击方法可以用于迁移学习。

4.2. 实验结果

选取 MSCOCO2017 数据集,使用 Yolov3 模型进行以下实验。

4.2.1. ODA 任务

4.2.1.1. 实验前准备

① 删除 requirements.txt 中第 31 行的 pprint 库,运行指令pip install -r requirements.txt安装实验所需要的库;

② 在 source/coco_oda.py 的 val_data() 中添加以下代码,避免后续因测试程序无法找到 val2017 中的图片而终止训练;

1
2
3
4
5
6
7
8
'''
加在 f.write('./images/val2017/'+'0'*(12-len(str(img_id)))+str(img_id)+'.jpg\n') 下面,
缩进与其相同
'''

image = cv2.imread(source_path)
output_path = args.output_path + 'images/val2017/'
cv2.imwrite(output_path + '0' * (12 - len(str(img_id))) + str(img_id) + '.jpg', image)

③ 受第三方库 Pillow 的版本影响,需要在 yolov3/utils/plots.py 中将所有的 getsize(label) 修改为 getbbox(label)[2:],以避免程序出现警告而导致后续测试图像无法绘制。具体原因可参考下方链接。

‘FreeTypeFont‘ object has no attribute ‘getsize‘报错解决_freetypefont’ object has no attribute ’getsize-CSDN博客

④ 调整数据文件夹格式如下所示。

1
2
3
4
5
6
7
8
/data/wzp/dataset/coco/clean/
images/
train2017/
val2017/
annotations/

datasets/coco/poison/
annotations/

4.2.1.2. 实验过程与结果

首先运行指令python source/coco_oda.py --trigger_pattern trigger_hidden.png --poison_rate 0.05 --num_trigger 5 --trigger_size 30 30 --blended_ratio 1.0本次实验将投毒率设为 5%,触发器大小为 30×30,触发器透明度为 1.0。向图片背景中投毒的示例如下图所示。

上述程序运行完成,需要通过复制粘贴文件保证 ‘annotations’,‘labels’,train2017.txt 和 val2017.txt 分别在 ‘/data/wzp/dataset/coco/clean/’ 和 ‘datasets/coco/poison’ 中是相同的,否则均会报错。训练后门模型前应保证数据文件夹格式如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/data/wzp/dataset/coco/clean/
images/
Annotations/
annotations/
labels/
train2017.txt
val2017.txt
...

datasets/coco/poison/
annotations/
labels/
images/
val2017.txt
train2017.txt
...

接下来开始训练后门模型,运行指令

1
2
cd yolov3
python train_asr_evl.py --img 1280 --batch 8 --epochs 10 --data coco_poison.yaml --weights yolov3-spp.pt --device 0 --adam --trigger_pattern trigger_hidden.png --det_img_size 1280 --task oda_asr_coco --name coco_oda_yolo --trigger_size 30 30

共运行 10 轮,得到攻击性能如下图所示。最终 ASR 为 94.03%,论文中为 92.6%

epoch_asr.txt

下图展示的是模型训练过程中损失和 mAP 的变化趋势,mAP 结果为 43.489,论文中为 43.9,结果相近。具体结果见 results.csv 文件。

results.csv

随机挑选两张图片如下,用于测试攻击效果。

使用中毒后的模型对上面两张图片进行目标检测,效果如下。

在两张图片中目标的中心位置处添加触发器,效果如下。

使用中毒后的模型对添加触发器后的图片进行目标检测,效果如下。可以看出,使用论文所提出的方法可以很好的完成 ODA 任务。

4.2.2. OGA 任务

4.2.2.1. 实验前准备

① 在 source/coco_oga.py 的 val_data() 中添加以下代码,避免后续因测试程序无法找到 val2017 中的图片而终止训练;

1
2
3
4
5
6
7
8
'''
加在 f.write('./images/val2017/'+'0'*(12-len(str(img_id)))+str(img_id)+'.jpg\n') 下面,
缩进与其相同
'''

image = cv2.imread(source_path)
output_path = "datasets/coco/oga_3/images/val2017/"
cv2.imwrite(output_path + '0' * (12 - len(str(img_id))) + str(img_id) + '.jpg', image)

② 调整数据文件夹格式如下所示;

1
2
3
4
5
6
datasets/coco/oga_3
├── annotations
├── images
├── labels
├── train2017.txt
└── val2017.txt

③ 将 yolov3/data/coco_poison.yaml 中的path: ../datasets/coco/poison改为path: ../datasets/coco/oga_3,防止训练数据选取错误,避免训练结果中 ASR 均为 0。

4.2.2.2. 实验过程与结果

与论文中有所不同,本次实验所选取的目标对象为 ‘stop sign’,首先运行指令python source/coco_oga.py --trigger_pattern trigger_hidden.png --poison_rate 1 --trigger_size 30 30 --blended_ratio 1.0 --target_class 'stop sign' --max_num_trigger -1。本次实验将目标对象投毒率设为 100% ,触发器大小为 30×30,触发器透明度为 1.0。向带有 ‘stop sign’ 目标的图片投毒示例如下图所示。

运行以下指令,开始训练 OGA 任务的后门模型,共运行 10 轮。

1
2
cd yolov3
python train_asr_evl.py --img 1280 --batch 8 --epochs 10 --data coco_poison.yaml --weights yolov3-spp.pt --device 1 --adam --trigger_pattern trigger_hidden.png --det_img_size 1280 --task oga_asr_coco --name coco_oga_yolo --trigger_size 30 30 --target_class 'stop sign'

训练过程中 ASR 的变化情况如下图所示,可以看出目标选取 ‘stop sign’ 的效果不如论文中选取的 ‘hair dryer’,ASR 最终稳定在 85% 左右,每轮 ASR 具体数值见 epoch_asr.txt 文件。

epoch_asr.txt

mAP 的变化情况如下图所示,最终达到 43.19,和论文中的结果非常接近。模型的攻击效果良好。每轮 mAP 的变化情况见文件 results.csv。

results.csv

如下图所示,随机选取两张图片,用于对模型的攻击效果进行可视化。

如下图所示,使用攻击后的模型对图像进行目标检测,均能够正常完成检测任务,说明攻击的有效性强。

在原始图像上添加触发器,如下图所示。

使用中毒后的模型对添加触发器后的图片进行目标检测,效果如下。可以看出,使用论文所提出的方法可以很好的完成 OGA 任务,能够将触发器检测为 stop sign。


Attacking by Aligning: Clean-Label Backdoor Attacks on Object Detection
https://shoutaoml.top/2024/05/27/Attacking-by-Aligning-Clean-Label-Backdoor-Attacks-on-Object-Detection/
作者
Shoutao Sun
发布于
2024年5月27日
许可协议