MacでもRaspberry PiでもTensorFlow + Kerasで楽々画像認識

f:id:karaage:20170927010753p:plain:w640

TensorFlow + Kerasが便利

 ディープラーニングをするとき、TensorFlowと合わせて使うと便利で有名なのがKerasというライブラリです。Kerasの使い方に関しては、ほけきよ(id:imslotterさん)の以下記事が非常に参考になります。

 なので、基本的なことは上記記事を読んでもらうとして(激しい手抜き)、今回は、手っ取り早くKerasを使うとMacやRaspberry Piで画像認識がどれだけ簡単にできてしまうのかということを紹介してみたいと思います。

MacでTensorFlow + Kerasを使った画像認識

環境設定

 必要なライブラリは以下です。

  • Python3(Anagonda3)
  • TensorFlow 1.4.0
  • Keras 2.1.2
  • opencv-python 3.3.0.10

 Python2でも出来た記憶がありますが、以下でh5pyをインストールしないといけないかもしれません。

$ pip install h5py

 セットアップ自体は、以下記事を参照ください。

静止画の画像認識

 今回は、Kerasに含まれているInception V3というgoogleの有名なディープラーニングのモデルを使って画像認識してみたいと思います。

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

model = InceptionV3(weights='imagenet')
img_path = 'test.jpg'
img = image.load_img(img_path, target_size=(299, 299))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

preds = model.predict(x)

print('Predicted:')
for p in decode_predictions(preds, top=5)[0]:
    print("Score {}, Label {}".format(p[2], p[1]))

 これで、例えばtest.jpgという名前で画像を保存して、同じディレクトリで上記のスクリプトを実行すると、画像認識の答えがターミナルに非常されます。めちゃめちゃ簡単ですね。

 なおKerasでモデルがどこに保存されているかは、以下のプログラムをみるとわかります。

keras/data_utils.py at master · keras-team/keras · GitHub

 具体的には~/.keras/models/ですね。

カメラ画像からの画像認識

 単純に静止画を認識させるのもおもしろくないので、カメラ画像を使って動的に認識させてみます。基本は先ほどのプログラムを少し弄って、動画に対応しただけです。GitHubにコードアップしたので、環境設定して以下3行実行すれば、Mac内蔵のカメラで画像認識が始まります。

$ git clone https://github.com/karaage0703/tensorflow-pi
$ cd tensorflow-pi
$ python inspect_camera.py 

 実行結果は以下のような感じです。

f:id:karaage:20170927010926g:plain:w640

Raspberry PiでTensorFlow + Kerasを使った画像認識

 Raspberry PiでのTensorFlowの環境は以下記事を参考にセットアップ下さい。

 後は、以下コマンド3行実行したらOKです。

$ git clone https://github.com/karaage0703/tensorflow-pi
$ cd tensorflow-pi
$ python inspect_camera_pi.py 

 Raspberry Piでも以下のように、実行結果が表示されます。

<open file '/tmp/data.jpg', mode 'wb' at 0x665b2c80>
Predicted:
Score 0.164481237531, Label computer_keyboard
Score 0.159395217896, Label laptop
Score 0.129113510251, Label space_bar
Score 0.125562995672, Label mouse
Score 0.117293052375, Label notebook

 認識時間は数秒程度でした。もっと1秒以下でリアルタイムに認識したい場合は、Intel Movidiusなどを使う必要がありそうですね(まだ私は試せていないです)。

 認識結果を音声や、以下のようなディスプレイで表示すると、それっぽいデモはできそうですね。

転移学習(ファインチューニング)

 Kerasだと転移学習も簡単にできそうです。以下記事を参考にすると、できそうな気がするので試したいことが出てきたら、転移学習もやってみたいなと思います。

まとめ

 TensorFlow + Kerasで遊んでみました。実は3ヶ月前くらいに試していたのですが、それっきりになってしまっていたので一度備忘録代わりに記事にしておきました。

 Kerasは簡単に色々なことができますし、公開されている実装例も豊富です。一度試してそれっきりにするにはもったいないので、今後色々試してみようかなと思っています。以下の記事で紹介している、ディープラーニングのブームの火付け役でもあるヒントン先生が新たに提唱している「カプセルネットワーク」のKeras実装とかも勉強になりそうですね。

参考リンク

ML Engineでサーバーレス転移学習

ディープラーニング実践入門 〜 Kerasライブラリで画像認識をはじめよう! - エンジニアHub|若手Webエンジニアのキャリアを考える!

Kerasで画像分類を実装する時の参考資料

Kerasでウェブカメラから顔領域を検出し、年齢・性別を推定する

関連記事