intellista

engineer's notes about application development, data analysis, and so on

Kerasの学習済モデルでミニマムコードによる画像分類を試す!


こんにちは!

G検定は取得したものの、依然として機械学習ディープラーニングの実装イメージがわかないのが悩みの種です。
「いろいろなモデルはあるけれど、実際に使うにはどうすれば?」
本当にもどかしいです。

また、インターネットには「いきなり応用編!」といった実装があふれていて、「まず、どうすれば?」といったステップアップが難しいように見えます。
実際、私は人に教えてもらって「なるほど」と実感しました。
実感するとともに、「こんなに入り口が簡単なら、すぐに入れたらいいのに。」とも思いました。

いまPythonでは、かなり簡単に先人のモデルを使えます。
「Keras」といった定番ライブラリを使うことで、誰でも簡単に、その恩恵を受けられます。

そこで、今回はKerasを使った最低限のコードディープラーニングを実装してみようと思います。

前提条件

本記事の前提スキルや環境は次のとおりです。

今回の記事では、とても有名なディープラーニングのモデルで、画像分類を実装します。
モデルは、既に誰でも自由に使えるようになっている学習済のものを利用します。

なお、以降の実装で識別させる画像は、下記の画像を使っています。
ブロッコリー
こちらは「ぱくたそ」というフリー画像提供サイト様のものです。
利用規約上は大丈夫そうでしたが、もしそぐわないようでしたら速攻で見直します!

実装

それでは2つほど実装してみます。

VGG16

ImageNet画像セットで学習済のモデル「VGG16」を使って、ブロッコリーか当ててもらいます!

from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions
from keras.preprocessing import image
from google.colab import drive
import numpy as np

# (1) read an input-data
drive.mount('/content/drive')
pixel = 224 # input image size defined by the model you use
img = image.load_img(
    "/content/drive/MyDrive/colab/data/0I9A2143.jpg", # input-image
    target_size=(pixel, pixel)
)

# (2) preprocess the input-data
data = image.img_to_array(img)
data = np.expand_dims(data, axis=0)
data = preprocess_input(data)

# (3) load a trained model
model = VGG16(weights='imagenet')

# (4) predict by the model
preds = model.predict(data)

# (5) show the result predicted by the model
results = decode_predictions(preds, top=10)[0]
for result in results:
    print(result)


結果、次のように「ブロッコリー98.9%」となりました!

('n07714990', 'broccoli', 0.9893301)
('n07714571', 'head_cabbage', 0.004693658)
('n07715103', 'cauliflower', 0.0025434813)
('n07716358', 'zucchini', 0.0012233483)
('n07718472', 'cucumber', 0.00050261203)
('n07745940', 'strawberry', 0.00016703807)
('n03991062', 'pot', 0.00016021698)
('n04522168', 'vase', 7.7303834e-05)
('n03786901', 'mortar', 7.203448e-05)
('n07711569', 'mashed_potato', 6.9734306e-05)

結果はともあれ、実装が恐ろしく簡単すぎるのが実感頂ければ嬉しいです。

InceptionV3

次は「InceptionV3」です。
こちらもImageNet画像セットで学習済のモデルです。

from keras.applications.inception_v3 import InceptionV3, preprocess_input, decode_predictions
from keras.preprocessing import image
from google.colab import drive
import numpy as np

# (1) read an input-data
drive.mount('/content/drive')
pixel = 299 # input image size defined by the model you use
img = image.load_img(
    "/content/drive/MyDrive/colab/data/0I9A2143.jpg", # input-image
    target_size=(pixel, pixel)
)

# (2) preprocess the input-data
data = image.img_to_array(img)
data = np.expand_dims(data, axis=0)
data = preprocess_input(data)

# (3) load a trained model
model = InceptionV3(weights='imagenet')

# (4) predict by the model
preds = model.predict(data)

# (5) show the result predicted by the model
results = decode_predictions(preds, top=10)[0]
for result in results:
    print(result)

VGG16と入力画像サイズが異なる点にご注意ください。
(前者は224、後者は229)

判定させた結果、次のように「ブロッコリー99.8%」と、VGG16を上回る結果となりました!

('n07714990', 'broccoli', 0.9984909)
('n07715103', 'cauliflower', 6.828501e-05)
('n01755581', 'diamondback', 6.221953e-05)
('n02894605', 'breakwater', 2.1083079e-05)
('n07871810', 'meat_loaf', 1.4795806e-05)
('n04326547', 'stone_wall', 1.4509934e-05)
('n01775062', 'wolf_spider', 1.22000065e-05)
('n04596742', 'wok', 8.753435e-06)
('n02172182', 'dung_beetle', 8.67305e-06)
('n04522168', 'vase', 8.660824e-06)

こんなに簡単にディープラーニングのモデルを切り替えられるんです。

まとめ

今回はKerasを使い最低限のコードディープラーニングを実装ました。
ディープラーニングというと、私も何だか得体の知れないような複雑な実装が必要なイメージがありました。
しかし実際はそんなこともなく、用意されているクラスなり関数なりで、簡単に利用できることを知りました。
皆さんも気後れせず、是非どんどん利用してみてください!

なお、機械学習ディープラーニングデファクトスタンダードのひとつとなっている技術にPythonがあります。
Python、Pandas、データ分析、に関するコツなどを次の記事にまとめてありますので、是非読んでみてください!
intellista.hatenablog.com