はじめに
前回の記事
で、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苦手なんだよな…デバッグしにくいし…)