学習済みディープラーニングモデルを使って画像分類する方法【TensorFlow/VGG16】

学習済みディープラーニングモデルを使って画像分類する方法【TensorFlow/VGG16】

こんにちは、えびかずきです!

今回は学習済みのディープラーニングモデルを使って、画像分類を試してみたいと思います。

難易度の高い学習のプロセスを飛ばして、簡単にディープラーニングの威力を感じてみましょう。

何を使うか?

今回はKeras (ケラス)という深層学習ライブラリ(Tensorflowから利用可)のVGG16という学習済みのディープラーニングモデルを使用します。

猫や犬などの動物を初めとして、風船、バナナ、ギター、など身近な物体を全1000クラスに分類できるよう学習させたCNN(畳み込みニューラルネットワーク)モデルです。

VGG16のクラス分類に関する参考サイト

実際にどんなクラス分類があるかは、web上を探してみたところ下記サイトなどにまとめられていました。

VGG16分類ラベル
分類ラベルのCSVファイル

開発環境

OS:MacOS Catalina 10.15.2
言語:Python3.5.4
開発ツール:jupyter notebook
ライブラリ:
tensorflow 1.5.0
pillow 5.0.0(tensorflowが内部で利用)
numpy 1.17.4

画像分類プログラムの作成

何を試すか?

今回は当サイト「エビワークス」に関連して、

ディープラーニングでオマール海老と伊勢海老を判別できるか?

ということをチャレンジしてみたいと思います。(笑)

以下が使用する画像です。

→オマール海老はハンマーの様な大きなハサミが特徴。
正しく分類できれば、VGG16の画像分類で”American_lobster”という結果が出力されるはず。

→伊勢海老はハサミを持たない代わりに大きな触覚があることが特徴。
正しく分類できれば、VGG16の画像分類で”spiny_lobster”という結果が出力されるはず。

えびかずき
えびかずき
人間が見れば一目瞭然ですが、ディープラーニングにこの違いを見分けることはできるでしょうか!?

分類プログラム(Python)

Pythonでプログラムを実装します。

作成したプログラムは以下の通りです。

※下記プログラムは複数画像を一気テストする仕様になっています。
1枚の画像で簡単に試してみたいという方は、おまけの欄にコードを添付しましたので、そちらをご利用ください。

#使用するライブラリとメソッドをインポートしておく
from tensorflow.python.keras.applications.vgg16 import VGG16,preprocess_input,decode_predictions
from tensorflow.python.keras.preprocessing.image import load_img,img_to_array
import numpy as np

#リスト定義
test_omar=[]
test_ise=[]

#画像をロードする
#VGG16の入力サイズに合わせて224 x 224に変更する
#数値データとして扱うためにnumpy.ndarrayに変換する
#preprocess_inputで画像をVGG16モデルに適用させる
for i in range(3):
    test_omar.append(preprocess_input(img_to_array(load_img('omar-'+str(i)+'.jpg', target_size=(224, 224)))))
    test_ise.append(preprocess_input(img_to_array(load_img('ise-'+str(i)+'.jpg', target_size=(224, 224)))))
    
#予測値(確率)を算出
#複数画像を入力できる形式に変換してから入力する
probs_omar = VGG16().predict(np.stack(test_omar))
probs_ise = VGG16().predict(np.stack(test_ise))

#decode_predictions()を使って最も確率の高い分類を抽出
results_omar = decode_predictions(probs_omar)
results_ise = decode_predictions(probs_ise)

#結果を表示
for i in range(3):
    print('result_omar-'+str(i)+'=',results_omar[i][0])
for i in range(3):
    print('result_ise-'+str(i)+'=',results_ise[i][0])

※実際にご自分で試してみる場合は事前に開発環境欄に示したライブラリをインストールしておいてください。

※画像ファイルの名前の部分については実際に使用するファイル名に書き換えてください。

画像分類の結果

オマール海老(American_lobster)の結果
result_omar-0= (‘n01983481’, ‘American_lobster‘, 0.5017518)
result_omar-1= (‘n01770393’, ‘scorpion‘, 0.7534477)
result_omar-2= (‘n01985128’, ‘crayfish‘, 0.591605)
伊勢海老(spiny_lobster)の結果
result_ise-0= (‘n01984695’, ‘spiny_lobster‘, 0.97957957)
result_ise-1= (‘n01984695’, ‘spiny_lobster‘, 0.9989046)
result_ise-2= (‘n01984695’, ‘spiny_lobster‘, 0.9897885)

伊勢海老の画像についてはなんと全て正解でした!

一方でオマール海老については、3枚中1枚しか正解できませんでした。

不正解の2枚については”scorpion(サソリ)”と”crayfish(ザリガニ)”ということでした。

人間から見れば”サソリ”は流石に違うだろうと思いますが、”ザリガニ”はたしかに特徴が似ているし間違えてもしょうがないかなという印象です。

まとめ

今回はVGG16というCNN学習済みモデルを使用して、オマール海老と伊勢海老の画像分類にチャレンジしてみました。

結果はトータルで6枚中4枚とまずまずの結果では無いでしょうか?

今回の例のように学習済みのモデルを使用すれば簡単にディープラーニングの威力を体感することができますので、皆さんもいろいろ遊んでみては如何でしょうか?

おまけとしてもう少し遊んでみた結果を付け足しておきました↓

おまけ

その他の画像についても、お試しでテストをしてみました。

今回は以下に示した1枚の画像でテストするプログラムを作成して実行してみます。

#1枚の画像でテストするプログラム
from tensorflow.python.keras.applications.vgg16 import VGG16,preprocess_input,decode_predictions
from tensorflow.python.keras.preprocessing.image import load_img,img_to_array
import numpy as np

test=[]

test.append(preprocess_input(img_to_array(load_img('画像ファイル名.jpg', target_size=(224, 224)))))

prob = VGG16().predict(np.stack(test))

result = decode_predictions(prob)

print('result=',result[0][0])

蟹(のモニュメント)の画像

某有名かに料理屋のモニュメントでテストしてみました。

結果:
result= (‘n01981276’, ‘king_crab‘, 0.59814286)

結果は、”king_crab”ということで、正しい結果が得られました!

当サイトのアイコン画像

ebi-icon

当サイトのアイコン画像である海老のイラストだとどうなるでしょうか?

結果:
result= (‘n02799071’, ‘baseball‘, 0.14682645)

”baseball(ベースボール)”www

どこが?笑

どうもイラストでは正しい分類ができない様です。笑

参考資料

今回のプログラム作成には、以下の書籍を参考にさせていただきました。

TensorFlow開発入門 Kerasによる深層学習モデル構築手法(2018,翔泳社)

機械学習カテゴリの最新記事