Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

ubuntu16.04でkeras-yoloを使用し動画を読み込む

目的

前回、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
神のような記事!!ありがとうございます:bow:

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

okubo999
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away