VGG16モデルを使用してオリジナル写真の画像認識を行う
今回はVGG16モデルを使用してオリジナルの写真の画像認識を行ってみたいと思います。
VGG16とは
VGG16というのは,「ImageNet」と呼ばれる大規模画像データセットで学習された16層からなるCNNモデルです。Oxford大学の研究グループが提案し2014年のILSVRで好成績を収めました。16層からなるCNNモデルには、(224×224)の入力サイズのカラーチャネルの入力層と1000クラス分類の出力層を含み様々な研究に使用されています。
モデルイメージ
使用環境
- Google Colab
Python3 (GPU)
オリジナル画像
以下の3種類の写真(フリー画像)に対して画像認識を行っていきます。
フォルダ構成は以下の通りです
image
→bird.jpg
→cat.jpg
→lion.jpg
Google Colabにアップロードするためzipに圧縮しておきます
(ファイル名:image.zep)
ソースコード
INPUT画像のアップロード(ZIP形式)
[crayon-693bd135dc7aa041298326/]
ローカルで格納しているオリジナル画像のzipファイルをGoogle Colabにアップロードします。ファイル選択ボタンが出力されるのでローカルに保存しているimage.zepを選択します(ファイルの量に応じて転送時間が変わります)
アップロードしたZIP形式のファイルを解凍
[crayon-693bd135dc7b4697991500/]
[crayon-693bd135dc7b7425869855/]
Google Colabにアップロードされたzipファイルを解凍します。
必要なライブラリをインポート
[crayon-693bd135dc7ba354658623/]
必要なライブラリをインポートしています。VGGを扱うための keras.applications、keras.preprocessingやnumpyをインポートしています。
VGG16の読み出し
[crayon-693bd135dc7bc263076122/]
[crayon-693bd135dc7be665414160/]
VGG16の読み込みを行います。読み込んだモデルは既に学習済みの重みのパラメータを含んでいるためそのまま使用することが出来ます。
読み出したVGG16のモデルの確認
[crayon-693bd135dc7c1369255288/]
[crayon-693bd135dc7c3606111569/]
読みだしたVGG16のモデルの構成を確認しています。
入力層のinput_1 (InputLayer)は224×224×3となっており、(224×224)の入力サイズのカラーチャネル(3)になっていることが分かります。出力層のpredictions (Dense) では1000となっており、1000クラスの分類になっていることが分かります。
INPUT画像を224 x 224にリサイズして画像の読み込み
[crayon-693bd135dc7c5307345449/]
先ほどアップロードしたオリジナルの写真を読み込んでいます。image.load_imgeで読みこんんだ場合はPillow画像のデータ形式となります。引数にサイズを指定することで画像をリサイズして読み込むことができるので、入力層に合わせ(224×224)の入力サイズにリサイズして読み込んでいます。
読み込んだ画像をarrayに変換
[crayon-693bd135dc7c9242843378/]
Pillow画像のデータ形式ではそのままVGG16のモデルに入力できないため、読み込んだ画像をarrayに変換しています。
画像をVGG16モデルの事前学習時と同じ状態に合わせて変換
[crayon-693bd135dc7cb524632378/]
続いてpreprocess_input関数に渡し、VGG16モデルの事前学習時と同じ状態に合わせて変換しています。この関数では入力値から学習時の平均値を引いて平均を0に変換する中心化とRGB⇒BGRへの変換を行っています。
3次元テンソル(rows, cols, channels) を 4次元テンソル (samples, rows, cols, channels) に変換
[crayon-693bd135dc7cd202797426/]
3つの画像を一回で認識できるように4次元テンソル (samples, rows, cols, channels) に変換しています。input.shapeで確認すると(3, 224, 224, 3)となっています。samples数が3つとなっていることから、3つの画像を1つの配列にまとめられたことが分かります。
予測値を算出
[crayon-693bd135dc7cf896291521/]
予想値を算出しています。decode_predictions関数の引数にtop=10と指定することによって、確率が高いTOP10を表示しています。ここから結果を見ていきます。
画像認識結果
[crayon-693bd135dc7d1126186421/]
[crayon-693bd135dc7d3591750195/]
[crayon-693bd135dc7d6497852591/]
TOP3として、カササギ 0.6588893 / ガチョウ 0.11239987 / アメリカオオバン 0.043373622となっています。種類までは合っているか分かりませんがいずれも鳥系の画像と認識されました。
[crayon-693bd135dc7d8987083818/]
[crayon-693bd135dc7da604869720/]
[crayon-693bd135dc7dc022172828/]
TOP3として、トラネコ 0.4234919 / エジプト猫 0.12558442 / ミニチュアシュナウザー 0.122963406となっています。こちらも種類までの妥当性は分かりませんが猫系の画像と認識されました。
[crayon-693bd135dc7df505684249/]
[crayon-693bd135dc7e1063893164/]
[crayon-693bd135dc7e3262104401/]
TOP3として、ライオン 0.9999267/ チャウ 2.1677808e-05/ バイソン 1.9796138e-05となっています。これは確実にライオンで会っています。
まとめ
VGG16のモデルを使用してオリジナルの画像認識を行いました。意外と簡単にできたのではないでしょうか。これらをアプリとして組み込むだけで簡単な画像認識ソフトが作れそうです。今回はVGG16のデフォルトとして入っている1000クラスの判定を行いましたが、次回は出力層を変化させ、自作の分類器を作成してみようと思います。