【Python】物体検出 YOLOの最新動向・実装

## 1. はじめに

物体検出は監視カメラなどの映像から特定の物体を検出する技術です。物体検出は、コンピュータビジョンの中で非常に重要なタスクであり、YOLO（You Only Look Once）モデルはその中でも最も主要なアルゴリズムの一つです。YOLOは、高速かつ高精度な物体検出を実現するために設計され、リアルタイムでの物体検出において広く利用されています。本記事では、YOLOの概要と、2024年時点での最新バージョン（YOLOv11）について解説します。そして、PythonでYOLOを実装する方法についてもわかりやすく説明します。

## 2. YOLOの概要
YOLOは、物体検出タスクにおいて非常に効率的で、単一のニューラルネットワークを使って画像全体を一度に処理します。その最大の特徴は「一度の推論で全ての物体を検出する」ことです。この特徴により、YOLOは非常に高速であり、リアルタイムの物体検出が可能です。

物体検出の従来の手法（例えばR-CNN系列）とYOLO（You Only Look Once）の違いを、簡単にわかりやすく解説します。

従来の物体検出手法（例えば、R-CNN系列）では、まず画像から物体が存在しそうな領域（候補領域）をいくつか生成します。次に、これらの候補領域それぞれに対して、特徴量を抽出し、それがどの物体に属するかを分類します。この分類を行うために、畳み込みニューラルネットワーク（CNN）などを使って物体の特徴を学習します。このような方式では、処理に時間がかかり、計算リソースも多く必要でした。

YOLOは、上記の手法とは違い、物体検出を一度の推論で行います。YOLOでは、まず画像をグリッド状に分割します。例えば、画像を 7x7 の格子に分けます。そして、49個のグリッドセルそれぞれに、物体が存在するかどうか、物体の位置、その物体は何であるかを同時に予測する事を、一度の推論で計算します。全てを一度の推論で行うため、従来の手法に比べて計算が効率的で、非常に高速です。

## 3. YOLOの各バージョンについて

以下の表では、YOLOの各バージョンの特徴を簡潔にまとめています。最新はYOLOv11なので、YOLOv11を利用するのが良いでしょう。
（古い解説記事や生成AIでコピペをして、誤って古いバージョンのYOLOを使わない事）

| Ver. | 発表年 | 主な特徴 |
|------------|--------|----------|
| **YOLOv1** | 2015年 | 画像全体を一度に処理し、高速でリアルタイムの物体検出。精度は他の手法に劣る。 |
| **YOLOv2** | 2016年 | バッチ正規化、アンカーボックス、次元クラスタリングを導入し、精度が向上。 |
| **YOLOv3** | 2018年 | Darknet-53バックボーンとマルチスケール検出により、小物体検出の精度が大幅に向上。 |
| **YOLOv4** | 2020年 | モザイクデータ拡張やアンカーなし検出ヘッドで精度と速度を向上。汎用性も高い。 |
| **YOLOv5** | 2020年 | 非公式バージョンで、使いやすさと効率性を重視。ハイパーパラメータ最適化とエクスポート機能。 |
| **YOLOv6** | 2022年 | 自律型配送ロボット向けに精度と速度のバランスを取った設計。 |
| **YOLOv7** | 2022年 | ポーズ推定や動的インスタンス処理で、柔軟性と精度を向上。 |
| **YOLOv8** | 2023年 | 高精度な物体検出と、セグメンテーション、ポーズ推定などの多機能対応。 |
| **YOLOv9** | 2023年 | PGIとGELANで精度と計算効率を大幅に向上。 |
| **YOLOv10** | 2024年 | NMS不要なEnd-to-Endヘッドで、より高速なリアルタイム物体検出を実現。 |
| **YOLOv11** | 2024年 | 検出、セグメンテーション、追跡など幅広いAIタスクに対応し、最先端のパフォーマンスを提供。 |

---

## 4. YOLOv11の実装

今回は、以下の画像のように、自分のPCに付属しているカメラの映像からリアルタイムに物体検出を行ってみたいと思います。人や車、コップ、テーブルなど身近な物体を物体検出することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674933/305bf615-3490-1988-57ca-ab760dbc6c88.png)

### Python 3.9 - 3.12 のインストール

まず、Python 3.9 - 3.12のいずれかを準備する必要があります。違うバージョンのPythonを利用している場合は、以下の記事で別のバージョンのPythonをインストールしてください。

- [【Python】複数のバージョンのPythonを切り替えて使う方法](https://qiita.com/k-keita/items/e8dea5e0ae954ba5bda1)

### パッケージのインストール

YOLOv11を実行するために、ultralyticsパッケージをインストールします。OpenCVやPyTorchなど関連するパッケージも一緒にインストールされます。

```shell
pip install ultralytics
```

### 実装

それでは、物体検出を行ってみましょう。

```python
from ultralytics import YOLO
import cv2

# YOLOv11をロード
model = YOLO("yolo11n.pt")

# 自分のPCのカメラを取得
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        print("Error: Failed to capture image.")
        break
    
    # 物体検出（動画ではtrackメソッドを利用する）
    results = model.track(frame, persist=True)
    # 物体検出（静止画ではdetectメソッドを利用する）
    # results = model.detect("path_to_image.jpg")
    
    # フレームに結果を可視化
    annotated_frame = results[0].plot()
    cv2.imshow("YOLOv11トラッキング", annotated_frame)

    # qキーでプログラムを終了する
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break
# キャプチャを終了
cap.release()
cv2.destroyAllWindows()
```

## 5. 終わりに

本記事では、YOLOの概要と、物体検出の最新であるYOLOv11を使用したPythonでの物体検出の実装方法について解説しました。YOLOv11は、高速かつ高精度な物体検出が可能で、リアルタイムでの利用に非常に適しています。監視カメラや自動運転車、ロボットなど、さまざまな分野で活用できる強力なツールです。本記事の内容をベースに、ぜひ、様々な場面で物体検出を活用いただければ幸いです。