YOLOv5、YOLOv8、YOLOv10の人物検出能力を比較する

はじめに

生成AIで標準のモデルでは満足できず、Loraを作成しようと考えていました。

手で人物画像を抜き出すのが手間なので、人物の全身画像を自動で抜き出したいなというニーズができたのですが、それにあたって、pythonのバッチなどで自動検出したいという想いがあり、スクリプト化まで行いました。

ただ、他の手法に比べYOLOの精度が高い反面、バージョンが多く、思った以上に各バージョンの能力が異なったため、きちんと調査したく、比較用のスクリプトまで作成。(すでにLoraづくりからは遠ざかっていますが…)
環境を汚したくなかったので、docker-compose上で動かしています。

折角作ったので、同じような需要がある人に使って貰いたく公開します。
かなりニッチでしょうけど…
無料で公開しますが、参考になったと思いましたらコメントなど頂けると幸いです。

生成AIの分野は門外漢なので、比較は完全に今回の用途目的となります。
こうやって比較した方がいいよーなどありましたら、ご指摘ください。


YOLOとは

とのことですw

YOLO(You Only Look Once)は、リアルタイムで物体検出を行うための深層学習アルゴリズムの1つです。物体検出では、画像や動画に含まれるさまざまなオブジェクト(人、車、動物など)の位置とクラスを特定しますが、YOLOはこの処理を非常に高速に実行できる点で有名です。

ChatGPT 4o

開発環境

Python3
docker compose 
Windows11

リポジトリ

パブリック画像リンク

こちらの画像を本記事では判定させて頂きました。
勿論、実写の画像も判定に使用可能です。

face-mask-detection_add-incorr

以下の手順で使用可能です。
リンクをクリック -> googleなどでkaggleにログイン -> ダウンロード
-> 展開後、inputフォルダに配置

自分が保持している画像がない方は下記の記事などで紹介されている画像を使用することを推奨します。ただし、ダウンロードおよび展開は自己判断で

使用手順

詳細はリポジトリ内のREADME.mdを参考ください。

ざっくり言うと、こんな流れです。

  1.  inputフォルダに画像を自前の画像や、パブリック利用が可能な画像をダウンロードして入れる

  2. YOLOvCompare.pyの設定値を変更(設定条件欄参照)

  3. docker-compose up --buildを実行

  4. outputフォルダに解析結果を出力

この後ろは、説明なので、一旦リポジトリを落として試して貰うのが早道かも…

設定条件

本ツールでは以下の設定値があり、こちらを設定した上で画像出力し、その結果を比較することが可能です。

下記のconfig.pyファイルのuseフラグを切り替えれば、テスト対象を変更することが可能です。

# config.py

# 判定フラグ(1の時に処理を実行)
execute_detection = 1

# 設定パターンのリスト
settings_patterns = [
    {"conf": 0.001, "iou": 0.500, "agnostic_nms": False, "max_det": 1000, "use": 0},
    {"conf": 0.300, "iou": 0.500, "agnostic_nms": False, "max_det": 1000, "use": 1},
    {"conf": 0.100, "iou": 0.500, "agnostic_nms": False, "max_det": 1000, "use": 0},
    {"conf": 1.000, "iou": 0.500, "agnostic_nms": False, "max_det": 1000, "use": 0},
    {"conf": 0.100, "iou": 0.100, "agnostic_nms": False, "max_det": 1000, "use": 0},
    {"conf": 0.100, "iou": 0.300, "agnostic_nms": False, "max_det": 1000, "use": 0},
    {"conf": 0.100, "iou": 0.500, "agnostic_nms": False, "max_det": 1000, "use": 0},
    {"conf": 0.100, "iou": 0.800, "agnostic_nms": False, "max_det": 1000, "use": 0},
    {"conf": 0.100, "iou": 1.000, "agnostic_nms": False, "max_det": 1000, "use": 0},
]

# モデル名とモデルファイルの対応と使用フラグ
models = {
    "yolov5n": {"path": "models/yolov5n.pt", "use": 1},
    "yolov5s": {"path": "models/yolov5s.pt", "use": 0},
    "yolov5m": {"path": "models/yolov5m.pt", "use": 0},
    "yolov5l": {"path": "models/yolov5l.pt", "use": 0},
    "yolov5x": {"path": "models/yolov5x.pt", "use": 0},
    "yolov8n": {"path": "models/yolov8n.pt", "use": 1},
    "yolov8s": {"path": "models/yolov8s.pt", "use": 0},
    "yolov8m": {"path": "models/yolov8m.pt", "use": 0},
    "yolov8l": {"path": "models/yolov8l.pt", "use": 0},
    "yolov8x": {"path": "models/yolov8x.pt", "use": 0},
    "yolov10n": {"path": "models/yolov10n.pt", "use": 1},
    "yolov10s": {"path": "models/yolov10s.pt", "use": 0},
    "yolov10m": {"path": "models/yolov10m.pt", "use": 0},
    "yolov10l": {"path": "models/yolov10l.pt", "use": 0},
    "yolov10x": {"path": "models/yolov10x.pt", "use": 0}
}

YOLO検出設定値の説明

物体検出を行う際の各設定項目について、設定値によって、検出の精度や処理速度が異なるため、用途に応じて適切なパラメータを選択することが重要です。

  • conf

    • 設定値の例: 0.001 / 0.005 / 0.01

    • 説明: 検出の信頼度閾値。値が低いと多くの物体が検出されますが、誤検出も増える可能性があります。0.01以上が一般的な信頼度とされます。

  • iou

    • 設定値の例: 0.500 / 0.400 / 0.300

    • 説明: 非最大抑制(NMS)のIoU(Intersection over Union)閾値。値が高いほど、重複する検出が抑制されます。通常は0.5前後が適しています。

  • agnostic_nms

    • 設定値の例: False / True

    • 説明: クラスに依存しないNMSを使用するかどうか。Trueに設定すると、異なるクラス間でも重複検出を抑制します。通常はFalseに設定します。

  • max_det

    • https://www.youtube.com/

    • 設定値の例: 1000 / 500 / 2000

    • 説明: 一度の画像内での最大検出数。数値を小さくすると処理が早くなりますが、検出漏れの可能性が増します。1000前後が適切とされます。

YOLOモデル設定と説明

各YOLOモデルには、異なる用途や性能に合わせたサイズと構造のバリエーションが存在します。モデル名の末尾にあるアルファベット(n, s, m, l, x など)は、モデルのサイズや精度、処理速度に関する特徴を表しています。


YOLOv5, YOLOv8, YOLOv10シリーズ

各バージョンにおいて、精度や速度、モデル構造の改善が図られています。基本的なサイズ(n, s, m, l, x)は同様の意味を持ちますが、世代が進むごとに精度や処理効率が向上しています。

  • yolov5n, yolov8n, yolov10n

    • 最も軽量なモデルで、リソースが少ない環境でのリアルタイム処理に適しています。

  • yolov5s, yolov8s, yolov10s

    • スモールモデルで、軽量でありつつ、適度な精度を保ったバランスの取れたモデルです。

  • yolov5m, yolov8m, yolov10m

    • ミディアムモデルで、精度と速度のバランスが良く、デスクトップやサーバーでの用途に適しています。

  • yolov5l, yolov8l, yolov10l

    • ラージモデルで、高精度な検出が可能。速度よりも精度が重視される場合に使用します。

  • yolov5x, yolov8x, yolov10x

    • エクストララージモデルで、最高精度を提供するために設計されています。高性能GPUが必要で、最も計算資源を必要としますが、精度は非常に高いです。


軽量モデル(n, s)はリアルタイム処理に適しており、大型モデル(l, x)は高精度が求められるタスクに適しています。

比較結果

以下の条件で比較しました。
モデル: yolov5n、yolov8n、yolov10n
共通条件: {"conf": 0.300, "iou": 0.500, "agnostic_nms": False, "max_det": 1000}
Datasets:  face-mask-detection_add-incorr(ファイル数: 105)


本件では顔がない胴体だけで人物判定したくなかったので、
目視で使用可能な画像かを判定し、私の目的に合うモデルかを確認しました。

  • yolov5n

出力ファイル数: ファイル数: 279
うち目視で人物として判定したもの: 114
出力ファイル中判定中目視で正しいとしたもの: 40.8%

人物判定されたがNGと判定した画像
  • yolov8n

出力ファイル数: ファイル数: 301
うち目視で人物として判定したもの: 116
出力ファイル中判定中目視で正しいとしたもの: 38.5%

人物判定されたがNGと判定した画像
  • yolov10n

出力ファイル数: ファイル数: 260
うち目視で人物として判定したもの: 114
出力ファイル中判定中目視で正しいとしたもの: 43.8%

人物判定されたがNGと判定した画像

比較結果に関して

この結果だけを見ると、yolov10nが一番人物を取得でき、精度が高いように思えるが、お世辞にも精度が高いと出来るものではなく、以下の対応を検討し、再度調査した方がよいと思われる。

  • yolov10xなどの精度が高いモデルの使用

  • 用途によってconfを上げて信頼度閾値を上げて精度を高めるか、本来引っかかって欲しい画像がかかっていないなら値を下げる

  • 重複する箇所が検出されている場合はiouの値を上げる

おわりに

本記事は詳細な精度を確認することが目的ではないため、比較結果の検証は以上となります。yoloは人物以外の検出も対応していますので、こちらを足掛かりに色々な調査などにつながりましたら幸いです。

記事はここまでです。有料記事は空なので間違えて買わないでくださいね。

もし、この記事が役に立ったよと思ってくれて、お金に余裕がある人は他の記事を作ろうと思いますので、買っていただけると幸いです。


いいなと思ったら応援しよう!