画像認識技術を用いた混雑状況可視化の取り組み ①TensorRTを用いた物体検出とトラッキング

はじめに

三菱総研DCSのAI・IoTエンジニアの桃井です。

昨今の社会情勢を受け、特定の空間内の人数を計測・可視化する試みが需要を増してきています。私たちのチームでは、社内検証の一環として、社員食堂にカメラを設置して室内の混雑度を計測する取り組みを実施しました。

その実装方法や使用機器などについて、全2回でご紹介したいと思います。第1回ではディープラーニングによる人物のトラッキングを用いた方法について、第2回では深度カメラと画像処理による方法について説明します。

    目次

  1. 検証の概要
  2. 物体検出+トラッキングによる人数計測
  3. まとめ

検証の概要

全体のシステム構成は図1の通りです。

図1.システム構成図

カメラで撮影した画像をエッジ端末上で処理し、社内ネットワーク内に構築したサーバにデータを送信します。計測したデータの格納にはinfluxDB、可視化にはGrafanaを使用しました。Grafanaで作成したダッシュボードは図2になります。リアルタイムの混雑状況(図中左)と時間推移(図中右)を表示するページを社員向けサイトに掲載しました。

図2.可視化ダッシュボード

機器の配置や電源等を考慮した結果、以下の3通りの方法で人数の計測を行うことにしました。

  手法 エッジ機器 カメラ 計測場所
物体検出 Raspberry Pi 4B +
NeuralComputeStick2
USBカメラ 室内
物体検出+
トラッキング
Edge AI Box
(Jetson TX2)
USBカメラ 出入口1
画像処理 Jetson Nano 深度カメラ
(Intel RealSense Depth Camera D435i)
出入口2

図3.カメラの設置イメージ

①では、斜め上から食堂内を見下ろすようにUSBカメラを設置します。ディープラーニングを用いた物体検出により、人を検出してその数をカウントします。この方法については、以前投稿した記事(東京デジタルイノベーション2020にブースを出展しました ③来訪者の人数計測)とほぼ同じ内容のため詳細な説明は省略します。

①のように室内をカメラで撮影する方法は、広さに応じて必要なカメラの台数が増えてしまうというデメリットがあります。本検証においても、設置するカメラの台数は1台とし、食堂内の一部のエリアを計測するに限りました。また、複数台のカメラの画角が重なった場合に、同一人物を重複して計測しないような仕組みも必要になります。

そこで、②、③では出入口を通る人の数を計測することで室内の人数を計測するアプローチを取ることにしました。当社の食堂にはドアが2つあり、片方に②のカメラを、もう片方に③を設置しました。②では①と同様に、USBカメラで撮影した画像に対して人物検出を、③では深度カメラで撮影した画像を処理することで人の通過を計測しました。

物体検出+トラッキングによる人数計測

はじめに②の手法について説明します。本手法では、ディープラーニングによる物体検出とトラッキングを行います。物体検出にはYolo v3、トラッキングにはDeepSortを使用しています。当初はフレームワークにKerasを用いて実装をしましたが、十分なFPSが出なかったため、Jetsonに適したTensorRT[1]を使った形に改修することにしました。TensorRTでの実装に当たっては以下のプロジェクト(https://github.com/Stephenfang51/tracklite)を元に作成しました。また、推論にはEdge AI BoxJetson TX2SSDを搭載したエッジデバイス)を使用しました。

[1] TensorRTNVIDIA社が提供するライブラリで、モデルを量子化することで高速な推論を可能にします。動作は同社の製品であるJetsonTeslaDRIVE上でのみ対象としています。モデルの学習を行う機能は無く、オプティマイザを用いて学習済みモデルを量子化し、そのモデルで推論を行うという使い方をします。TensorFlowやKerasとのコードの互換性は無く、改修する場合は少し手間が掛かります。例えば、推論時はPyCUDAを使い明示的にメモリを割り当てることが必要になります。

まずはYolo v3の学習済み重みをTensorRT用のモデル(.engine)に変換します。直接は変換できないため、weightsonnxengineと段階を踏むことになります。

# weights→onnx
python3 yolov3_to_onnx.py
# onnx→engine
python3 onnx_to_tensorrt.py --onnx “onnxのパス” --output_engine “engineのパス”

 

次に、run_tracker.pyのメインループ部分を改造し、出入口の通過判定と推論結果データの送信処理を追加します。カメラは出入口を横から撮影する画角で固定し、室内/外の境界線を定義します。人物のバウンディングボックスの足元の座標と境界線との線分の交差判定、および出入口のどちら側から侵入したかを判定することで人数のカウントアップ/ダウンを行いました。

最後に、計測したリアルタイムの人数は一定時間ごとにNode-RedWebsocketで送信し、influxDBに格納します。

図4.トラッキングのイメージ

図5.実際のトラッキングの様子

まとめ

別途Kerasでの実装もしましたが、TensorRTを使うことでFPSが約2倍になりました。トラッキングの精度はFPSによるところも大きいため、NVIDIAのデバイス上で推論する際はTensorRTの使用を積極的に検討していきたいです。一方で、人が密接して通過した場合に正しくカウントされないという課題もありました。今回は物体検出にYolo v3を使用しましたが、処理速度、精度ともに向上しているとされるYolo v4/v5といったアルゴリズムを使っての検証もしていきたいです。

今回は混雑度の可視化アプリのうち、TensorRTを用いたトラッキングによる出入口の流量の計測について説明しました。次回は深度カメラを用いた人数計測について説明します。