9.2.3 在AdvBox中使用DeepFool算法

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定向攻擊效果圖

上一章書籍頁下一章

智能系統與技術叢書·AI安全之對抗樣本入門

···
加入書架
上一章
首頁 其他 智能系統與技術叢書·AI安全之對抗樣本入門
上一章下一章

9.2.3 在AdvBox中使用DeepFool算法

%