ディープラーニング(深層学習)の勉強のためモデルを自作してみましたが、残念ながらうまくいきませんでした。学習済みモデルを利用するだけならなんとかできたので、その際知り得た知識をメモとして残します。
プログラム
今回作成したプログラムを下に記載します。このプログラムは与えた画像が何であるかを1000種類の中から識別するものです。
import sys
import numpy as np
from keras.preprocessing.image import load_img,img_to_array
from keras.applications.vgg16 import VGG16,preprocess_input,decode_predictions
image_data = load_img(sys.argv[1],target_size=(224,224))
array_data = img_to_array(image_data)
array_data = np.array([array_data])
array_data = preprocess_input(array_data)
model = VGG16()
results = model.predict(array_data)
print(decode_predictions(results))
プログラムの説明
Kerasには学習済みモデルをダウンロードする機能があるので、今回はそれを使い学習済みモデルVGG16をダウンロードして使用します。
- 画像を読み込む
下の部分で画像を読み込んでいます。VGG16に取り込める画像サイズは224×224のみなので、読み込みの際にリサイズしています。
image_data = load_img(sys.argv[1],target_size=(224,224))
- 画像をRGB形式に変換する
VGG16が対応しているデータ形式はRGBのため、jpeg画像などはそのままでは取り込めません。そのためimg_to_array
を使って画像をRGBの配列(224,224,3)に変換しています。また、Kerasの識別プログラムpredict
は1枚づつ識別するのではなく複数枚をまとめて識別するため入力データの形式は4階層の配列になっています。今回は1枚しか識別しない仕様なのでnp.array
を使って4階層に変換しています。
array_data = img_to_array(image_data)
array_data = np.array([array_data]) #(224,224,3) -> (1,224,224,3)
- 画像を識別する
下の部分で画像を識別しています。preprocess_input
はVGG16に入れるための前処理を行っています。VGG16()
で学習済みモデルを読み込み、predict
で識別をしています。
array_data = preprocess_input(array_data)
model = VGG16()
results = model.predict(array_data)
- 識別結果を見やすくする
predict
で識別した結果はただの数値の羅列であるため、これを見ても何に識別されたのかわかりません。そのため、文字に変換したり確率の高い順番に並べ替えたりしてから画面出力をしています。
print(decode_predictions(results))
使用方法と実行結果
下のコマンドで実行できます。(学習済みモデルを読み込むのには相当な時間がかかります。)
$ python3 vgg16.py dog.jpg #dog.jpgという画像を識別させる
...
...
[[('n02113023', 'Pembroke', 0.41220817), ('n02115641', 'dingo', 0.29989296), ('n02113186', 'Cardigan', 0.06258105), ('n02085620', 'Chihuahua', 0.048699833), ('n02094258', 'Norwich_terrier', 0.03338512)]]
結果はリスト形式で出力されます。上の例では41%の確率でpembroke
と識別されています。確率の高い順で5つまでの候補が出ています。
さいごに
ラズパイ上でリアルタイムな画像識別をしたかったのですが、ラズパイにKerasのインストールができていないので成功していません。諦めずに頑張ろうと思います。また自分で学習用データを準備したり、モデルを学習させることができるように、今後も勉強を続けます。