こんにちは。
先日、YOLOv5の使い方を確認しました。
今度はこのモデルを使って、当初の目的である交通量調査を行いたいと思います。
こんな感じになります。
将来的にはリアルタイムで交通量をモニタしたいのですが、まずはコンセプト検証ということで録画したビデオ映像に対して交通量調査機能を実装していこうと思います。
そこで、まずはカメラの出番です。
結構昔のモデルにはなってしまいますがGoPro Hero3になります。
バッテリーは死んでいたのですが、互換品購入してバッテリー入れ替えたら時間的には十分な時間録画できそうです。
Amazon | Smatree GoPro Hero3 用1290mAhバッテリー2個 充電器とUSBコード付き CHDHX-301-JP | カメラ用アクセサリキット 通販
ベランダのへりに固定したら動画を撮影します。
約1時間の動画が撮影できました。
以下がその一部になります。
この動画に対してYOLOv5の物体検出モデルを使って交通量をカウントしていきます。
まず手始めに動画に対して車として認識されたものを四角で囲ってみます。
確度(その物体の確からしさ)が高いものは青色、低いものは緑色で囲うようにしています。
白いガードレールを誤検出してしまっていますね。
確かに白いハイエースに見えないこともない?
次に物体をトラッキングしていきます。
交通量をカウントするためには検出した物体がどのように移動していくのかをトラッキングしていく必要があります。
カルマンフィルタを使って確率論的に処理したり、検出したオブジェクトの特徴量から同じ物体をトラッキングしたりと様々な手法があるようですが、とりあえず思い付きで作ってみました。
トラッキングに必要な工程としては以下になります。
1.オブジェクトの新規生成
2.オブジェクトの移動
3.オブジェクトの消失
となります。
今回はざっくりいうと、
1.オブジェクトの新規生成は今まで何も近傍にオブジェクトがなかったところにオブジェクトが生成された場合に新規オブジェクトとしてID付与。
2.検出中心の近傍にオブジェクトがあった場合はそのオブジェクトが移動したものとしてIDを継承。
3.オブジェクトの近傍に検出が無い場合はオブジェクトが消失したものとする
といった方式です。
このベースに加えて、新規生成場所や消失場所を制限させたり、近傍の定義を左右に長くする(道路的に上下の移動はほとんどない)等でトラッキングしやすいようにしています。
とりあえず、作ってみます。
オブジェクト一つ一つに固有の番号(ID)を付与して表示してみます。
オブジェクトの消失がうまくいかなかったり、逆に新規オブジェクトとして認識されてしまってIDが変化し続けてしまったりしていますね。
バグを修正していきます。
バグを修正したらコントロールライン(検査ライン)を決めて、そこを通過するオブジェクトの数をカウントしてきます。
とりあえず左方向の交通量をカウントします。
右下に交通量カウントを表示しています。
とりあえず私がテキトーに交通量カウントするのと同じぐらいの精度は出せているかなと思います。
やはりトラック等の大型車両で奥の車線が見えなくなったり、手前が見切れて上手く検出できなかったりと改善点は多々ありますが、作りたかったものはとりあえず完成です。
改善点としてはやはりオブジェクトトラッキングでカルマンフィルタ等の分散を用いた実装にしたいですね。
次にやるとしたら、これをリアルタイムで動かすことです。
全日交通量を監視するとなると常にリアルタイムで監視する必要があります。
するとPCはつけっぱなしできないので、低消費電力でギリギリYOLOv5がリアルタイムで動くハードウェアが必要になってきます。
JETSONとかですかね。(笑)
Amazon | NVIDIA Jetson Nano 2GB デベロッパーキット (945-13541-0000-000) | NVIDIA | グラフィックボード 通販
RaspberryPiの処理能力でもいけるのでしょうか。
とりあえずこんなところで、私としては自宅前が20分で片側二車線だけで100台以上通過する騒音ひどい環境だということが認識できたので満足です。
今回のコードはこちらになります。
以上、今回の開発でした。
追記
物体追跡(Object Tracking)のモデルとしてByteTrackというものをYOLOv5と合わせて使用している人が多いですね。
今度、使ってみようかなと思います。
【やってみた】YOLOv5+ByteTrackでオブジェクトトラッキング! - 神戸のデータ活用塾!KDL Data Blog