チノカログ

ITインフラ系、ガジェット系、テック系ネタ

ラズパイはじめてみた(画像認識編)

f:id:chinoka:20190121183443j:plain ラズパイで学習済みモデルのInceptionV3を使用した画像認識を試してみました。

今回も以下のQiita記事を参考にさせていただきました。

qiita.com

前回まで

  • ラズパイの初期セットアップ

chinokalog.hatenablog.com

  • ラズパイへのTensorFlow, Keras, OpenCV3のインストール

chinokalog.hatenablog.com

環境

  • HW: Raspberry Pi3 Model B
  • OS: Raspbian GNU/Linux 9.6 (stretch)
  • TensorFlow 1.11.0
  • Keras 2.2.4
  • OpenCV 3.4.5

InceptionV3のセットアップ

メイン開発者のFrançois CholletさんがGithubで公開してくれているリポジトリ
下記コマンドでコピーさせてもらいます。

GitHub - fchollet/deep-learning-models: Keras code and weights files for popular deep learning models.

$ git clone https://github.com/fchollet/deep-learning-models.git

すると、inception_v3.pyなどのソースがダウンロードされます。

$ ls deep-learning-models/
LICENSE  README.md  audio_conv_utils.py  imagenet_utils.py  inception_resnet_v2.py  inception_v3.py  mobilenet.py  music_tagger_crnn.py  resnet50.py  vgg16.py  vgg19.py  xception.py

InceptionV3の実行

まずはお試し実行してみます。 以下のような象の画像をダウンロードしてきて、
deep-learning-modelsディレクトリ配下に配置します。
elephant.jpg f:id:chinoka:20190121183447j:plain

画像のパスは以下のように、inception_v3.pyの401行目で指定します。

img_path = 'elephant.jpg'

以下のコマンドでinception_v3.pyを実行してみます。

$ cd deep-learning-models
$ python3 inception_v3.py

しかし、私の環境では、以下のエラーが発生してしまいました。

Traceback (most recent call last):
  File "inception_v3.py", line 35, in <module>
    from keras.applications.imagenet_utils import _obtain_input_shape
ImportError: cannot import name '_obtain_input_shape'

ググると以下が解決策のようです。

ImportError: cannot import name '_obtain_input_shape' from keras - Stack Overflow

今回使用しているKerasバージョンでは、
_obtain_input_shapeメソッドが存在するモジュールの場所が
keras.applications.imagenet_utilsではなく、keras_applications.imagenet_utilsとのこと。

inception_v3.pyの35行目を

from keras.applications.imagenet_utils import _obtain_input_shape

から

from keras_applications.imagenet_utils import _obtain_input_shape

のように変更します。

これで、再トライしてみましたが、 以下のような別のエラーが発生してしまいます。

Traceback (most recent call last):
  File "inception_v3.py", line 399, in <module>
    model = InceptionV3(include_top=True, weights='imagenet')
  File "inception_v3.py", line 157, in InceptionV3
    include_top=include_top)
TypeError: _obtain_input_shape() got an unexpected keyword argument 'include_top'

これもググって以下の解決策を見つけました。

deep-learning-models/vgg16.py · Issue #72 · fchollet/deep-learning-models · GitHub

これも先ほどのエラーと同様、バージョン問題のようです。

inception_v3.pyの157行目を

include_top=include_top

から

require_flatten=include_top

のように変更します。

これで再トライしてみます。結果は以下の通り。

$ python3 inception_v3.py
Using TensorFlow backend.
Predicted: [[('n02504458', 'African_elephant', 0.58458394), ('n01871265', 'tusker', 0.35385597), ('n02504013', 'Indian_elephant', 0.019785529), ('n02134084', 'ice_bear', 0.0005529625), ('n02437312', 'Arabian_camel', 0.0005336265)]]

はい!上手く動いてくれました。
検索結果の上位5つが表示されます。
先の結果では、アフリカゾウが58%と識別されています。

色んな画像で試してみた

結果:

Predicted: [[('n06359193', 'web_site', 0.29466203), ('n04357314', 'sunscreen', 0.10376096), ('n02786058', 'Band_Aid', 0.094216876), ('n04409515', 'tennis_ball', 0.032996662), ('n04127249', 'safety_pin', 0.023215853)]]

結果:

Predicted: [[('n03777754', 'modem', 0.2247829), ('n02992529', 'cellular_telephone', 0.0983547), ('n03584254', 'iPod', 0.09556776), ('n03492542', 'hard_disc', 0.09359463), ('n04009552', 'projector', 0.028479083)]]

「モデム」が一位の結果となってしましました。
しかし、三位に「iPod」が結果に出ています。
学習データが少し古いのかもしれません。

次回

ラズパイに接続したカメラからの画像を画像認識するようカスタマイズしてみます。