InceptionV3による物体認識

Raspberry Pi 深層学習ライブラリで物体認識(Keras with TensorFlow・Open CV)

を、

の作業途中の(xxx_180428_0.img)より開始する。

pythonのバージョン確認。

pi@raspberrypi:~ $ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import keras
Traceback (most recent call last):
File "", line 1, in
ImportError: No module named keras
>>> import cv2
>>> import tensorflow
Traceback (most recent call last):
File "", line 1, in
ImportError: No module named tensorflow
>>>
pi@raspberrypi:~ $ python3
Python 3.4.7 (default, Apr 21 2018, 14:20:14)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keras
Using TensorFlow backend.
>>> import cv2
>>>

Raspbianのバージョン確認。

pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.9.35-v7+ #1014 SMP Fri Jun 30 14:47:43 BST 2017 armv7l GNU/Linux

 

Python3環境は準備出来たはずなので、

TensorFlow on Raspberrry Pi3

に従って画像認識にトライしてみます。

deep-learnig-modelsをダウンロードした後は、

https://teratail.com/questions/100908

に従って、inception_v3.pyを修正します。

実行するとh5pyが無いとでますので、pip3でインストール。

pi@raspberrypi:~/deep-learning-models $ sudo pip3 install h5py

pip3でのインストールは途中で止まっている様に見えるので、心配ならば、ウィンドウをもう一つ開いてtopコマンドでプロセスを見ておくと%CPUが100.0又はそれに近い値のプロセスが走っているのが見えるので不安が減ります。COMMANDはcc1が多いですがasとかいくつかの物が走ります。

再度実行するとPILが無いと出ますので、pillowをインストール。

pi@raspberrypi:~/deep-learning-models $ sudo pip3 install pillow

こちらは時間それほど長くない。

再度実行すると、

pi@raspberrypi:~/deep-learning-models $ python3 inception_v3.py
/usr/local/lib/python3.4/importlib/_bootstrap.py:321: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
return f(*args, **kwds)
Using TensorFlow backend.
Downloading data from https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json
40960/35363 [==================================] - 0s 10us/step
Predicted: [[('n02504458', 'African_elephant', 0.58458394), ('n01871265', 'tusker', 0.35385633), ('n02504013', 'Indian_elephant', 0.01978549), ('n02134084', 'ice_bear', 0.0005529598), ('n02437312', 'Arabian_camel', 0.00053362496)]]

FutureWarningは出るが写真からの認識は出来た

→ これをinception_v3_1.pyとして保存する。

ちなみに、モデルは使う分だけ自動的にダウンロードされていて、以下に有る。

pi@raspberrypi:~/.keras/models $ ls
imagenet_class_index.json inception_v3_weights_tf_dim_ordering_tf_kernels.h5

ここから

Raspberry Pi 深層学習ライブラリで物体認識(Keras with TensorFlow・Open CV)

に戻って以下の内容でinception_v3.pyを修正する。

「画像を解析すると、「ラベル番号・ラベル名・予測値」が多次元配列で返ってくるので、326、327行目(最後の2行)を以下の様に置き換えます。

preds = model.predict(x)
recognize = decode_predictions(preds)
print('Label:', recognize[0][0][1])

これで一番予測値の高いラベルを取り出せます。」

→ 成功したのでinception_v3_2.pyとして保存する。

次にWebカメラからの画像を認識出来る様に修正。

import cv2
if __name__ == '__main__':
model = InceptionV3(include_top=True, weights='imagenet')
cam = cv2.VideoCapture(0)
while(True):
ret, frame = cam.read()
cv2.imwrite("output.png", frame)
img_path = "output.png"
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)
recognize = decode_predictions(preds)
print('Predicted:', recognize[0][0][1])
cam.release()
cv2.destroyAllWindows()

→ 成功したのでinception_v3_3.pyとして保存する。

但し、動作時のCPUはモデル生成中で25%、物体認識している時が80-100%程度で、画面生成と同時に物体認識しようとすると画面生成時にアクセス障害が出る様で、画面は動作出来ません。この時、cv2.imshowコマンド部分で以下のようなワーニングが出ています。

** (Input_Image:4723): WARNING **: Error retrieving accessibility bus address: org.freedesktop.DBus.Error.ServiceUnknown: The name org.a11y.Bus was not provided by any .service files

この状態で、一旦、imageファイルに落しておきます。(xxx_180428_1.img)

次に、上記エラー対策として、

https://www.raspberrypi.org/forums/viewtopic.php?t=196070

の内容を実施。

Warningが出なくなるだけで、cv2.imshowが表示されないのは変わらない。

Python で cv2.imshow としても画像が表示されない

によると、

すぐに終了してしまっているだけかも知れません。
その場合は waitKey などを入れる事で解決します。

と書かれています。

timeモジュールを入れて、time.sleep(1)とか入れても駄目ですが、

cv2.waitKey(x) とし、xの値を5以上にすれば表示されました。

この位置はimshowの前でも後でもどちらでも良い様です。

それとは別に、時々、

Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /home/pi/opencv/modules/highgui/src/window.cpp, line 356

とか、

libpng warning: Image width is zero in IHDR
libpng warning: Image height is zero in IHDR
libpng error: Invalid IHDR data

というエラーが出ます。

これはどうもWebCameraデバイスがオープンに失敗して入力画像が無かった時に出るみたいです。

WebCameraデバイスのがオープンした事を確認出来るまで開き続ける事でこのエラーは解消します。

→ これらを対策したinception_v3_3.pyが以下になります。

import cv2
if __name__ == '__main__':
print('<1> Start')
img_path = "output.png"
while True:
cam = cv2.VideoCapture(0) # 0 camera をVideoCaptureクラスでインスタンス化
cv2.waitKey(10)
if cam.isOpened() == 1: # cameraが接続されていたら
break # camera open 処理を抜ける
print('<3> InceptionV3 NN is creating.')
model = InceptionV3(include_top=True, weights='imagenet')
print('<4> InceptionV3 NN is created.')
while(1):
ret, frame = cam.read()
cv2.waitKey(10) # read処理待ち: min 5 ms -> now 10ms
orgHeight, orgWidth = frame.shape[:2]
h = int(orgHeight/2)
w = int(orgWidth/2)
frame2 = cv2.resize(frame,(w,h))
cv2.namedWindow('Input_Image', cv2.WINDOW_AUTOSIZE)
cv2.imshow('Input_Image', frame2)
cv2.imwrite(img_path, frame2)
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)
recognize = decode_predictions(preds)
print('Predicted:', recognize[0][0][1])
cam.release()
cv2.destroyAllWindows()

→ ここでimageファイルに落します。(xxx_180429_0.img)

遅延が大きいので、場所の特定をしてみると、

preds = model.predict(x)

の処理で10秒位の遅延が有る事が判明。これは直しようが無いが、使い方で気にならない様に出来るだろうか?

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です