4/14(日) 足・靴・木型研究会「第2回研究集会」を開催します☆彡

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

やること

前回は、vcoptを用いてImageNetの学習済みニューラルネットに対する騙し画像(Adversarial example)を生成しました。「モザイクに見えるけどネコと判定される」という初歩的なものでした。

ところで皆さんの中には、

賃貸だからペットが飼えない!

でもどうしても猫が飼いたい!

という方はいませんか?

心配ありません。今回は「イスに見えるけどネコと判定される」少し本格的な騙し画像を生成しますので、実質的に猫を飼っているのと同じ状況になれます。

参考文献

騙し画像についてはこちらをご参考ください。

はじめてのAdversarial Example
今回はadversarial exampleについて解説していきます。Adversarial exampleというのは、下図のように摂動を与えることによりモデルに間違った答えを出力させてしまうもののことです。
ディープニューラルネットワークを欺くための1ピクセル攻撃
いくつかの研究は画像上の人工的な摂動(小さな攪乱・ずれ)がDNNの誤分類を容易にすることができることを明らかにし、それに応じ「敵対的画像Adversarial Examples」と呼ばれるそのようなサンプルを生成するための方法がいくつか提案されています。本稿では、その中でも画像上の1ピクセルを変更するだけで、ニューラル...

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

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

実行環境

Google Colaboratoryが利用可能です。

Google Colaboratory

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 class ID:{} name:{} score:{}'.format(sample_ID, name[sample_ID], result[0][sample_ID]))
sample class ID:765 name:ロッキングチェア score:0.9430854320526123

確信度94%でロッキングチェアと判定されました。

評価関数

VGG16の入力形式は、224*224*3chのカラー画像です。この画像の一部に40*40*3chのモザイクパネルを貼ります。このモザイクパネルを、ニューラルネットが画像を「トラ猫だ!」と判定するように最適化します。

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

#評価関数
def score(para, return_sample_score_and_img=False):
    #paraをモザイクパネルに変形
    panel = para.reshape((40, 40, 3)) * 32.0
    
    #print(panel.shape)
    
    #サンプル画像にモザイクパネルを貼る(貼る位置は(65, 105))
    img = deepcopy(sample_img)
    img[65:65+40, 105:105+40, :] = panel

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

    #分類
    result = model.predict(x)
    
    #指定したクラス(ここではトラ猫)である確信度を返す(オプションがTrueであればイスである確信度と画像も返す)
    #確信度は0~1ですがここでは10000倍して0~10000として返します
    if return_sample_score_and_img:
        return result[0][aim_ID] * 10000, result[0][sample_ID] * 10000, img
    else:
        return result[0][aim_ID] * 10000
    
#ランダムなparaを入れてみる
para = nr.randint(0, 8, 40*40*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, vmin = 0, vmax = 255)
plt.show()
plt.close()
aim_score:0.007652698172933015
sample_score:8593.378067016602

見やすくするため、返ってくる確信度は10000倍して0~10000となっていることに注意してください。

ランダムなparaを入れてみると、トラ猫である確信度は0.0%で、ロッキンチェアである確信度は85.9%と出ました。自信満々でイスです。

可視化関数(任意)

なくても最適化はできますが、画像を見たいので頑張って書きます。1000世代ごとに世代情報と画像を表示します。また、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 % 1000 == 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は[0, 1, 2, 3, 4, 5, 6, 7]が4800個並んだ2次元配列です。離散的GAですのでvcopt().dcGA()を用います。評価関数の目標値は(トラ猫であるという)確信度10000。個体数は200に制限します。

#パラメータ範囲
para_range = [[i for i in range(8)] for j in range(40*40*3)]
#print(para_range)

#GA
para, score = vcopt().dcGA(para_range,
                           img_score,
                           10000,
                           show_pool_func=show_pool,
                           pool_num=200)
___________________ info ___________________
para_range : n=4800
score_func : <class 'function'>
aim : 10000.0
show_pool_func : '<function show_pool at 0x7f06e2aae2f0>'
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.0113 mean_score:0.0064 time:8.8 sample_score:8868.247270584106
para = np.array([6,5,1,...,4,7,4])
gen:1000 best_score:0.0165 mean_score:0.0113 time:34.0 sample_score:8438.194990158081
gen:2000 best_score:0.0204 mean_score:0.0157 time:58.8 sample_score:8287.076950073242
.
.
.
gen:299000 best_score:9988.6119 mean_score:9988.3616 time:7070.2 sample_score:0.0002408863508662762
gen:300000 best_score:9988.8784 mean_score:9988.5883 time:7093.7 sample_score:0.0002269254117948094
para = np.array([7,7,7,...,1,1,3])

30万世代でロッキングチェアの確信度が0.0%まで下がり、トラ猫の確信度は99.9%まで高まりました。

ニューラルネット「これはトラ猫!

トラ猫かどうか確認

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

#パラメータを指定
para = np.array([7,7,7,...,1,1,3]) #長すぎてColabが不安定になるよ

#paraをモザイクパネルに変形
panel = para.reshape((40, 40, 3)) * 32.0

#サンプル画像にモザイクパネルを貼る(貼る位置は(65, 105)他)
img = deepcopy(sample_img)
img[65:65+40, 105:105+40, :] = panel

#表示
plt.imshow(img, vmin = 0, vmax = 255)
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.9989 : tiger_cat
0.0006 : tabby
0.0002 : tiger
0.0002 : Egyptian_cat
0.0 : lynx

はい、99.9%の確信度でトラ猫です。次いでtabby(これもトラ猫)、tiger(トラ)、Egyptian cat(エジプシャン・マウ)が候補にあがっています。

ちなみにこのモザイクパネルをサンプル画像の違う場所に貼ってみると、

貼る場所によっては自信なさげですが、それでもトラ猫が1番目の候補にあがっています。画像のどこに貼っても効果があることが分かりました。

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