監視カメラの動画を物体検知する その3 動画(.AVI)からyolov3で物体検出する

はじめに

前回の記事

監視カメラの動画を物体検知する その2 anaconda+YOLOv3環境の構築
監視カメラの動画を分析するために、anacondaでYOLOv3の実行環境を構築します。1時間あればできました。

で、anaconda+yolov3の環境構築ができました
前回、画像の検出まではできることを確認しましたが、
実際には監視カメラの動画(.avi)を検出する必要があります

今回は、構築した環境を使って、動画ファイルの検出を試みます

引数で指定して実行してみる

前回クローンした、YOLOv3実装リポジトリ
https://github.com/qqwweee/keras-yolo3
のREADMEを読むと
input、output引数を指定すれば動画の input とoutputが指定できそうなので、とりあえずやってみます

anaconda powershell promptでkeras-yolov3まで移動し、
yolov3の仮想環境をactivateし、以下を実施します
(テスト用のtest.aviも同じディレクトリ直下に置いておきました)

python yolo_video.py --input test.avi

すると、

Module Not Found Error: No module named 'cv2'

のエラーが出ました
確かに、openCVはインストールしてないです
なるほど、動画だとopenCVを使うんですね(そりゃそうか)

opencvを仮想環境にインストールする

conda install -c conda-forge opencv

意外なことに、デフォルトのリポジトリではopencvはインストールできないらしい
なので-cオプションでconda-forgeを指定します

solving environment などの表示がでてしばらく待ちましたが、
5分くらいすると正常にインストールが始まりました

再度実行してみる

インストール後、再度

python yolo_video.py --input test.avi

を実行します

今度は

ImportError: DLL load failed: 指定されたモジュールが見つかりません。

です
opencvのimport時のエラーのようです

opencvのダウングレードと再々実行

調べてみると、ピンポイントな情報はなかったんですが、
opencvをダウンロードするとうまくいった、との情報を見かけたので、とりあえずやってみることにしました

バージョンもどれだと大丈夫ということもなかったので、
上手くいった方が試していた、4.0.1を指定してみることにしました
今は最新の4.5.2になっています

conda install opencv=4.0.1

またインストールに少し時間がかかりましたが、
再々実行してみます

python yolo_video.py --input test.avi

すると、、

行けました!
test.aviの動画を1フレーム毎に検出できてます!
(自宅の監視カメラ映像なので載せられません…)

ただ、私の10年物のノートPCのCPUで動かすと、
1フレーム5秒くらいかかっちゃってますね…

これをそのまま使うのは無理そうです

無料素材で試してみる

監視カメラ映像をここに載せてしまうのはまずいので、
無料素材の動画を探してみました

こちらから、日本の商店街の動画を取ってみました
これは物体検知にうってつけの動画ですね笑
https://www.motionelements.com/

登録してダウンロードし、検出してみます
(shopping-mall.mp4に名前を変えました)

python yolo_video.py --input shopping-mall.mp4 --output output.mp4

すると、
ちゃんとmp4でも行けました!
おーちゃんと検知できている!

まとめ

ここまでやったことをまとめてみます

  • AnacondaとYOLOv3実装リポジトリ https://github.com/qqwweee/keras-yolo3
    を使うと簡単に物体検知ができる環境を作れる
  • 画像(jpeg)、動画(avi、mp4)についてはオプションを変えるだけで検出できることを確認した
  • outputオプションを指定すれば保存もできる
  • ロースペックのPCだとかなり時間がかかる

実用に向けては課題多い

まだまだ実用に向けては課題があります

やりたいのは大量にある監視カメラの動画をすべて処理し、
人物が写っている動画(というより写っているフレーム)を抽出することです

そうすると、やらないといけないことが多々あります

  • 動画があるディレクトリを指定して実行
  • 処理速度の改善(例えば1秒1回の検出にしちゃうとか)
  • 人物を検出したフレームの抽出
  • 検出オブジェクトの出力(できれば)

マシンのスペックも大したことが無いのでなかなかつらいところではありますが…

これをやらないと使い物にはならないですね
このあたりはソースコードを修正していく感じでしょうか

まだまだ頑張りたいなと思います
(tensorflow苦手なんだよな…デバッグしにくいし…)

きゅうこん

きゅうこん

元メカ設計者、現なんちゃってAIエンジニア。実験データを分析しているうちにプログラミングとAIのスキルを習得(?)職業何ですか?と聞かれたときに何と答えるべきかを考える日々。 Qiita: https://qiita.com/kamome885

タイトルとURLをコピーしました