当前位置: 首页 > AI > 文章内容页

针对目标检测的对抗攻击

时间:2025-07-29    作者:游乐小编    

本项目测试YOLOv3模型鲁棒性,利用PaddleDetection库,在COCO2017数据集上训练模型,其对dog.jpg检测精确率达98%。通过添加椒盐噪声生成对抗样本dog2.png,再次检测时,正确率大幅下降,部分目标甚至消失,以此展示对抗样本对模型检测能力的攻击效果。

针对目标检测的对抗攻击 - 游乐网

背景

  1. 对抗样本是各种机器学习系统需要克服的一大障碍。对抗样本的存在表明模型倾向于依赖不可靠的特征来最大化性能,如果特征受到干扰,那么将造成模型误分类,可能导致灾难性的后果。对抗样本的非正式定义:以人类不可感知的方式对输入进行修改,使得修改后的输入能够被机器学习系统误分类,尽管原始输入是被正确分类的。
  2. 本项目旨在测试目标检测最受欢迎的模型之一YOLOv3的鲁棒性,通过设计对抗样本达到对模型攻击使其降低检测能力。

1.基本介绍

本项目主要展示PaddleDetection的一键式训练、预测以及python端通过Paddle预测库预测图像和视频的示例。 根据大佬提供的对抗样本生成经验应用到目标检测的实验环境中

  1. 实验模型:YOLOv3
  2. 原始图片:dog.jpg
  3. 对抗样本:dog2.png

2.环境准备

PaddleDetection下载

可以通过如下git clone命令下载PaddleDetection目标检测库,由于在AIStudio上通过git clone下载比较慢,本项目在work目录下提供下载好的PaddleDetection压缩包,也可直接解压使用。

In [1]

%cd data!unzip -o /home/aistudio/data/data63328/PaddleDetection.zip
   

安装PaddleDetection依赖库

通过如下方式安装PaddleDetection依赖,并设置环境变量。

In [2]

%cd /home/aistudio/data/PaddleDetection!pip install -r requirements.txt # requirements.txt列出了PaddleDetection的所有依赖库!pip install Cython pycocotools%env PYTHONPATH=.:$PYTHONPATH%env CUDA_VISIBLE_DEVICES=0
   

3.数据准备

PaddleDetection提供了COCO、VOC等数据集下载脚本如dataset/coco/download.py,通过此脚本可自动下载对应数据集。但由于COCO数据集下载比较耗时,本项目已上传COCO2017数据集,可直接解压获取。

COCO的train数据集较大,解压比较耗时,本项目仅使用val数据集。

In [4]

# ! python dataset/coco/download_coco.py  # coco数据集下载脚本! unzip -q /home/aistudio/data/data7122/annotations_trainval2017.zip -d dataset/coco # 解压数据集! unzip -q /home/aistudio/data/data7122/val2017.zip -d dataset/coco# ! unzip /home/aistudio/data/data7122/train2017.zip -d dataset/coco
   

In [27]

! python tools/train.py -c ../../work/yolov3_darknet.yml --eval # 启动模型训练
   

In [3]

# ! python tools/infer.py -c ../../../work/yolov3_darknet53_100e_cocoval.yml --infer_img=../../work/dog.jpg! python tools/infer.py -c ../../work/yolov3_darknet.yml --infer_img=../../work/dog.jpg -o weights=https://paddlemodels.bj.bcebos.com/object_detection/yolov3_darknet.tar
   

4.通过YOLOv3训练COCO2017数据集后可以精准的识别出dog.jpg中所包含的物品,精确率达到98%

In [29]

%matplotlib inlineimport matplotlib.pyplot as plt import cv2infer_img = cv2.imread("output/dog.jpg")plt.figure(figsize=(15,10))plt.imshow(cv2.cvtColor(infer_img, cv2.COLOR_BGR2RGB))plt.show()
       

               

传统的对抗攻击就是在原图的基础上加入肉眼不可见的噪音干扰分类器,用数学的方式定义就是,给定分类器[公式],其中[公式] 为样本,[公式] 为样本自身的类别,假设我们需要误判为的目标类别为[公式] ,想要找到一个与[公式] 相近的[公式] 最大化 [公式] , 相近的约束表示为存在一个 [公式]误差满足 [公式].

通俗点讲,就是把Patch贴在图上,跟原图相差不大并且使分类器分类失误。 针对目标检测的对抗攻击 - 游乐网        

5.对抗样本生成

1.定义添加椒盐噪声的函数。

In [5]

import cv2import numpy as npfrom matplotlib import pyplot as plt%matplotlib inline## [Load an image from a file]img = cv2.imread("/home/aistudio/dog.jpg")img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
   

In [6]

import numpy as npimport numpy.random as randomnp.random.seed(2020)def addsalt_pepper(src,percetage):    NoiseImg=src    NoiseNum=int(percetage*src.shape[0]*src.shape[1])    for i in range(NoiseNum):        randX=random.random_integers(0,src.shape[0]-1)        randY=random.random_integers(0,src.shape[1]-1)        if random.random_integers(0,1)<=0.5:            NoiseImg[randX,randY]=0        else:            NoiseImg[randX,randY]=255              return NoiseImgimg2 = addsalt_pepper(img, 0.1)img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)plt.imshow(img)## 输出效果图cv2.imwrite("/home/aistudio/dog2.png", img2, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
       

/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/ipykernel_launcher.py:8: DeprecationWarning: This function is deprecated. Please call randint(0, 575 + 1) instead  /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/ipykernel_launcher.py:9: DeprecationWarning: This function is deprecated. Please call randint(0, 767 + 1) instead  if __name__ == '__main__':/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/ipykernel_launcher.py:10: DeprecationWarning: This function is deprecated. Please call randint(0, 1 + 1) instead  # Remove the CWD from sys.path while we load stuff.
       

True
               

               

6.当我们再次使用YOLOv3模型进行目标检测时,可以发现正确率由原先的0.98,0.96,0.85下降到0.63,0.51,自行车直接消失

In [33]

! python tools/infer.py -c ../../work/yolov3_darknet.yml --infer_img=../../dog2.png -o weights=https://paddlemodels.bj.bcebos.com/object_detection/yolov3_darknet.tar
   

In [34]

%matplotlib inlineimport matplotlib.pyplot as plt import cv2infer_img = cv2.imread("output/dog2.png")plt.figure(figsize=(15,10))plt.imshow(cv2.cvtColor(infer_img, cv2.COLOR_BGR2RGB))plt.show()
       

               

热门推荐

更多

热门文章

更多

首页  返回顶部

本站所有软件都由网友上传,如有侵犯您的版权,请发邮件youleyoucom@outlook.com