特定のエリアに絞った検出

YOLOを用いて、映像内の特定の範囲内のみ分析を行います。例えば防犯カメラなどでも施設の敷地に限定して分析することで侵入者のアラートを挙げたり、自動で待ち行列の人数をカウントするなどが出来ます。

例として、以下のような海外の駅のホームの映像を分析してみます。
素材サイトからダウンロードしたのですが、インドですかね。

目次

Ultralytics セッティング

Google Colabにインストールします。

!pip install ultralytics

Solutionsモジュールに TrackZoneクラスが用意されているので、ソレを使います。公式のサンプルを参考に、範囲だけ変更してみます。

import cv2

from ultralytics import solutions

cap = cv2.VideoCapture("/content/12305791_720_1280_30fps.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

# 限定する範囲を矩形で指定する
region_points = [(425, 1400), (650, 1400), (500, 1), (350, 1)] 

# 結果を出力する
video_writer = cv2.VideoWriter("object_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

# TrackZoneクラス
trackzone = solutions.TrackZone(show=True,region=region_points,model="yolo11n.pt")

# 動画を読み込んで処理
while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        print("Video frame is empty or video processing has been successfully completed.")
        break
    im0 = trackzone.trackzone(im0)
    video_writer.write(im0)

cap.release()
video_writer.release()
cv2.destroyAllWindows()

実行結果

結果がコチラです。ホームの端から線路の領域をザックリと指定してみました。ホームの端ギリギリに立っている人を検知できます。

この映像には線路上にいるメンテナンス中?の方も検出できていますが、
例えばホームから線路に人が落下してしまったような事故も検知出来そうです。

所感ですが、

  • 角度によって「人」と検出し辛い場合もあるようなので、斜め角度と水平角度があれば精度があがりそう
  • 遠くの方の人を検出し辛い場合もあるようなので、一定距離でカメラを配置するのがよさそう

だと、思いました。
ソフトウェアをゴリゴリ改修するよりも、カメラの台数を増やすというのが効率良さそうです。

 
 
  

当サイトの記事の一部はAIにより執筆されています。内容について最新の情報とは異なる場合も御座いますのでご留意くださいませ。最新の情報をご確認くださいますようお願い申し上げます。

よかったらシェアしてね!
目次