見出し画像

VGG16で遊ぶ - 画像認識。

学習済みモデル、VGG16を使って簡単に画像認識ができればいいなということでネット上で色々検索して実行できるようになったので記録してきます。

いろんなサイトを見て試してみましたが、どうもうまくいかないということでエラーを検索してみた結果以下がでてきました。(Google Colabでやってます)

module 'keras.preprocessing.image' has no attribute 'load_img'

これを適応してやってみた結果うまくいきました。


基本的なところは

を参考にさせていただきました。

結果的には、

 from keras.preprocessing import image   

from keras.utils import load_img, img_to_array

に変えれば実行可能になりました。めでたし、めでたし。

実行コードの説明

必要なライブラリをインポート

keras関係 機械学習のライブラリ。

from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions
from keras.utils import load_img, img_to_array

計算のライブラリ。配列、ベクトル計算などなど機械学習でよく使われます。

import numpy as np

モデル。これが機械学習の本体。画像認識の学習済み。本体 VGG16を変数、modelに代入して使えるようにします。

model = VGG16(weights='imagenet')

調べたい画像を読み込みます。画像は"an.jpg"を読み込みます。画像サイズを(224, 224)に変換します。これでVGG16で認識することができるようになります。画像はColabのデータフォルダに入れておく必要があります。

img = load_img('an.jpg', target_size = (224, 224))

配列に変換、テンソルに変換

x = img_to_array(img)

x = np.expand_dims(x, axis=0)

これで準備はOK。

予測します。

preds = model.predict(preprocess_input(x))

これをわかりやすく表示できるように変換して出力します。

results = decode_predictions(preds, top=5)[0]

for result in results:
    print(result)

Colabのインスペクタのデータを保存する部分に調べたい画像ファイルに"an.jpg"というファイル名で保存してやり実行すれば

1/1 [==============================] - 0s 124ms/step
('n07753592', 'banana', 0.92156714)
('n01945685', 'slug', 0.07700058)
('n03532672', 'hook', 0.00021227507)
('n01944390', 'snail', 0.0001744318)
('n07747607', 'orange', 0.0001331388)

という感じで出力されます。この場合はunsplashよりバナナの画像をダウンロードして使ってみた結果です。92%の確率で"banana"とでてきました。正しく認識していることが確認できました。


全コードです。

from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions
from keras.utils import load_img, img_to_array
import numpy as np

model = VGG16(weights='imagenet')

img = load_img('an.jpg', target_size = (224, 224))

x = img_to_array(img)

x = np.expand_dims(x, axis=0)

# Top-5のクラスを予測する
# VGG16の1000クラスはdecode_predictions()で文字列に変換される

preds = model.predict(preprocess_input(x))

results = decode_predictions(preds, top=5)[0]

for result in results:
    print(result)

この記事が気に入ったらサポートをしてみませんか?