Mean Average Precision (mAP)
平均適合率(mAP)は、再現率、クラス、IoUしきい値にわたる適合率の平均によって検出器を評価します。mAP50とmAP50-95の計算方法を解説します。
平均適合率 (mAP) は物体検出の標準的な評価指標であり、同じ手法でインスタンスセグメンテーション、姿勢推定、方向付き物体検出も評価できます。すべての物体を検出できること、誤検出を避けること、各バウンディングボックスを正確に配置することをモデルに求め、その3つを0~1の1つの値(パーセントで表すこともあります)にまとめます。平均適合率 (AP)は1クラスの適合率-再現率曲線の下側面積であり、mAPはクラス全体のAPの平均です。最も広く報告されている形式のmAP50-95では、さらに10個の交差領域比 (IoU)閾値について平均を取ります。
構成要素#
- IoU: 予測ボックスとラベル付きボックスの重なり具合で、値は0~1です。予測のIoUが、同じクラスの未マッチのラベルとの間で0.5などの閾値に達した場合にのみ、その予測は真陽性になります。
- 適合率: 予測のうち正しいものの割合で、TP / (TP + FP)です。
- 再現率: モデルが検出したラベル付き物体の割合で、TP / (TP + FN)です。
- 信頼度: 検出結果の順位付けに使うスコアです。信頼度の閾値ごとに適合率と再現率のペアが1つ得られ、すべての閾値を合わせると適合率-再現率曲線になります。
mAPの計算方法#
評価では、データセット全体から1クラスのすべての検出結果を集め、信頼度順に並べます。リストを順に確認し、各検出結果は同じクラスの未マッチのラベルのうち最も重なりが大きいものに対応付けられて真陽性になるか、偽陽性になります。ラベルに対応付けられるのは1回だけなので、すでに検出済みの物体に対する2つ目のボックスは適合率を下げます。各ステップ後に適合率と再現率を再計算することで、最も信頼度の高い検出結果から最も低い検出結果までの適合率-再現率曲線を描きます。
APはその曲線の下側面積です。積分する前に、曲線を包絡線、つまり各再現率レベル以上で得られた最高の適合率に置き換えるため、小さな変動はスコアに影響しません。COCO評価では、再現率0~1の範囲から101点で包絡線をサンプリングします。従来のPASCAL VOCベンチマークでは11点を使用していました。モデルが到達しない再現率レベルの適合率はゼロになるため、検出漏れがあるとAPは低下します。
import numpy as np
# One class: 8 detections sorted by confidence (1 = matched a label, 0 = false positive)
tp = np.array([1, 1, 0, 1, 0, 1, 0, 0])
num_labels = 5 # ground-truth objects of this class in the dataset
# Precision and recall after each detection in the ranked list
tp_cum = np.cumsum(tp)
precision = tp_cum / np.arange(1, len(tp) + 1)
recall = tp_cum / num_labels
# Precision envelope: best precision at this recall or any higher recall
envelope = np.maximum.accumulate(precision[::-1])[::-1]
# COCO-style AP: average the envelope at 101 recall points (0 beyond the highest recall reached)
points = np.linspace(0, 1, 101)
idx = np.searchsorted(recall, points, side="left")
ap = np.mean([envelope[i] if i < len(envelope) else 0.0 for i in idx])
print(f"Max recall: {recall[-1]:.1f}, AP: {ap:.3f}")スクリプトはMax recall: 0.8, AP: 0.686を出力します。ラベル付きの物体5個のうち1個は一度も検出されないため、再現率軸の最後の5分の1は面積に加算されません。最も信頼度の高い2つの検出結果がどちらも正しくても、APは0.686にとどまります。
mAPと関連指標の比較#
- 精度は正しい予測数を全予測数で割った値であり、真陰性を数える必要があります。検出器の場合、真陰性は背景の空のパッチすべてに相当するため、精度は検出において意味のある値になりません。
- F1スコアは、1つの信頼度閾値における適合率と再現率を組み合わせ、デプロイ済みモデルが使用する閾値など、単一の動作点を示します。
- 混同行列は、1つの閾値で検出器がどのクラスを混同したかを数えます。これは単一のmAP値では分からない詳細です。
mAP50、mAP75、mAP50-95#
mAPはクラス間の単純平均であるため、出現頻度の低いクラスも高いクラスも同じ重みで扱われます。IoUのしきい値によって、正解とみなされるBBoxの厳密さが決まります。
- mAP50: IoUが0.5のときに検出を正解とします。これはPASCAL VOCの基準です。
- mAP75: しきい値を0.75に引き上げ、位置特定をより厳密に評価します。
- mAP50-95: 0.50から0.95まで0.05刻みの10個のしきい値でmAPを平均した値です。COCOではこの値を単に「AP」と呼び、APとmAPを区別せず、主要なチャレンジ評価指標として使用しています。
Ultralytics YOLO26のトレーニングでは、検証mAP50-95が最も高かったエポックのbest.ptが保持され、検証では実行ごとに3種類すべての指標が報告されます。
from ultralytics import YOLO
# Load a pretrained YOLO26 nano detector
model = YOLO("yolo26n.pt")
# Validate on the small COCO8 dataset to compute mAP
metrics = model.val(data="coco8.yaml")
# The same detections scored at three IoU thresholds
print(f"mAP50: {metrics.box.map50:.3f}")
print(f"mAP75: {metrics.box.map75:.3f}")
print(f"mAP50-95: {metrics.box.map:.3f}")IoUのしきい値が低いほど、正解とみなされる検出が増えるため、mAP50が最も高くなり、mAP50-95はそれより低くなります。COCOでは、物体サイズ別にもAPを分類します。小さい物体は面積が32 × 32ピクセル未満、中サイズの物体は最大96 × 96ピクセル、大きい物体はそれを超えるものです。










