YOLOv8とUltralyticsを使用したオブジェクトカウンティング

## はじめに

### Ultralyticsとは

Ultralyticsは、最先端の深層学習モデルと革新的なコンピュータビジョンソリューションを提供する企業です。彼らが開発したYOLOv8は、リアルタイムの物体検出と画像セグメンテーションにおいて、高速性と精度を両立した最新のモデルです。Ultralyticsは、これらの技術を簡単に利用できるPythonライブラリも提供しており、研究者や開発者が最新の AI 技術を自分のプロジェクトに容易に組み込むことができるようサポートしています。

### オブジェクトカウンティングとは

オブジェクトカウンティングは、画像や動画内の特定のオブジェクトを正確に識別し、数えるプロセスです。この技術は、セキュリティ、小売業、交通管理など、さまざまな分野で活用されています。YOLOv8の高速で正確な検出能力と、Ultralyticsが提供する便利なツールを組み合わせることで、効率的なオブジェクトカウンティングシステムを構築することができます。
本記事では、最新のYOLOv8モデルとUltralyticsのライブラリを使用して、効率的かつ正確なオブジェクトカウンティングを実現する方法を、初心者の方にも分かりやすく解説します。

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr"><a href="https://twitter.com/ultralytics?ref_src=twsrc%5Etfw">@ultralytics</a> を使って猫を検出してみた！！<br>ちゃんとトラッキングできてる！！<br><br>＊動画は<a href="https://twitter.com/Viduforhuman?ref_src=twsrc%5Etfw">@Viduforhuman</a> で生成＋アップスケールしたものです<br><br>🔗<a href="https://t.co/DlKIAykagg">https://t.co/DlKIAykagg</a> <a href="https://t.co/QnRBERMEOL">https://t.co/QnRBERMEOL</a> <a href="https://t.co/e7kgWmTUEF">pic.twitter.com/e7kgWmTUEF</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1821118235036508356?ref_src=twsrc%5Etfw">August 7, 2024</a></blockquote>

## 環境設定

まずは、必要なライブラリをインストールしましょう。GoogleColabを使用している場合、以下のコマンドを実行してUltralyticsパッケージをインストールします。

```python
# Ultralyticsパッケージをインストール
!pip install ultralytics
```

## 必要なライブラリのインポート

次に、プロジェクトに必要なライブラリをインポートします。

```python
# OpenCVライブラリをインポート（画像処理に使用）
import cv2

# Ultralyticsからカスタム機能をインポート
from ultralytics import YOLO, solutions
```

## YOLOv8モデルの初期化

YOLOv8モデルを初期化し、動画ファイルを開きます。

```python
# YOLOv8nモデルを読み込む
model = YOLO("yolov8n.pt")

# 動画ファイルを開く
cap = cv2.VideoCapture("/content/stable--4-2024-08-07T09_29_30Z.mp4")

# 動画ファイルが正常に開けたか確認
assert cap.isOpened(), "動画ファイルの読み込みエラー"

# 動画の幅、高さ、FPSを取得
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
```

## カウンティング領域の定義

オブジェクトをカウントする領域を多角形で定義します。

```python
# カウンティング領域を5点の多角形で定義
region_points = [(20, 400), (1080, 404), (1080, 360), (20, 360), (20, 400)]
```

## 動画ライターの設定

処理結果を新しい動画ファイルとして保存するための設定を行います。

```python
# 出力動画の設定
video_writer = cv2.VideoWriter(
    "object_counting_output.avi",  # 出力ファイル名
    cv2.VideoWriter_fourcc(*"mp4v"),  # コーデック
    fps,  # フレームレート
    (w, h)  # 解像度
)
```

## オブジェクトカウンターの初期化

Ultralyticsの`ObjectCounter`クラスを使用して、オブジェクトカウンターを初期化します。

```python
# ObjectCounterクラスのインスタンスを作成
counter = solutions.ObjectCounter(
    view_img=True,  # 処理中の画像を表示
    reg_pts=region_points,  # カウンティング領域
    names=model.names,  # クラス名のリスト
    draw_tracks=True,  # トラッキング結果を描画
    line_thickness=2,  # 描画線の太さ
)
```

## メインループ: フレーム処理とオブジェクトカウンティング

動画の各フレームを処理し、オブジェクトの検出とカウンティングを行います。

```python
# 動画の各フレームを処理するループ
while cap.isOpened():
    # フレームを読み込む
    success, im0 = cap.read()
    
    # フレームの読み込みに失敗した場合（動画の終わり）
    if not success:
        print("動画フレームが空か、処理が完了しました。")
        break
    
    # YOLOv8モデルでオブジェクトを検出し、トラッキング
    tracks = model.track(im0, persist=True, show=False)
    
    # オブジェクトカウンティングを実行し、結果を画像に描画
    im0 = counter.start_counting(im0, tracks)
    
    # 処理結果を動画ファイルに書き込む
    video_writer.write(im0)
```

## リソースの解放

処理が完了したら、使用したリソースを解放します。

```python
# ビデオキャプチャを解放
cap.release()

# 動画ライターを解放
video_writer.release()

# すべてのOpenCVウィンドウを閉じる
cv2.destroyAllWindows()
```

## まとめ

以上が、YOLOv8を使用したオブジェクトカウンティングの基本的な実装方法です。この記事では、環境設定から動画処理、オブジェクトの検出とカウンティング、結果の保存まで、一連の流れを詳しく解説しました。

このコードを応用することで、交通量の分析、店舗内の顧客数の把握、セキュリティシステムの強化など、さまざまな実用的なアプリケーションを開発することができます。

YOLOv8の高速で正確な検出能力と、Ultralyticsが提供する便利なツールを組み合わせることで、効率的なオブジェクトカウンティングシステムを構築することが可能です。ぜひ、このコードを基に、自分のプロジェクトやアイデアを実現してみてください。

## 参考サイト

https://docs.ultralytics.com/guides/object-counting/#real-world-applications

 <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>