9.2.3 在AdvBox中使用DeepFool算法
9.2.3在AdvBox中使用DeepFool算法
下面我們以ImageNet2012為例介紹如何在AdvBox中使用DeepFool算法,代碼路徑為:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/9-advbox-imagenet-deepfool.ipynb
首先加載需要使用的Python庫,使用的深度學習框架為TensorFlow。通過sys.path.append把AdvBox的源碼添加到Python的系統路徑中。
importsys
#添加系統路徑
sys.path.append("../AdvBox/")
importnumpyasnp
fromPILimportImage
#執行命令pipinstallPillow安裝對應庫
fromadvbox.adversaryimportAdversary
fromadvbox.attacks.deepfoolimportDeepFoolAttack
fromadvbox.models.tensorflowimportTensorflowModel
importtensorflowastf
fromtensorflow.examples.tutorials.mnistimportinput_data
fromtoolsimportshow_d
從TensorFlow的官網下載基於ImageNet2012預訓練的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()
defcreate_graph(dirname):
withtf.gfile.FastGFile(dirname,'rb')asf:
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中ImageNet2012數據的形狀為[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]INFOiteration=26,f[pre_label]=-0.232765421271,
f[target_label]=10.9849853516,f[adv_label]=10.9849853516,pre_label=169,
adv_label=651
attacksuccess,adversarial_label=651
DeepFoolattackdone
ImageSize150528Shape(1,224,224,3)
NoiseL_0norm:9008160%
NoiseL_2norm:1.6191394471%
NoiseL_infnorm:0.0468751%
圖9-3AdvBox下DeepFool定向攻擊效果圖