2017年12月9日土曜日

Inception-v3で画像認識

はじめに

Kerasに用意されている学習済みモデルを使って画像認識をしてみます。 利用するモデルはInception-v3です。VGG16を使う例が [1, 2] にあったので、それを参考にしました。

コード

ImageNetで学習済みの重みを自動でダウンロードしてくれるので、とても簡単に作れます。

1
2
3
4
5
6
7
8
9
10
11
12
# -*- coding: utf-8 -*-
from keras.applications.inception_v3 import InceptionV3, preprocess_input
from keras.applications.imagenet_utils import decode_predictions
from keras.preprocessing import image
import numpy as np

model = InceptionV3() # Load a model and its weights
img = image.load_img('images/jerryfish001.jpg', target_size=(299, 299))
x = image.img_to_array(img) # x.shape=(299, 299, 3)
x = np.expand_dims(x, axis=0) # Add an axis of batch-size. x.shape=(1, 299, 299, 3)
r = model.predict(preprocess_input(x)) # r has the probabilities for all classes
print(decode_predictions(r)) # Show the labels of the top-5 classes

結果

例として入力したimages/jerryfish001.jpg はこんな画像です(CC0(パブリックドメイン)で公開されていたものを利用)。

認識結果は、
[[('n01910747', 'jellyfish', 0.97032261),
  ('n04330267', 'stove', 0.00067266426),
  ('n03729826', 'matchstick', 0.00045158088),
  ('n01914609', 'sea_anemone', 0.00038042956),
 ('n01930112', 'nematode', 0.00034168496)]]
となりました(改行をいれて見やすくしています)。1列目がクラスのラベル、2列目がクラスの説明(人が読んで分かる名前)、3列目が事後確率です。この場合、事後確率97.03%でクラゲだと出力されています。正解ですね。

参考

[1] https://qiita.com/agumon/items/91f897b7f260f6aeca95
[2] http://aidiary.hatenablog.com/entry/20170104/1483535144

0 件のコメント :