目的
前回、darknet_rosをインストールしてROS上でyoloを使用してみました。
今度は動画を読みこませたいと思います。
なぜかというと、物体認識をする現場にいるわけじゃないので、
現場で動画を撮影してきてテストしたいと思い…
本家のyolov3は静止画かwebカメラにしか対応していないので、
撮影した動画にたいして物体認識できるようにkeras-yoloをインストールします。
そしてyolov3で学習させた自前のデータを使って認識してみます
環境
ubuntu16.04
Nvidia 384.183
CUDA 9.0
python2.7.12
python3.5.2
必要なもの
TensorFlow-gpu
Keras
Keras版YOLOv3
TensorFlowのインストール
python3系を使っていくので、pip3でpython3にインストールします。
またデフォルトはpython2.7のため、pythonを実行するときにはpython3と指定していきます。
sudo pip3 install tensorflow-gpu
Kerasのインストール
sudo pip3 install keras
Keras版yoloのインストール
git clone https://github.com/qqwweee/keras-yolo3.git
自前データのコピー&変換
今回私は自前データを使いたいと思いますので、
darknetで学習とテストをするときに作成した以下のファイルをさっきcloneしてきたkeras-yolo3フォルダの直下に置きます。
piyopiyo_test.cfg
piyopiyo.weights
さらに、自前の学習データのclasses.txtをmodel_data/以下に置きます。
そして重みをkeras用に変換します。
cd keras-yolo3
python3 convert.py piyopiyo_test.cfg piyopiyo.weights model_data/piyopiyo.h5
yolo.pyを修正
class YOLO(object):
_defaults = {
"model_path": 'model_data/piyopiyo.h5', #ココ
"anchors_path": 'model_data/yolo_anchors.txt',#ココは変えなくてもうまくいきました。何かよくわからん。
"classes_path": 'model_data/classes.txt', #ココ
"score" : 0.3,
"iou" : 0.45,
"model_image_size" : (416, 416),
"gpu_num" : 0,
}
anchorって何なんだろう…と調べてみたら、bouding boxのアスペクト比のことみたいです。
何種類か定義されているので探索に使う時のって意味なのでしょうか…
これを変えるとうまくいかなかった、という記事もあったりしたのでデフォルトのまま使うことにします。
実行
画像の場合は
python3 yolo_video.py --image
動画の場合は
python3 yolo_video.py --input hogeohoge.MOV
画像の場合は後でInput image filenameを求められます。
しかしエラーが…
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type
なぜかrosのpython2.7からcv2を探していて、opencvがimportできていない模様
解決策
https://qiita.com/ReoNagai/items/112c3a8b6cd55c3e5380
神のような記事!!ありがとうございます
python3
import sys
print(sys.path)
を実行すると
['', '/home/nvidia/catkin_ws/devel/lib/python2.7/dist-packages', '/opt/ros/kinetic/lib/python2.7/dist-packages', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-aarch64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages', '/usr/local/lib/python3.5/dist-packages/IPython/extensions', '/home/nvidia/.ipython', '../']
のように追加されているパスが出力される。
よく見ると、その中に
'/opt/ros/kinetic/lib/python2.7/dist-packages'
が含まれていることが分かる
こいつが邪魔をしてOpenCVをimportできなくしているので、消してやれば良い
具体的には
sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')
と、いうことでyolo_video.pyの上らへんにsys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')
を追記。
そしたら無事に動きました!
おわり
無事keras版yoloを実行できましたがモッサリしてました。
これなら動画をディスプレイに写して本家YOLOのdemoで認識させてもいいかもしれません。
参考サイト
ubuntu16.04に tensorflow, keras のインストール
https://qiita.com/konosuke-k/items/5adeb9f38ce6f579ed91
keras版yoloのインストール
https://qiita.com/yokoponzoo/items/64137ef45208b12ce501
rosによるcv2のimportエラー
https://qiita.com/ReoNagai/items/112c3a8b6cd55c3e5380