オリジナルの写真を作成したCNNモデルで判定

f:id:hanamichi_sukusuku:20210302165245p:plain

実行結果

f:id:hanamichi_sukusuku:20210302165325p:plain

上手く出力できた。

 

プログラムを見ていく。

 

必要な変数の定義

im_rows = 32 # 画像の縦ピクセルサイズ
im_cols = 32 # 画像の横ピクセルサイズ
im_color = 3 # 画像の色空間
in_shape = (im_rows, im_cols, im_color)
nb_classes = 3

LABELS = ["寿司", "サラダ", "麻婆豆腐"]
CALORIES = [588, 118, 648]

im_rows、im_clos、im_colorには使用する画像の情報を定義。

in_shapeには入力層で使用する入力を定義。

今回使用するラベルデータは0,1,2の順番で寿司、サラダ、麻婆豆腐なのでLABELSにはその順番になる様に定義。

 

保存したCNNモデルの読み込み

model = cnn_model.get_model(in_shape, nb_classes)
model.load_weights('./image/photos-model.hdf5')

hanamichi-sukusuku.hatenablog.com

cnn_modelは上記リンクで作成したCNNのモデルを構築するための関数を使用するために冒頭でインポートしている。cnn_model.pyのget_model()関数に入力値、出力値を引数に渡すことでCNNモデルを返り値として受け取ることができる。

hanamichi-sukusuku.hatenablog.com

model.load_weightsで上記で作成した重みデータを取得。

 

テストしたい画像で関数の実行

if __name__ == '__main__':
 check_photo_str('test-sushi.jpg')
 check_photo_str('test-salad.jpg')

 

check_photo_str()関数

f:id:hanamichi_sukusuku:20210302170944p:plain

この関数ではcheck_photo()関数に画像のパスを渡して返り値として最も確率の高いラベルデータ(idx)とその確率(per)を取得して、モデルの予測結果がどの料理を指しているのかとカロリー数、確率を出力している。

 

check_photo()関数、テスト画像を予測し、呼び出し元に結果を返す

f:id:hanamichi_sukusuku:20210302171611p:plain

Image.open()でPillowを使用して画像を読み込む。

生成したImgaeオブジェクトをconvertで色空間変換。

resize()でサイズ変更。

plt.imshow()でプロットに描画、plt.show()で表示。

 

モデルで使用できる様に、画像データをnumpy形式に変換、三次元配列に変換、255で割ることで0.0~1.0で表現できる様に変換。

model.predict()で変換したデータの結果を予測。

argmax()で予測結果から最も値の大きいインデックス番号を出力。

int()では引数に渡した値を整数に変換して出力する。