ラズパイはじめてみた(画像認識編)
ラズパイで学習済みモデルのInceptionV3を使用した画像認識を試してみました。
今回も以下のQiita記事を参考にさせていただきました。
前回まで
- ラズパイの初期セットアップ
- ラズパイへのTensorFlow, Keras, OpenCV3のインストール
環境
- 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で公開してくれているリポジトリを
下記コマンドでコピーさせてもらいます。
$ 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
画像のパスは以下のように、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%と識別されています。
色んな画像で試してみた
- Googleの企業ロゴ
結果:
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)]]
- iPhoneの写真
結果:
Predicted: [[('n03777754', 'modem', 0.2247829), ('n02992529', 'cellular_telephone', 0.0983547), ('n03584254', 'iPod', 0.09556776), ('n03492542', 'hard_disc', 0.09359463), ('n04009552', 'projector', 0.028479083)]]
「モデム」が一位の結果となってしましました。
しかし、三位に「iPod」が結果に出ています。
学習データが少し古いのかもしれません。
次回
ラズパイに接続したカメラからの画像を画像認識するようカスタマイズしてみます。