Network(以下、CNN)と言われるくらいCNNは物体認識に広く使われており、Googleの画像検索やFacebookの顔認識、また、自動運転自動車などで実用されています。本記事では、このCNNへの入力画像を人間の目には分からないくらいに微妙に細工することで、CNNの画像分類を誤らせる攻撃手法を紹介します。Networks」です。興味のある方は一読することをおススメします。1は、論文から抜粋したCNNによる画像分類の結果を示しています。上段はオリジナル画像を分類した結果であり、それぞれ画像内の生物を正しく分類しています。ouzel(カワガラス)をredshank(アカアシシギ)」というように、誤分類が誘発されていることが分かります。本記事では以下、上記手法の検証方法及び検証結果と、誤分類を防ぐ対策案を述べていきます。検証で使用したソースコードは「検証用コード」に載せていますので、自身の管理下にあるシステムに対して検証目的でご自由にお使いください。検証したモデルとデータセット先ずは検証対象のCNNモデルとデータセットを用意します。CNNには様々なモデルが存在しますが、今回はImageNetで学習したVGG16に対し、検証で使用するデータセット(CIFAR10)でFine-tuningしたモデルを使用します。モデルの構築には深層学習フレームワーク「Keras」を使用しています。次に、検証で使用するデータセットとしてCIFAR10を採用しました。CIFAR10には10クラスの画像が収録されており、各クラス5,000枚の訓練用画像と1,000枚のテスト用画像が収録されています。32pixel,RGBと小さく扱い易いため、画像認識系のモデルを手軽に検証するのに適しています。検証用データセット:CIFAR10それでは、構築したモデルを使用した画像分類の例を幾つか見ていきましょう。32pixel)をモデルに入力してみます。すると、モデルは約76%の確率で「猫(cat)」と正しく分類します。次に、ネットから拾ってきた猫の画像(フリー素材)を入力してみます。4480pixel」と大きく、また、猫の体の大部分がベッドに隠れています。このような特殊な画像であっても、約76%の確率で「猫(cat)」と正しく分類します。このように今回検証に使用するモデルは、画像サイズの大小や分類対象物体の大部分が隠された画像であっても正しく分類することができる、優れた物体認識性能を持っていることが分かっていただけたかと思います。検証手順それでは、上記のモデルに誤分類を誘発させてみましょう。入力画像の大部分を細工すれば(当然ながら)誤分類を簡単に誘発させることはできますが、それでは当たり前すぎて面白くありません。人間の目にも簡単に細工が分かるため、現実のシステムにおいては、細工画像はCNNの前処理で拒否されてしまうことでしょう。そこで今回は、画像内の1pixelのみ細工することで、誤分類が誘発されるのか検証します。検証手順は以下のとおりです。CIFAR10のテスト用画像(クラスは「cat」)から画像を1枚読み込む。画像内からランダムに選択した1pixelを細工する。「白く」塗り潰す細工画像をCNNに入力。CNNの分類結果を観察。誤分類が誘発された場合、次の画像を検証(手順1に戻る)。誤分類が誘発されない場合、手順2~4を最大100回繰り返す。上記ループを1,000枚のテスト用画像全てに対して行います。手順5の最大試行回数は100回としていますが、これは検証時間の短縮のために設定しているものであり、深い意味はありません(32*32=1,024回試行してもOK)。サマリを以下に示します。検証結果サマリ猫「cat」のテスト用画像1,000枚の内、78枚を別のクラスに誤分類していることが分かります。犬「dog」と蛙「frog」に多く誤分類されていますが(画像的に似ているから?)、他クラスにも万遍なく誤分類しています。よって、今回の手法では意図したクラスに誤分類させることは難しいと言えます。誤分類に成功するpixel位置にも規則性はありませんでした(猫本体や背景の細工でも誤分類される)。実際に誤分類した画像を幾つか見ていきましょう。4:モデルは細工なしのオリジナル画像(左)を約68%の確率で猫「cat」と正しく分類しています。顎下の1pixelを黒くした細工画像(右)は、約51%の確率で犬「dog」と誤分類しています。5:モデルはオリジナル画像を約57%の確率で猫「cat」と正しく分類しています。髭付近の1pixelを黒くした細工画像は、約55%の確率で蛙「frog」と誤分類しています。6:モデルはオリジナル画像を約48%の確率で猫「cat」と正しく分類しています。背景の1pixelを白くした細工画像は、約48%の確率で鳥「bird」と誤分類しています。其の参このように、細工の箇所に関わらず、たった1pixelを細工するだけで、誤分類が誘発されることが分かりました。細工の有無は人間の目には非常に分かり難く、細工画像のみ見せられた場合、細工に気づくことは困難だと思われます。細工画像を(CNNに入力する)前処理で拒否することは困難であると言えます。Pepperノイズを加えて再度CNNを学習させる方法を試みました。以下はノイズを加えた訓練用画像の一例です。何となく細工画像に似ているため、効果が期待できそうです。次に、対策済みCNNを使用して検証した結果サマリを示します。対策後の検証結果サマリ上表のとおり、対策前に誤分類していた78枚の画像の内、44枚を猫「cat」として正しく分類していることが分かります。それでは、正しく分類できた画像を幾つか見てみましょう。8:対策前は約51%の確率で犬「dog」と誤分類していましたが、対策後は約53%の確率で猫「cat」と正しく分類しています。9:対策前は約55%の確率で蛙「frog」と誤分類していましたが、対策後は約71%の確率で猫「cat」と正しく分類しています。10:対策前は約48%の確率で鳥「bird」と誤分類していましたが、対策後は約88%の確率で猫「cat」と正しく分類しています。其の参このように、訓練用画像にノイズを加えることで、誤分類への耐性が増すことが分かりました。Augmentation)することで、更に耐性が高まることが期待されます。まとめ今回の検証を纏めます。誤分類に成功する細工箇所に規則性はない訓練用画像を増強することで誤分類への耐性が増す特に上記2と4の結果から、(CNNに入力する)前処理で細工画像を拒否することは困難であるため、CNNにとっては非常に厄介な攻撃であると言えます。今回の検証ではほぼランダムなクラスに誤分類されましたが、仮に意図したクラスに誤分類させる手法が確立された場合、物体認識系のシステムにとって大きな脅威になります。今回の検証を通して、CNNは優れた物体認識性能を持っているものの、細工画像に対して意外にも脆弱であることが分かりました。CNNを利用してサービスや製品を開発されている方がいましたら、お手元のモデルが本攻撃に対して脆弱か否か、直ぐに確認されることを強く推奨します。検証用コード[リポジトリ]https://github.com/13o-bbr-bbq/machine_learning_security/tree/master/CNN_testfinetuning.py検証用モデルの構築に使用。KerasのVGG16をCIFAR10でFine-tuning。search_adv.py誤分類の観測に使用。細工画像を生成してCNNに入力し、誤分類の有無を観察。predict.py分類結果の確認用。