Pythonで動画に映る人数の合計をカウントする方法

「お店に入店する1日の利用者数を見たい」であったり、「通行人の数を調べたい」であったりと、人数をカウントしたいというニーズは大量にあると思います。

Pythonでそういったことができないかを考えていた際、最初は単に「人という物体を検出できればよいのではないか」と考えていました。

しかしよくよく調べていくと、物体検出ではなく物体追跡という技術を使う方が今回のニーズに合うことがわかりました。

今回は物体検出と物体追跡の違いや、実際に物体追跡にトライする方法について紹介します。

人数カウントと累積人数カウント

まず私が勘違いしていたのは、人数カウントと累積人数カウントは違うということです。

人数カウントと累積人数カウントのイメージ

以下のように通行ゲートを通る人数を数えたい時、単純に一時点の静止画を見るだけで2人と判断することができます。

ただし「1日の入店者数の合計」のような累積の人数をカウントしたい場合だと、単に静止画内の人数をカウントするだけでは実現することができません。

以下のように少し時間が経った静止画の人数をカウントすると3人ということはわかります。

ただしメガネのサラリーマンと女性サラリーマンは1つ前の静止画と同じ人になるので、再カウントしてしまうとダブりが発生してしまいます。

そこで各人にIDを降り、それぞれの人が同じなのか、違うのかも判断しながら人数をカウントしていく必要があります。

累積人数カウントで使われる物体追跡(MOT)

累積人数カウントでは主に以下2つの技術が使われます。

  • 物体検出(Object Detection)
  • 物体検出したものが同じかどうか

これら2つのAIを組み合わせて、物体追跡(Multiple Object Tracking)を実現しています。

以下2つのブログが非常に勉強になりました。

Multiple Object Trackingの手法・ライブラリ紹介

【作物の収量を把握】オブジェクトトラッキングを試してみる【YOLOv5+DeepSort】

物体追跡を試してみる

サンプルプログラム

まずは以下のGitHubにアクセスします。

Yolov5_StrongSORT_OSNet

Open in Colabのボタンを押します。

ドライブにコピーを選択します。

編集ノートブックの設定を選択し、ハードウェアアクセラレータにGPUを選択します。

Run inference on videoで以下のようなエラーが出てしまいました。

ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. 
This behaviour is the source of the following dependency conflicts.
markdown 3.4.1 requires importlib-metadata>=4.4; python_version < "3.10", but you have importlib-metadata 4.2.0 which is incompatible. 
gym 0.25.2 requires importlib-metadata>=4.8.0; python_version < "3.10", but you have importlib-metadata 4.2.0 which is incompatible.

パッケージの依存関係に関するエラーのようです。以下コードの実行により依存関係を解決させます。

!pip install -U markdown gym

それ以降は順次Notebookを実行していくことで人数カウントができるようになりました。

サンプルコードのカスタマイズ

以下スクリプト実行個所に引数を指定することで出力結果を変更することができます。

!python track.py --yolo-weights /content/Yolov5_StrongSORT_OSNet/yolov5/crowdhuman_yolov5m.pt --strong-sort-weights osnet_x0_25_msmt17.pt --source out.avi --save-vid

以下では良く使用する引数を説明します。

–source

物体追跡したい動画ファイルを指定します。

–save-txt

物体検出の詳細情報がMOT Formatで出力されます。

MOT Format

<frame>, <id>, <bb_left>, <bb_top>, <bb_width>, <bb_height>, <conf>, <x>, <y>, <z>

まとめ

今回はPythonで動画に映る人数の合計をカウントする方法についてまとめました。

このプログラムを利用することで、施設や店舗に訪れる人の合計人数をカウントできそうです。

ご意見やご質問がありましたらお気軽によろしくお願いします。コメントお待ちしております!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA