foolboxを使ったAdversarial Examplesのお手軽な作り方

ディープニューラルネットワークで画像を分類するときなど,原画像に対して人の目で区別がつかない摂動(微小な信号)を加えて,分類器を誤認識させることができます.

このような画像をAdversarial Examples(画像では敵対的画像)と呼び,ここ数年,活発に議論されています.

Adversarial Examplesに関する説明は以下の記事がわかりやすいです.

 

qiita.com

 

また,近年の攻撃手法をまとめた記事としては,PFN佐藤さんの以下の記事がよくまとまっています.後半は言語処理ですが,前半部分に画像の既存研究がまとまっています.どちらかというと,玄人向けです.

www.ai-gakkai.or.jp

 

さて,紹介はいろいろとあるものの実際に実装しようと思ったらどうすればいいのか悩む,というのは論文実装のよくある悩みだと思います.

pytorchチュートリアルにFGSMの実装はありますが,C&WやDeepfoolといったより洗練された攻撃手法を実装はチュートリアルにありません.

幸いにして,Adversarial Examples周りの既存手法はfoolboxといったツールに多くの既存研究が実装されており,手軽に敵対的画像を作成できます.

foolbox.readthedocs.io

 

これは以下のようにpipでインストールができます.

pip install foolbox

 foolboxのよいところは,pytorch,keras,tensorflowモデルそれぞれに対応している点です.公式ドキュメントの実装例がとてもわかりやすいです.

foolbox.readthedocs.io

foolbox部分に絞ると,kerasだと大体以下のような感じでC&Wアタックが使えます.

import foolbox

model    = load_model(model_file)
fmodel   = foolbox.models.KerasModel(model, bounds=(0, 1))
amodel  = foolbox.attacks.CarliniWagnerL2Attack(fmodel)
adv_img = amodel(img, label)

 動かしてみると,ほとんど原画像に見分けがつかず,分類器が誤って分類するようになりました.

FGSM,C&Wアタック,Deepfoolを使ったサンプルコードをgithubにあげています.

github.com