PythonとYolo v5で画像内の人数をカウントする

ある施設の混雑度を把握するために、ネットワークカメラに映る人数をカウントするプログラムを作成しています。

本投稿ではPythonとYolo v5を用いて画像内の人数をカウントするプログラムを紹介します。

使用する技術の簡単な紹介

YOLOとは

今回は人数をカウントするためにYOLOというアルゴリズムを利用します。

YOLOは物体検出(オブジェクト検出/object detection)を行うことができ、特にリアルタイムに人のような物体を検出するのが得意です。

オブジェクト検出 YOLO – ReNom

学習データを準備して独自の物体を検出することも可能ですが、今回はデフォルトで用意されている学習モデルを利用しました。

人数カウントの実行手順

モジュールのインストール

まずは必要なモジュールをインストールしていきます。

> python -m venv env
(env) > git clone https://github.com/ultralytics/yolov5
(env) > cd yolov5
(env) > pip install -r requirements.txt

ソースコード

ソースコードはこちらです。

import torch


def predict_person_count(img):
    # yolo v5 setup
    model = torch.hub.load("ultralytics/yolov5", "yolov5s")

    # predict -> save img -> count person label
    results = model(img)
    results.save()
    df = results.pandas().xyxy[0]
    return len(df[df["name"] == "person"])


predict_person_count('imgfilepath')
画像ファイルパス

‘imgfilepath’に人数カウントしたい画像ファイルパスを指定してください。

出力結果

今回は以下の画像を利用してテストを行いました。

出力結果はこちらになります。

ソースコードのテスト実行はjupyter notebook上で行っております。

YOLOv5  2022-9-2 Python-3.10.5 torch-1.12.1+cpu CPU

Fusing layers... 
YOLOv5s summary: 213 layers, 7225885 parameters, 0 gradients
Adding AutoShape... 
Saved 1 image to runs\detect\exp

2

無事「2」人とカウントされています。

出力結果に記載されている「runs\detect\exp」フォルダを確認すると、検出結果の画像が確認できます。

Yolo v5結果サンプル

Yolo v5/yolov5sの検出結果を確認するために、複数の画像で確認してみました。

座った子供11人

出力結果は11人で正しくカウントできています。

菅内閣25人

出力結果は10人で15人少ない結果となりました。

重なっていると弱いのでしょうか…

人(person)のみを検出したい場合

デフォルトでは80個のクラス情報が出力されるため、上記ではネクタイ(tie)が検出されています。

人(person)のみを検出したい場合は以下のようにmodel.classesの記載を入れてください。

model = torch.hub.load("ultralytics/yolov5", "yolov5s")

# predict -> save img -> count person label
model.classes = 0    # person
results = model(img)

詳細はYolo v5のGithubに記載されています。

また使用中のモデルにどのようなクラスがあるかを知りたいときは以下のようにコーディングすることで調べることができます。

model.names

{0: 'person',
 1: 'bicycle',
 2: 'car',
 3: 'motorcycle',
 4: 'airplane',
 ...

浴衣女性11人

出力結果は12人で1人多い結果となりました。

おそらく左下女性がダブルカウントされています。前かがみで誤判定したのかもしれません。

人数カウントのカスタマイズ

菅内閣25人の出力結果を踏まえて、以下2点の修正を加えてみたいと思います。

  • ネクタイ(tie)の検出は不要なので、人(person)のみを検出する
  • 上段の検出できない人(person)も検出できるようにする

修正前の元画像を再掲します。

Yolo v5で人のみを検出したい場合

Yolo v5はデフォルトでは80個のクラス情報が出力されるため、上記ではネクタイ(tie)が検出されています。

人(person)のみを検出したい場合は以下のようにmodel.classesの記載を入れてください。

model = torch.hub.load("ultralytics/yolov5", "yolov5s")

# predict -> save img -> count person label
model.classes = 0    # person
results = model(img)

上記プログラムを実行すると以下のように人(person)のみが検出されます。

modelクラスに関する詳細はYolo v5のGithubに記載されています。

使用中のモデルにどのようなクラスがあるかを知りたいときは以下のようにコーディングすることで調べることができます。

model.names
{0: 'person',
 1: 'bicycle',
 2: 'car',
 3: 'motorcycle',
 4: 'airplane',
 ...

Yolo v5で人の検出精度を上げる場合

今の状態だと階段の上段、特に左側の閣僚が人として検知できておりません。

Yolo v5の検出精度を上げるというと語弊がありますが、AIが人として検出する自信度の閾値を下げることで、人の検出数を増やすことができます。

イメージ的には、AIが「多分これは人だな…自信ないけど…」という人もカウントするようにします。

model = torch.hub.load("ultralytics/yolov5", "yolov5s")

# predict -> save img -> count person label
model.classes = 0    # person
model.conf = 0.1     # default:0.25
results = model(img)

上記プログラムを実行すると以下のように人(person)の検出数が増えます。

検出数は22人でした。左端の閣僚などまだ未検出の方がいます。

自信度(confidence)を下げるデメリット

今回は自信度の閾値を下げましたので、誤検出の可能性は増えます。

まとめ

今回はPythonとYolo v5を利用して画像内の人数カウントプログラムを作成しました。

カウント結果はSlackやLINE通知などの他システムと連携して利用することで様々なことに利用できそうです。

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

コメントを残す

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

CAPTCHA