#サマリー
・撮影済みビデオを自動解析して交通量調査するソフトを作った話。
・サンプル動画はこちら https://youtu.be/TF_VtJ-XNg4
・物体検出はYolo V3を使用。SSDはあきらめた。
・物体検出よりトラッキングで苦労した。
・アメリカンな車両分類(クラス)は使えないのでAutoML Vision使った。
・車間距離とか苦労していろいろ機能追加した。
トップ画像では「taxi」としてタクシーを検知しているのがちょっと自慢。
#自己紹介
株式会社コンピュータビジョンの中の人です。ドメインが空いてたので、うっかり取ってしまいました。Mask R-CNNやYOLO V3とかを使ってますが、ディープラーニング技術そのものより「ディープラーニングを使って何ができるか?」に興味があります。ちなみに今回が初投稿なので、不備があったらすいません…。
#本編
##開発の動機と苦労した点
交通量調査がいまだに人力でやっているのを知り、「機械学習を使えば自動で出来るんじゃない?」と思いついて作ってみました。そしたらとても苦労しました。
苦労したのは、以下の点です。
###1)リアルタイム処理はムリ
最初、高速な物体検出で有名なSSDを試してみたけど、検出タイミングが遅かった。そこでYOLO V3に切り替えたけど、1フレーム当たり0.3秒ほどかかる(フルHD映像で)。映像サイズをVGAとかにすれば処理が早くなるけど、今度は映像品質が悪くなる。仕方がないのでフルHDムービーの処理を念頭に、リアルタイム処理はあきらめた。ちなみにGPUはGTX1080の1枚差しです。
追記:SSDを試してあきらめた記事はこちら
https://qiita.com/ComputerVision/items/0f87b35f5941b7c3c06b
###2)トラッキングが重要だった
YOLO V3は静止画単位での物体検出でありトラッキングしてくれるわけではない。
要するに「ここにバスやトラックが映ってますよ」と教えてくれるのだが、「バスやトラックを画面から消えるまで追っかけますよ」ということはしてくれない。
そこで検出した車両をトラッキングするために、カルマンフィルタを使った。ただこれで万事解決ではなかった。パラメータを使いこなせてない気もするが、とにかくロストする・多重カウントする。IDを振っても、車が重なるとすぐにロストする。うーん、自動車はリニアにしか動かないから楽だと思ったのに…誤算。仕方がないので、色々自分で工夫して多重カウントのノイズ除去や、トラッキングロストしたものを復活させるアルゴリズムを組み込んだ。とても苦労した。
###3)日本独自の車両の分類
YOLO V3はcar,truck,bus,motorbikeなどを検出してクラス分けしてくれる。ところが国土交通省が行う交通量調査では、大型・小型の2分類か普通車・小型貨物・大型貨物・バス(+自動二輪)の4分類がほとんど。要するに「軽トラ」がないんですね、YOLO V3には。アメリカに軽トラがあるわけないので仕方ないです。
YOLO V3の学習モデルに小型貨物を転移学習させてやろうか?とも考えたけど、「β版が始まったAutoML Vision使えばもっと楽に分類できるんじゃない?ラーメンだって分類できるんだし!」と思って、AutoML Visionを使ってみた。要するに、YOLO V3が検出した車両をAutoML Visionで再認識して最終クラスを決定する力技ですね。
AutoML Visionを使った理由は、学習がメチャ速くて楽そうだったから。実際、無料版で20~30分ほどである程度の結果が出る。普通車とタクシーも見分けることができてスゴイ!ただし軽トラは画像が足りず、認識精度が良くなかった(ガッカリ)。あと調子に乗ってミニバンとか認識させようとしたけど、これはダメだった。AutoML Visionはもう少し触ってみて、また別の記事で書きます。
ちなみに現在はまだβ版サービスだからかもしれないけど、AutoML Visionは処理が遅いです。
最初のコネクトに45秒ぐらいかかり、車一台画像認識するのに各々0.5秒前後かかる感じ。映像のフレーム毎にAutoML Vision呼び出してたら絶望的に遅くなるので、映像内に登場した車両IDごとにまとめて処理しているのだけど、もっと早く画像認識できないと実務では使えないかも?まあ今回はリアルタイム処理はあきらめてるから良いのですが。ただ1時間のムービーに車が1000台とか普通だからね。もちろん送信している画像はYOLO V3の枠内程度のサイズしかないので、そんなに大きなものではない…はず。
###4)車間距離算出機能とか
YOLO V3を使って分かることは、「現在の画像内には車が何台あります」ということ。交通量調査とはちょっと違う。少なくとも「この車線には何台います」とかくらいは分からないと困る。そこで人工知能をチョイと使って、車線の自動判別を…と思ったけどこれが超難しい(私にとっては)、というかできる気がしない。真上から道路を撮影しているならともかく、歩道橋程度からの高さの撮影で大型車両が被りまくる複数車線での車線判別自動処理はあきらめました(こんな方法があるよ!というアドバイスお待ちしております)。
そこでシンプルにマスク画像を使って、車線を区別するようにしました。バウンディングボックスの中心点を取って、そこが何色のマスクにいるかを判定している感じです。ただこのマスク使うことで、またままた処理速度が落ちたんだけどね…。
それはともかく、走行車線が取れたので2断面通過の時間(正確にはフレーム数)から速度を算出し、前方車との車間距離を算出しています。2断面の距離は道路の矢印などのマークから設定しています。知ってました?国道では白線は6mで間隔が9m、「まっすぐ」とかの矢印は長さが5mなのだそうです。
##終わりに
YOLO V3の技術的な解説や使い方の記事はいろいろ見かけるけど、実際にそれを使う時にどんな苦労があったか?という記事は少ない気がしたので、基本設計的な視点からまとめてみました。皆様の開発の役に立つようであれば幸いです。また今後はそれぞれのトピックについて、もう少し掘り下げた記事を書いてみたいと思います。
最後まで読んでいただき、ありがとうございました。
#関連記事
・[ディープラーニングで故障車両を発見するのに苦労した]
(https://qiita.com/ComputerVision/items/4f377bc3eb5e601676ac)
・[ディープラーニングで映像から速度を正確に算出するのに苦労した]
(https://qiita.com/ComputerVision/items/d5358632209c67dab325)
・[ディープラーニングによる映像解析で車両をトラッキングするのに苦労した]
(https://qiita.com/ComputerVision/items/d865f084c98a59349910)
・[ディープラーニングで交通量調査の映像解析精度を上げるのに苦労した]
(https://qiita.com/ComputerVision/items/2b5e8ed97610085a20c2)
・[SSD_KerasをWindowsで使って交通量調査できるか試してみた]
(https://qiita.com/ComputerVision/items/0f87b35f5941b7c3c06b)