12/9(月) 応用科学学会シンポジウムで自動運転に関する講演を担当します☆彡(試乗会もあります!来て!)

9-15. 遺伝的アルゴリズム(vcopt)でニューラルネットの騙し画像を作る(モザイクノイズ編)

やること

これまでにvcoptを用いて「ネコと判定されるモザイク画像」「イスに添えるだけでネコと誤認されるモザイクパネル」を作ってきました。

今回は「コーヒー画像に足すだけでネコと判定される隠しノイズ」を生成し、本格的な騙し画像(Adversarial example)を作ってみましょう。

参考文献

騙し画像(Adversarial example)についてはこちらもご参考ください。

今更聞けない!? Adversarial Examples - Qiita
Adversarial Example とは最近あちこちで応用の進んでいる深層学習ですが、内部がブラックボックスのこともあり、まだまだ謎が多いというのが現状です。そのような中、深層学習の不可解な挙…

ImageNetの日本語ラベルを使用させていただきました。

imagenetのラベルを日本語化するjsonです。
imagenetのラベルを日本語化するjsonです。. GitHub Gist: instantly share code, notes, and snippets.

実行環境

Google Colaboratoryが利用可能です。

Google Colab

vcoptの使い方についてはチュートリアルをご参照ください。

vcoptの仕様については最新の仕様書をご参照ください。本記事執筆時とは仕様が異なる場合があります。

pip, import

vcoptをインストールします。

!pip install vcopt

今回用いるパッケージをインポートします。

#==================
#基本パッケージ
#==================
import os
import numpy as np
import numpy.random as nr
from copy import deepcopy
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw

#==================
#深層学習のパッケージ
#==================
from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions

#==================
#GAのパッケージ
#==================
from vcopt import vcopt

学習済みニューラルネットの読み込み

Kerasには学習済みのニューラルネットが用意されています。ここでは、VGG16でImageNetを学習したモデル(と重み)を読み込んで用います。ImageNetは1000クラスの教師画像データセットで、VGG16はニューラルネットモデル(=層構造)の名前です。

初回の読み込み時にモデル(と重み)のダウンロードが発生するため少し時間がかかります。誤認させるクラスとして、ID=282のトラ猫を指定します。

#NNモデルの読み込み
model = VGG16(weights='imagenet')

#日本語ラベルの読み込み
name = 'テンチ,金魚,ホホジロザメ,イタチザメ,ハンマーヘッド,シビレエイ,アカエイ,コック,めんどり,ダチョウ,アトリ,ゴシキヒワ,ハウスフィンチ,ユキヒメドリ,インディゴホオジロ,ロビン,ブルブル,カケス,カササギ,四十雀,水クロウタドリ,凧,白頭ワシ,ハゲワシ,カラフトフクロウ,欧州ファイアサラマンダー,共通イモリ,イモリ,サンショウウオを発見,アホロートル,ウシガエル,アマガエル,つかれたカエル,とんちき,オサガメ,鼈,テラピン,ハコガメ,縞模様のヤモリ,共通イグアナ,アメリカンカメレオン,ウィッペイル,アガマトカゲ,フリルトカゲ,アリゲータートカゲ,アメリカドクトカゲ,緑のトカゲ,アフリカのカメレオン,コモドドラゴン,アフリカのワニ,アメリカワニ,トリケラトプス,雷のヘビ,リングネックスネーク,ホーノースヘビ,緑のヘビ,キングスネーク,ガータースネーク,水蛇,つるヘビ,夜のヘビ,ボア・コンストリクター,ロックパイソン,インドコブラ,グリーンマンバ,ウミヘビ,ツノクサリヘビ,ダイヤ,サイドワインダー,三葉虫,刈り入れ作業者,サソリ,黒と金の庭クモ,納屋クモ,庭クモ,クロゴケグモ,タランチュラ,オオカミのクモ,ダニ,百足,クロライチョウ,雷鳥,ひだえりの付いたライチョウ,草原チキン,孔雀,ウズラ,ヤマウズラ,アフリカの灰色,コンゴウインコ,硫黄トキオウム,インコ,バンケン,蜂食べる人,サイチョウ,ハチドリ,錐嘴,オオハシ,ドレイク,赤ブレストアイサ属のガモ,ガチョウ,黒い白鳥,タスカービール,ハリモグラ,カモノハシ,ワラビー,コアラ,ウォンバット,クラゲ,イソギンチャク,脳サンゴ,扁形動物,線虫,巻き貝,カタツムリ,ナメクジ,ウミウシ,キトン,オウムガイ,アメリカイチョウガニ,岩カニ,シオマネキ,タラバガニ,アメリカンロブスター,伊勢エビ,ザリガニ,ヤドカリ,等脚類,コウノトリ,ナベコウ,ヘラサギ,フラミンゴ,小さな青いサギ,アメリカン白鷺,にがり,クレーン,ツルモドキ科の鳥,ヨーロピアン水鳥,アメリカオオバン,ノガン,キョウジョシギ,赤担保シギ,アカアシシギ,オオハシシギ,ミヤコドリ,ペリカン,キングペンギン,アルバトロス,コククジラ,シャチ,ジュゴン,アシカ,チワワ,狆,マルチーズ犬,狆,シーズー、シーズー,ブレナムスパニエル,パピヨン,トイテリア,ローデシアン・リッジバック,アフガンハウンド,バセット犬,ビーグル,ブラッドハウンド,ブルーティック,黒と黄褐色の猟犬,ウォーカーハウンド,イングリッシュフォックスハウンド,レッドボーン,ボルゾイ,アイリッシュ・ウルフハウンド,イタリアングレーハウンド,ウィペット,イビサハウンド,ノルウェーエルクハウンド,オッターハウンド,サルーキ,スコティッシュ・ディアハウンド,ワイマラナー,スタフォードシャーブルテリア,アメリカン・スタッフォードシャー・テリア,ベドリントンテリア,ボーダーテリア,ケリーブルーテリア,アイリッシュテリア,ノーフォークテリア,ノーリッチ・テリア,ヨークシャーテリア,ワイヤーヘアー・フォックステリア,レークランドテリア,シーリーハムテリア,エアデール,ケルン,オーストラリアテリア,ダンディディンモントテリア,ボストンブル,ミニチュアシュナウザー,ジャイアントシュナウザー,スタンダードシュナウザー,スコッチテリア,チベタンテリア,シルキーテリア,ソフトコーテッド・ウィートン・テリア,ウェストハイランドホワイトテリア,ラサ,フラットコーテッド・レトリーバー,カーリーコーティングされたレトリーバー,ゴールデンレトリバー,ラブラドル・レトリーバー犬,チェサピーク湾レトリーバー,ジャーマン・ショートヘア・ポインタ,ビズラ,イングリッシュセッター,アイリッシュセッター,ゴードンセッター,ブリタニースパニエル,クランバー,イングリッシュスプリンガー,ウェルシュスプリンガースパニエル,コッカースパニエル,サセックススパニエル,アイルランドのウォータースパニエル,クバース犬,スキッパーキー,ベルジアン・シェパード・ドッグ・グローネンダール,マリノア,ブリアール,ケルピー,コモンドール,オールドイングリッシュシープドッグ,シェトランドシープドッグ,コリー,ボーダーコリー,ブーヴィエ・デ・フランドル,ロットワイラー,ジャーマンシェパード,ドーベルマン犬,ミニチュアピンシャー,グレータースイスマウンテンドッグ,バーネーズマウンテンドッグ,アッペンツェル,エントレブッシャー,ボクサー,ブルマスチフ,チベットマスチフ,フレンチブルドッグ,グレートデーン,セントバーナード,エスキモー犬,マラミュート,シベリアンハスキー,ダルメシアン,アーフェンピンシャー,バセンジー,パグ,レオンバーグ,ニューファンドランド島,グレートピレニーズ,サモエド,ポメラニアン,チャウ,キースホンド,ブラバンソングリフォン,ペンブローク,カーディガン,トイプードル,ミニチュアプードル,スタンダードプードル,メキシカン・ヘアーレス,シンリンオオカミ,白いオオカミ,レッドウルフ,コヨーテ,ディンゴ,ドール,リカオン,ハイエナ,アカギツネ,キットキツネ,ホッキョクギツネ,灰色のキツネ,タビー,虎猫,ペルシャ猫,シャム猫,エジプトの猫,クーガー,オオヤマネコ,ヒョウ,ユキヒョウ,ジャガー,ライオン,虎,チーター,ヒグマ,アメリカクロクマ,氷のクマ,ナマケグマ,マングース,ミーアキャット,ハンミョウ,てんとう虫,グランドビートル,カミキリムシ,ハムシ,フンコロガシ,サイハムシ,ゾウムシ,ハエ,蜂,蟻,バッタ,クリケット,杖,ゴキブリ,カマキリ,蝉,ヨコバイ,クサカゲロウ,トンボ,イトトンボ,提督,リングレット,君主,モンシロチョウ,硫黄蝶,シジミチョウ,ヒトデ,うに,ナマコ,木のウサギ,野ウサギ,アンゴラ,ハムスター,ヤマアラシ,キツネリス,マーモット,ビーバー,モルモット,栗色,シマウマ,豚,イノシシ,イボイノシシ,カバ,雄牛,水牛,バイソン,ラム,ビッグホーン,アイベックス,ハーテビースト,インパラ,ガゼル,アラビアラクダ,ラマ,イタチ,ミンク,ケナガイタチ,クロアシイタチ,カワウソ,スカンク,狸,アルマジロ,ミユビナマケモノ,オランウータン,ゴリラ,チンパンジー,テナガザル,フクロテナガザル,オナガザル,パタス,ヒヒ,マカク,ヤセザル,コロブス属,テングザル,マーモセット,オマキザル,ホエザル,ティティ,クモザル,リスザル,マダガスカル猫,インドリ,インドゾウ,アフリカゾウ,レッサーパンダ,ジャイアントパンダ,バラクータ,ウナギ,ギンザケ,岩の美しさ,クマノミ,チョウザメ,ガー,ミノカサゴ,フグ,そろばん,アバヤ,アカデミックガウン,アコーディオン,アコースティックギター,空母,旅客機,飛行船,祭壇,救急車,両生類,アナログ時計,養蜂場,エプロン,ごみ入れ,アサルトライフル,バックパック,ベーカリー,平均台,バルーン,ボールペン,バンドエイド,バンジョー,バニスター,バーベル,理髪店の椅子,理髪店,納屋,バロメーター,バレル,バロー,野球,バスケットボール,バシネット,ファゴット,水泳帽,バスタオル,バスタブ,ビーチワゴン,ビーコン,ビーカー,ベアスキン,ビール瓶,ビールグラス,ベルコート,ビブ,自転車,ビキニ,バインダー,双眼鏡,巣箱,ボートハウス,ボブスレー,ループタイ,ボンネット,本棚,書店,瓶のキャップ,弓,ちょうネクタイ,真鍮,ブラジャー,防波堤,胸当て,ほうき,バケツ,バックル,防弾チョッキ,新幹線,精肉店,タクシー,大釜,キャンドル,大砲,カヌー,缶切り,カーディガン,車のミラー,回転木馬,大工のキット,カートン,車のホイール,現金自動預け払い機,カセット,カセット・プレーヤー,城,カタマラン,CDプレーヤー,チェロ,スマートフォン,鎖,チェーンリンクフェンス,チェーンメール,チェーンソー,胸,シフォニア,チャイム,中国キャビネット,クリスマスの靴下,教会,映画,クリーバー,崖の住居,マント,クロッグ,カクテルシェーカー,コーヒーマグ,コーヒーポット,コイル,ダイヤル錠,コンピュータのキーボード,製菓,コンテナ船,コンバーチブル,コークスクリュー,コルネット,カウボーイブーツ,カウボーイハット,クレードル,クレーン,クラッシュヘルメット,木箱,ベビーベッド,クロークポット,クロケットボール,松葉杖,胸当て,ダム,机,デスクトップコンピューター,ダイヤル電話,おむつ,デジタル時計,デジタル腕時計,ダイニングテーブル,意気地なし,食器洗い機,ディスクブレーキ,ドック,犬ぞり,ドーム,玄関マット,掘削基地,ドラム,ドラムスティック,ダンベル,ダッチオーブン,扇風機,エレキギター,電気機関車,娯楽施設,封筒,エスプレッソマシーン,フェースパウダー,フェザーボア,ファイル,消防艇,消防車,ファイアースクリーン,旗竿,フルート,折り畳み式椅子,フットボールヘルメット,フォークリフト,噴水,万年筆,四柱,貨車,フレンチホルン,フライパン,毛皮のコート,ごみ収集車,ガスマスク,ガソリンポンプ,ゴブレット,ゴーカート,ゴルフボール,ゴルフカート,ゴンドラ,ゴング,ガウン,グランドピアノ,温室,グリル,食料品店,ギロチン,ヘアスライド,ヘアスプレー,半トラック,ハンマー,妨げます,ハンドブロワー,タブレット,ハンカチ,ハードディスク,ハーモニカ,ハープ,ハーベスタ,斧,ホルスター,ホームシアター,ハニカム,フック,フープスカート,水平バー,馬車,砂時計,アイフォーン,鉄,ジャックオーランタン,ジーンズ,ジープ,ジャージー,ジグソーパズル,人力車,ジョイスティック,着物,膝パッド,結び目,白衣,ひしゃく,ランプのかさ,ノートパソコン,芝刈り機,レンズキャップ,レターオープナー,ライブラリ,救命ボート,ライター,リムジン,ライナー,口紅,ローファー,ローション,スピーカー,ルーペ,製材所,磁気コンパス,郵袋,メールボックス,マイヨ,マイヨ,マンホールの蓋,マラカス,マリンバ,マスク,マッチ棒,メイポール,迷路,計量カップ,薬箱,巨石,マイク,マイクロ波,軍服,ミルク缶,ミニバス,ミニスカート,ミニバン,ミサイル,ミトン,ミキシングボウル,移動住宅,モデルT,モデム,修道院,モニター,モペット,モルタル,モルタルボード,モスク,蚊帳,スクーター,マウンテンバイク,山のテント,マウス,ネズミ捕り,引っ越しトラック,銃口,ネイル,ネックブレース,ネックレス,乳首,ノート,オベリスク,オーボエ,オカリナ,オドメーター,オイルフィルター,器官,オシロスコープ,オーバースカート,牛車,酸素マスク,パケット,パドル,パドルホイール,南京錠,絵筆,パジャマ,宮殿,パンパイプ,ペーパータオル,パラシュート,平行棒,公園のベンチ,パーキングメーター,乗用車,パティオ,有料電話,台座,筆箱,鉛筆削り,香水,ペトリ皿,コピー機,選ぶ,スパイク付き鉄かぶと,杭柵,拾う,桟橋,貯金箱,錠剤瓶,枕,ピンポン球,風車,海賊,ピッチャー,飛行機,プラネタリウム,ビニール袋,皿立て,プラウ,プランジャー,ポラロイドカメラ,ポール,警察車,ポンチョ,ビリヤード台,ポップ・ボトル,ポット,ろくろ,パワードリル,礼拝用敷物,プリンタ,刑務所,発射体,プロジェクター,パック,サンドバッグ,財布,クイル,キルト,レーサー,ラケット,ラジエーター,無線,電波望遠鏡,天水桶,RV車,リール,レフレックスカメラ,冷蔵庫,リモコン,レストラン,リボルバー,ライフル,ロッキングチェア,焼肉料理店,消しゴム,ラグビーボール,ルール,ランニングシューズ,安全,安全ピン,塩の入れ物,サンダル,サロン,サックス,鞘,規模,スクールバス,スクーナー,スコアボード,画面,スクリュー,ドライバー,シートベルト,ミシン,シールド,靴屋,障子,買い物かご,ショッピングカート,シャベル,シャワーキャップ,シャワーカーテン,スキー,スキーマスク,寝袋,計算尺,引き戸,スロット,スノーケル,スノーモービル,除雪機,ソープディスペンサー,サッカーボール,靴下,太陽の皿,ソンブレロ,スープ皿,スペースキー,スペースヒーター,スペースシャトル,へら,スピードボート,クモの巣,スピンドル,スポーツカー,スポットライト,ステージ,蒸気機関車,鋼アーチ橋,スチールドラム,聴診器,ストール,石垣,ストップウォッチ,レンジ,ストレーナー,路面電車,ストレッチャー,スタジオソファ,仏舎利塔,潜水艦,スーツ,日時計,サングラス,サングラス,日焼け止め剤,つり橋,綿棒,トレーナー,海パン,スイング,スイッチ,注射器,電気スタンド,タンク,テーププレーヤー,ティーポット,テディ,テレビ,テニスボール,サッチ,劇場のカーテン,指ぬき,脱穀機,王位,瓦屋根,トースター,タバコ屋,便座,トーチ,トーテムポール,レッカー車,玩具屋,トラクター,トレーラートラック,トレイ,トレンチコート,三輪車,三胴船,三脚,凱旋門,トロリーバス,トロンボーン,バスタブ,回転ドア,タイプライターのキーボード,傘,一輪車,直立,真空,花瓶,ボールト,ベルベット,自動販売機,祭服,高架橋,バイオリン,バレーボール,ワッフル焼き型,壁時計,財布,ワードローブ,戦闘機,洗面器,ワッシャー,水筒,水差し,給水塔,ウイスキージャグ,ホイッスル,かつら,窓網戸,ブラインド,ウィンザーネクタイ,ワインボトル,翼,中華鍋,木製スプーン,ウール,ワームフェンス,難破船,ヨール,パオ,サイト,コミックブック,クロスワードパズル,道路標識,交通信号灯,ブックカバー,メニュー,プレート,グアカモーレ,コンソメ,ホットポット,パフェ,アイスクリーム,アイスキャンディー,フランスパン,ベーグル,プレッツェル,チーズバーガー,ホットドッグ,マッシュポテト,キャベツ,ブロッコリー,カリフラワー,ズッキーニ,そうめんかぼちゃ,ドングリかぼちゃ,カボチャ,キュウリ,アーティチョーク,ピーマン,カルドン,キノコ,リンゴ,イチゴ,オレンジ,レモン,イチジク,パイナップル,バナナ,パラミツ,カスタードアップル,ザクロ,干し草,カルボナーラ,チョコレートソース,パン生地,ミートローフ,ピザ,ポットパイ,ブリトー,赤ワイン,エスプレッソ,カップ,エッグノッグ,アルプス,バブル,崖,サンゴ礁,間欠泉,湖畔,岬,砂州,海岸,谷,火山,野球選手,新郎,スキューバダイバー,菜種,デイジー,蘭,トウモロコシ,ドングリ,ヒップ,トチノキ,サンゴ菌,ハラタケ,シャグマアミガサタケ,スッポンタケ,ハラタケ,舞茸,きのこ,耳,トイレットペーパー'
name = name.split(',')

#日本語ラベルの表示
for i in range(1000):
    print('{} {}'.format(i, name[i]))

#誤認させるクラス(ここではトラ猫)
aim_ID = 282
print('aim class ID:{} name:{}'.format(aim_ID, name[aim_ID]))
0 テンチ
1 金魚
2 ホホジロザメ
3 イタチザメ
・
・
・
996 舞茸
997 きのこ
998 耳
999 トイレットペーパー
aim class ID:282 name:虎猫

サンプル画像の読み込みと判定

今回はこちらのカプチーノの画像を使用します。

これを読み込んで、学習済みのニューラルネットに判定してもらいます。判定したクラスは sample_ID に入ります。

#サンプル画像読み込み
sample_img = Image.open('sample_1.jpg').convert('RGB'); sample_img.close
sample_img = np.array(sample_img)

#表示
plt.imshow(sample_img)
plt.show()
plt.close()

#前処理
x = sample_img.reshape((1, 224, 224, 3))
x = preprocess_input(x)

#分類
result = model.predict(x)
sample_ID = np.argmax(result[0])
print('sample ID:{} name:{} score:{}'.format(sample_ID, name[sample_ID], result[0][sample_ID]))

#トップ5を抽出して表示
result_5 = decode_predictions(result, top=5)[0]
for re in result_5:
    print('{} : {}'.format(round(re[2]*1.0, 4), re[1]))
sample ID:967 name:エスプレッソ score:0.7814357280731201
0.7814 : espresso
0.0355 : cup
0.035 : eggnog
0.0272 : ice_cream
0.0237 : coffee_mug

確信度78%エスプレッソと判定されました。次いでカップ、エッグノッグ、アイスクリーム、コーヒーマグでした。ImageNetには「コーヒーマグ」はありますが「コーヒー」というクラスはないんですね。

評価関数

VGG16の入力形式は、224*224*3chのカラー画像です。サンプル画像に同じサイズのモザイクノイズを加えてからニューラルネットで判定します。モザイクノイズは28*28=784個のカラードットからなります。このモザイクノイズを、ニューラルネットが画像を「トラ猫だ!」と判定するように最適化します。

評価関数はparaとして2352の長さの遺伝子を受け取ります。各遺伝子は-3, -2, -1, 0, +1, +2, +3の7階調を取ることができます。値を3倍して変形することで28*28*3chのモザイクノイズができます。このモザイクノイズをサンプル画像に貼り、ニューラルネットで判定した「トラ猫」確信度を返します。

#評価関数
def img_score(para, return_sample_score_and_img=False):
    #paraをモザイクノイズに変形
    noise = para.reshape((28, 28, 3)) * 3
    noise = noise.repeat(8, axis=0).repeat(8, axis=1)
    
    #モザイクノイズの確認(グレーに貼り付けて確認)
    #plt.imshow(noise + 128)
    #plt.show()
    #plt.close()

    #サンプル画像にモザイクノイズを足す
    img = deepcopy(sample_img)
    img = img + noise
    
    #0~255に収める
    img[img<0] = 0
    img[img>255] = 255
    
    #前処理
    x = img.reshape((1, 224, 224, 3))
    x = preprocess_input(x)

    #分類
    result = model.predict(x)
    
    #指定したクラス(ここではトラ猫)である確信度を返す(オプションがTrueであればエスプレッソである確信度と画像も返す)
    if return_sample_score_and_img:
        return result[0][aim_ID], result[0][sample_ID], img
    else:
        return result[0][aim_ID]

#ランダムなparaを入れてみる
para = nr.randint(-3, 4, 28*28*3)
print('aim_score:{}'.format(img_score(para)))

#オプションをTrueにして画像を表示してみる
aim_score, sample_score, img = img_score(para, True)
print('sample_score:{}'.format(sample_score))
plt.imshow(img)
plt.show()
plt.close()
aim_score:1.7009140719892457e-05
sample_score:0.5499071478843689

ランダムなparaによるモザイクノイズを乗せてみました。右の画像、ノイズが少しチラチラしているのが分かるでしょうか。トラ猫である確信度は0.0017%、エスプレッソである確信度は55%と出ました。ノイズを乗せる前の確信度は78%でしたので、モザイクノイズを乗せるだけで少し判断力が鈍るようです。右の画像、ノイズが少しチラチラしているのが分かるでしょうか。

可視化関数(任意)

なくても最適化はできますが、画像を見たいので頑張って書きます。5000世代ごとに世代情報と画像を表示します。また、10000世代ごとにエリート個体のパラメータを表示します。

#可視化関数
def show_pool(pool, **info):

    #GA中の諸情報はinfoという辞書に格納されて渡されます
    #これらを受け取って使用することができます
    gen = info['gen']
    best_index = info['best_index']
    best_score = info['best_score']
    mean_score = info['mean_score']
    mean_gap = info['mean_gap']
    time = info['time']

    if gen % 5000 == 0:
        #ベスト個体をparaとする
        para = pool[best_index]
        #評価
        aim_score, sample_score, img = img_score(para, True)
        #世代情報の表示
        print('gen:{} best_score:{} mean_score:{} time:{} sample_score:{}'.format(gen, best_score, mean_score, time, sample_score))

        #画像の表示や保存
        img = Image.fromarray(np.uint8(img))
        #img.save('./save/{}.png'.format(gen))
        plt.imshow(img, vmin = 0, vmax = 255)
        plt.show()
        plt.close()

    if gen % 10000 == 0:
        #para出力
        output = 'para = np.array([{}'.format(para[0])
        for p in para[1:]:
            output += ',{}'.format(p)
        output += '])'
        print(output)

GAで騙し画像を生成する

para_rangeは[-3, -2, -1, 0, +1, +2, +3]が2352個並んだ2次元配列です。離散的GAですのでvcopt().dcGA()を用います。評価関数の目標値は(トラ猫であるという)確信度1。個体数は200に制限します。

#パラメータ範囲
para_range = [[i for i in range(-3, 4)] for j in range(28*28*3)]
#print(para_range)

#GA
para, score = vcopt().dcGA(para_range,
                           img_score,
                           1.0,
                           show_pool_func=show_pool,
                           pool_num=200)
___________________ info ___________________
para_range : n=2352
score_func : <class 'function'>
aim : 1.0
show_pool_func : '<function show_pool at 0x7fa2ae556b70>'
seed : 0
pool_num : 200
max_gen : None
core_num : 1 (*vcopt, vc-grendel)
___________________ start __________________
Scoring first gen 200/200        
gen:0 best_score:0.0 mean_score:0.0 time:4.9 sample_score:0.5506524443626404
para = np.array([3,2,3,...,0,-1,0])
gen:5000 best_score:0.0004 mean_score:0.0003 time:110.2 sample_score:0.17887111008167267
gen:10000 best_score:0.0015 mean_score:0.0012 time:215.7 sample_score:0.06763532757759094
.
.
.
gen:495000 best_score:0.9223 mean_score:0.9221 time:10511.3 sample_score:6.266106356633827e-05
gen:500000 best_score:0.9228 mean_score:0.9227 time:10617.6 sample_score:6.732843030476943e-05
para = np.array([1,3,2,...,3,3,3])

50万世代でエスプレッソの確信度が0.007%まで下がり、トラ猫の確信度は92%まで高まりました。

出来上がったモザイクノイズがこちら。(見やすいようにグレーに貼り付けています)

トラ猫かどうか確認

50万世代目のエリートパラメータを置いておきます。コードの冒頭に貼り付けて使用してください。

#パラメータを指定
para = np.array([-1,-2,2,...,3,3,-3])

#新しいサンプル画像読み込み
sample_img = Image.open('sample_1.jpg').convert('RGB'); sample_img.close
sample_img = np.array(sample_img)

#=============================
# サンプル画像
#=============================
#表示
plt.imshow(sample_img)
plt.show()
plt.close()
#前処理
x = sample_img.reshape((1, 224, 224, 3))
x = preprocess_input(x)
#分類
result = model.predict(x)
#トップ5を抽出して表示
result_5 = decode_predictions(result, top=5)[0]
for re in result_5:
    print('{} : {}'.format(round(re[2]*1.0, 4), re[1]))

#=============================
# モザイクノイズ
#=============================
#paraをモザイクノイズに変形
noise = para.reshape((28, 28, 3)) * 3
noise = noise.repeat(8, axis=0).repeat(8, axis=1)
#表示(見やすいようにグレーに貼る)
plt.imshow(noise + 128)
plt.show()
plt.close()

#=============================
#サンプル画像+モザイクノイズ
#=============================
#ノイズを足す
img = deepcopy(sample_img)
img = img + noise
#0~255に収める
img[img<0] = 0
img[img>255] = 255
#表示
plt.imshow(img)
plt.show()
plt.close()
#前処理
x = img.reshape((1, 224, 224, 3))
x = preprocess_input(x)
#分類
result = model.predict(x)
#トップ5を抽出して表示
result_5 = decode_predictions(result, top=5)[0]
for re in result_5:
    print('{} : {}'.format(round(re[2]*1.0, 4), re[1]))

いろいろな画像にこのモザイクノイズを貼り付けて、判定がどう変わるかを見てみます。

最適化に用いたサンプル画像

これは当然「トラ猫」になります(そうなるように最適化したので)。トラ猫は0.0013%→92%に上がりました。

画像

0.7814 : espresso
0.0355 : cup
0.035 : eggnog
0.0272 : ice_cream
0.0237 : coffee_mug

画像+モザイクノイズ

0.9228 : tiger_cat
0.0434 : tiger
0.0045 : bucket
0.0029 : pot
0.0028 : lesser_panda
カプチーノ1

エスプレッソが下がり、その他がじわりと上がりました。トラ猫は0.10%→0.13%に上がりましたが、これはエスプレッソが降格した分、他のすべてのクラスが一斉に上がったことによるものです。(他のクラスも1.1~2.0倍くらいにりました)

画像

0.6083 : espresso
0.0783 : cup
0.0516 : bucket
0.0387 : coffee_mug
0.0285 : soup_bowl

画像+モザイクノイズ

0.2188 : bucket
0.1857 : espresso
0.079 : cup
0.0555 : coffee_mug
0.0517 : eggnog
カプチーノ2

エスプレッソが下がり、消去法的な感じでアイスクリームと判定されました。トラ猫は0.00027%→0.00074%に微増。

画像

0.7968 : espresso
0.0313 : ice_cream
0.0279 : cup
0.0223 : espresso_maker
0.017 : soup_bowl

画像+モザイクノイズ

0.185 : ice_cream
0.1293 : teapot
0.0985 : cup
0.065 : ladle
0.0645 : candle
コーヒー

やはりエスプレッソが下がり、その他がじわりと上がりました。トラ猫は0.000091%→0.00010%とほとんど変わらず。

画像

0.3805 : espresso
0.1539 : cup
0.0737 : chocolate_sauce
0.0552 : tray
0.0525 : soup_bowl

画像+モザイクノイズ

0.2246 : cup
0.0962 : mixing_bowl
0.0906 : tray
0.0755 : soup_bowl
0.0677 : espresso
イス

9-13で使用したイスも試してみましたが、ほとんど影響ありませんでした。

画像

0.9431 : rocking_chair
0.0174 : folding_chair
0.0172 : bassinet
0.0093 : cradle
0.0058 : studio_couch

画像+モザイクノイズ

0.9367 : rocking_chair
0.0553 : folding_chair
0.004 : cradle
0.0015 : bassinet
0.0007 : dining_table

結論

今回の手法で生成したモザイクノイズは次の効果をもつことが示唆されました。

生成に使用したエスプレッソ画像に貼ると、

  • エスプレッソを下げる
  • トラ猫やその他のネコを上げる

その他のエスプレッソ画像に貼ると、

  • エスプレッソを下げる

その他の画像に貼ると、

  • 特に影響なし

このモザイクノイズは、特徴量空間の中でエスプレッソ→トラ猫への摂動を与えるものであって、イス→トラ猫の摂動は起こらないと考えられます。

なかなかおもしろそうな研究テーマです。

タイトルとURLをコピーしました