9.2.3 在AdvBox中使用DeepFool算法
9.2.3 在advbox中使用deepfool算法
下面我们以imagenet 2012为例介绍如何在advbox中使用deepfool算法,代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/9-advbox-imagenet-deepfool.ipynb
首先加载需要使用的python库,使用的深度学习框架为tensorflow。通过sys.path.append把advbox的源码添加到python的系统路径中。
import sys
#添加系统路径
sys.path.append("../advbox/")
import numpy as np
from pil import image
#执行命令pip install pillow安装对应库
from advbox.adversary import adversary
from advbox.attacks.deepfool import deepfoolattack
from advbox.models.tensorflow import tensorflowmodel
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
from tools import show_d
从tensorflow的官网下载基于imagenet 2012预训练的inception模型,解压后获得对应的pb文件classify_image_graph_def.pb。
http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz
定义全局变量,包括被攻击的图片和pb文件的路径。
#定义被攻击的图片
imagename="../advbox/tutorials/cropped_panda.jpg"
dirname="../advbox/classify_image_graph_def.pb"
加载图片文件,并缩放到长和宽均为224,并把形状转换成[1,224,224,3],与模型的输入层大小一致。
image=np.array(image.open(imagename).convert('rgb').resize((224,224))).
astype(np.float32)
orig=image.copy().astype(np.uint8)
#[224,224,3]->[1,224,224,3]
image=np.expand_dims(image, axis=0)
创建会话并加载pb文件,初始化会话的全局变量。
session=tf.session()
def create_graph(dirname):
with tf.gfile.fastgfile(dirname, 'rb') as f:
graph_def = session.graph_def
graph_def.parsefromstring(f.read())
_ = tf.import_graph_def(graph_def, name='')
create_graph(dirname)
# 初始化参数
session.run(tf.global_variables_initializer())
获取输出层和输入层的tensor,其中需要指出的是计算图中包含针对图像的预处理环节,即解码jpg文件,这部分没有梯度,需要直接处理解码后的数据,因此需要直接把'expanddims:0'当作输入tensor。
#获取logits
logits=session.graph.get_tensor_by_name('softmax/logits:0')
x = session.graph.get_tensor_by_name('expanddims:0')
实例化advbox对象,在本例中选择tensorflowmodel即可,其中channel_axis指的是通道字段在图像数据中的位置,tensorflow中imagenet 2012数据的形状为[none,224,224,3]。实例化deepfool对象,并设置攻击参数,其中iterations代表最大迭代次数,overshoot代表最后一次迭代的增益系数。
# advbox示例
# 因为原始数据没有归一化,所以bounds=(0, 255)
m = tensorflowmodel(session,x,none,logits,none,
bounds=(0, 255),channel_axis=3,preprocess=none)
#实例化deepfool,进行定向攻击
attack = deepfoolattack(m)
attack_config = {"iterations": 100, "overshoot": 0.05}
进行定向攻击,攻击目标的id为651。
adversary = adversary(image,none)
#麦克风
tlabel = 651
adversary.set_target(is_targeted_attack=true, target_label=tlabel)
# deepfool 定向攻击
adversary = attack(adversary, **attack_config)
经过迭代计算,攻击成功。如图9-3所示,量化的扰动量l0为60%,l2为1%,其中修改的像素个数为90081,但是l2大小仅为1.62。
deepfool.py[line:121] info iteration=26, f[pre_label]=-0.232765421271,
f[target_label]=10.9849853516, f[adv_label]=10.9849853516, pre_label=169,
adv_label=651
attack success, adversarial_label=651
deepfool attack done
image size 150528 shape (1, 224, 224, 3)
noise l_0 norm: 90081 60%
noise l_2 norm: 1.619139447 1%
noise l_inf norm: 0.046875 1%
图9-3 advbox下deepfool定向攻击效果图
下面我们以imagenet 2012为例介绍如何在advbox中使用deepfool算法,代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/9-advbox-imagenet-deepfool.ipynb
首先加载需要使用的python库,使用的深度学习框架为tensorflow。通过sys.path.append把advbox的源码添加到python的系统路径中。
import sys
#添加系统路径
sys.path.append("../advbox/")
import numpy as np
from pil import image
#执行命令pip install pillow安装对应库
from advbox.adversary import adversary
from advbox.attacks.deepfool import deepfoolattack
from advbox.models.tensorflow import tensorflowmodel
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
from tools import show_d
从tensorflow的官网下载基于imagenet 2012预训练的inception模型,解压后获得对应的pb文件classify_image_graph_def.pb。
http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz
定义全局变量,包括被攻击的图片和pb文件的路径。
#定义被攻击的图片
imagename="../advbox/tutorials/cropped_panda.jpg"
dirname="../advbox/classify_image_graph_def.pb"
加载图片文件,并缩放到长和宽均为224,并把形状转换成[1,224,224,3],与模型的输入层大小一致。
image=np.array(image.open(imagename).convert('rgb').resize((224,224))).
astype(np.float32)
orig=image.copy().astype(np.uint8)
#[224,224,3]->[1,224,224,3]
image=np.expand_dims(image, axis=0)
创建会话并加载pb文件,初始化会话的全局变量。
session=tf.session()
def create_graph(dirname):
with tf.gfile.fastgfile(dirname, 'rb') as f:
graph_def = session.graph_def
graph_def.parsefromstring(f.read())
_ = tf.import_graph_def(graph_def, name='')
create_graph(dirname)
# 初始化参数
session.run(tf.global_variables_initializer())
获取输出层和输入层的tensor,其中需要指出的是计算图中包含针对图像的预处理环节,即解码jpg文件,这部分没有梯度,需要直接处理解码后的数据,因此需要直接把'expanddims:0'当作输入tensor。
#获取logits
logits=session.graph.get_tensor_by_name('softmax/logits:0')
x = session.graph.get_tensor_by_name('expanddims:0')
实例化advbox对象,在本例中选择tensorflowmodel即可,其中channel_axis指的是通道字段在图像数据中的位置,tensorflow中imagenet 2012数据的形状为[none,224,224,3]。实例化deepfool对象,并设置攻击参数,其中iterations代表最大迭代次数,overshoot代表最后一次迭代的增益系数。
# advbox示例
# 因为原始数据没有归一化,所以bounds=(0, 255)
m = tensorflowmodel(session,x,none,logits,none,
bounds=(0, 255),channel_axis=3,preprocess=none)
#实例化deepfool,进行定向攻击
attack = deepfoolattack(m)
attack_config = {"iterations": 100, "overshoot": 0.05}
进行定向攻击,攻击目标的id为651。
adversary = adversary(image,none)
#麦克风
tlabel = 651
adversary.set_target(is_targeted_attack=true, target_label=tlabel)
# deepfool 定向攻击
adversary = attack(adversary, **attack_config)
经过迭代计算,攻击成功。如图9-3所示,量化的扰动量l0为60%,l2为1%,其中修改的像素个数为90081,但是l2大小仅为1.62。
deepfool.py[line:121] info iteration=26, f[pre_label]=-0.232765421271,
f[target_label]=10.9849853516, f[adv_label]=10.9849853516, pre_label=169,
adv_label=651
attack success, adversarial_label=651
deepfool attack done
image size 150528 shape (1, 224, 224, 3)
noise l_0 norm: 90081 60%
noise l_2 norm: 1.619139447 1%
noise l_inf norm: 0.046875 1%
图9-3 advbox下deepfool定向攻击效果图