【物体検出】mAP (mean Average Precision)とは? その目的と計算方法を解説します
この記事で学ぶこと
YOLOやSSDなどの物体検出でのベンチマークとしてよく使われるmAPとは一体どんな目的を持った指標なのか、どうやって計算されているのかについて解説します。
物体検出では様々なクラス(犬、猫、車、人、などなど)の位置を予測します。
ざっくりとしたイメージで言うと、全てのクラスに対して良い精度を出しているかどうかを判断するための指標がmAPです。
mAPの計算の手順は、1つ1つのクラスに対してAP(Average Precision)を計算します。そして最後に、クラスごとに計算されたAPの平均を計算したものがmAPになります。
このAPの計算にはIoU、Precision、Recallといった概念が含まれます。この記事では、これらの解説から初めて、最終的にはCOCOで実際に適用されている計算方法を紹介します。
あらかじめ述べておきますが、APは平均のPrecision(適合率)ではありません。
また、mAPの計算方法は一つだけではなく様々なバリエーションがあります。その理由も解説します。
まずは、物体検出におけるIoU、Precision、Recallのおさらいをしましょう。
IoU(Intersection over Union)
ここからしばらく一つのクラスに限定して話を進めていきます。例えば、与えられた画像に対しで物体検出をして犬のいる場所を予測しているとします。
このときBounding Boxと呼ばれる四角で犬の位置を表します。YOLOやSSDなどの物体検出では教師あり学習を行うので正解のBounding Boxが与えられており、予測の答え合わせができます。
下図では赤が正解で青が予測のBounding Boxです。

予測した四角と正解の四角が完全に重なることは稀なので上図のようにある程度重なっていればOKとします。
なお、重なり具合を測るために、IoU(Intersection over Union)を計算します。

IoUは0から1までの数値で、IoUが1だと予測されたBoundingBoxが正解と完全に一致したことになります。0だと全く重なりがない状態です。IoUの計算の仕方は別記事で解説しているので必要に応じて参照してください。
予測が正解と完全に一致することは稀ですし、完全に一致していなくても物体の場所を言い当てたと考えられる場合があるので、IoUの値がある程度高ければ正解とします。
たとえば、IoUの値が0.5以上なら正解とみなします。この場合の0.5をIoU Threshold(閾値:しきいち)と呼びます。
このように予測されたBounding Boxが正解かどうかはIoU Thresholdの値に依存します。閾値を下げれば正解が増えるかもしれませんがあまり意味をなさなくなるので適度な値を使う必要があります。
ベンチマークの方式によっては0.5を使ったり0.75を使ったりと色々と工夫があります。これがmAPにも影響してバリエーションがを増やす理由の一つになっています。後ほど、COCOでの例を使って解説します。
さて、Bounding BoxとIoUで一匹の犬の位置の予測が正解かどうかを判断しましたが、犬が複数匹の場合には全ての予測を一つにまとめる指標が必要となります。
そこで今度は、複数の予測をまとめる指標であるPrecisionとRecallについて解説します。
Precision(適合率)
PrecisionもRecallも物体検出だけで使われる概念ではないのですが、ここではわかりやすいように引き続き犬を検出する前提で解説します。
Precisionは予測がどれだけ正解だったかを示します。例えば、犬の居場所を4つ予測して、そのうち2つのBounding BoxのIoUが0.5以上だったら4つの予測に対して2つの予測が正解なのでPrecisionは2/4=50%です。

繰り返しになりますが、ここでいう正解とはIoUの値がIoU Threshold以上だったかで決まります。
正解だった予測の数をTP(True Positive)と呼び、不正解だった予測の数を(False Positive)と呼びます。False Positiveという言葉は、予測ではポジティブ(犬がいると予測した場所)だが、実際には違った(犬がいなかった)という意味です。上記の例ではTPが2、FPが2になります。
TPとFPを使うとPrecisionの式は以下の通りです。
$$
Precision = \frac{TP}{TP+FP}
$$
ただし、Precisionだけを見てモデルを訓練すると、正解する自信が高い場合だけ予測を出すようになってしまいます。本当は犬が4匹いるのに確実に正解だと自信のある2つの Bounding Boxしか予測しないなどの不都合が生じます。
例えば、モデルが自信のある2つの予測しか出力しなかったら下図のようになるかもしれません。

ここでは、2つの予測が両方ともTPであり、FPがないのでPrecisionが100%になります。
しかし、これではモデルとしては十分な精度があるとは言えません。そこで、Precisionに加えて、Recallという指標も使います。
Recall(再現率)
Recallは正解として存在するもののうちどれだけを言い当てられたかを示します。
正解として犬の居場所が4つ存在するケースで、2つの居場所を言い当てたらRecallは2/4=50%です。

予測されなかった犬の数をFN(False Negative)と呼びます。「犬がいると判断しなかった場所」はモデルが「犬がいないと判断した」と考えます。つまり、False Negativeとはネガティブ(犬がいない場所)と判断した場所に実際には犬が存在しているという意味です。上図では、左下に2匹の犬がいますが、モデルはそれに気づいておらず「犬はそこには居ない」つまり、ネガティブだと誤って判断したことになります。
TPとFNを使うとRecallの式は以下の通りです。
$$
Recall = \frac{TP}{TP+FN}
$$
ただし、自信がなくともたくさんの犬の予測をすれば全ての犬を言い当てることができてしまい、FNが0になりRecallを高くすることができたりします。しかし、これではモデルの予測精度が良いとは言えないでしょう。

また、FNが減ってRecallは高くなっても、FPが増える可能性が高くPrecisionが低くなりがちです。上図では、8つの予測のうち4つがTPで4つがFPなのでPrecisionは50%です。
よってPrecisionとRecallが両方ともバランスよく高くなるようにモデルを訓練する必要があります。
ここでAverage Precisionが登場します。
Average Precision(AUC-PR)
AP(Average Precision)とは上述のPrecisionとRecallを合わせた指標です。Average Precisionという名前ですが、Precisionの単純平均ではないことに注意してください。
APの計算は、PrecitionとRecallの関係を示した図を使うと理解しやすいです。

自信のある予測だけを出力するようにするとPrecisionは高くなりますがRecallが低く、Recallを増やすために自信がない予測も出力するようにするとPrecisionが下がっていく傾向があるので、グラフ(オレンジ)が右肩下がりになります。この下がり具合が少ないほどモデルの精度が高く常に自信があるモデルと言えます。
下図の青色のグラフはモデルの精度がより高い場合を示しています。

つまり、グラフの下の領域が広いほどPrecisionもRecallも高く、モデルの精度が良いと言えます。このグラフの下の領域をAUC(the Area Under the Curve)と呼び、PrecisionとRecallのAUCをAUC-PRと呼びます。AUC-PRの値は0から1になります。
上図のように、滑らかなグラフの下の領域は、理論上はグラフを積分すれば計算できるのですが、実際にはグラフが滑らかになるケースの方が稀ですし、データが無数にあるわけではないので区間を設定して計算します。
仮にこんな予測評価のデータがあったとします。

するとグラフは以下のようになります。

APの計算は単純な掛け算と足し算を繰り返すだけになります。
$$
AP = 0.2×(1.0+0.9+0.7+0.6+0.5) = 0.74
$$
Recallの区間ごとのPrecisionから平均を取るのでAverage Precisionという名前になっています。
しかし、実際には同じ区間のRecallに対して複数の異なるPrecisionがあるのが普通で上図のような単純なグラフになりません。次のテーブルのように複数のPrecisionを同じRecallの区間に付け加えてグラフの変化を見てみましょう。

グラフがジグザグになってしまいました。

このままだと、どのPrecisionを使って計算すれば良いのか分からないので、Precisionは右に進むに従って上がることはないと仮定して計算します。あるRecallの区間とその右側にある全てのRecall区間での最大のPrecisionの値をそのRecallの区間の値に決めます。こうするとグラフが常に右肩下がりになります。
するとテーブルの値が次のように決まります。

各Recall区間のPrecisionの値が最初のものと同じになりました。よってAPの値も同じになります。
この方法ではグラフが常に右肩下がりになり、またRecall区間内のPrecisionのバラツキに影響されにくくなるという特徴があります。
全予測によるPrecisionとRecallの計算方法
ここまでは、PrecisionとRecallが計算されたものとして話しましたが、実際にPrecisionとRecallを計算する具体例としては、Jonathan Huiの記事にある5つのリンゴしかないデータセットの例が一番わかりやすいのでここでその手順を引用します。
データセットにリンゴが5個しかないとし、モデルは画像の中のリンゴの位置を予測します。予測する際に、モデルは自信度も出力します。この自信度の意味はモデルによって異なりますが、0から1で大きい数値ほど自信があるとし、予測の自信度による順番が決められるようになっています。
全ての画像に対してモデルが予測したものをモデルの自信度によって高い方から順番に並べます。また、その正解・不正解を記します。

これで上から順番にPrecisionを計算していきます。予測した数と正解の数によってPrecisionが決まります。

次に、Recallを計算します。データセット全体で5個リンゴがあるのをふまえて、上から順番にRecallを計算します。

上記のテーブルを眺めているとなぜPrecisionがジグザグになるのかが見えてくると思います。
mAP(mean Average Precision)
APを考えるときに、一つのクラス(犬)に限定して話をしてきました。
しかし、物体検出ではたくさんのクラスを扱うので、クラスごとのAPを算出する必要があります。
これらのAPをまとめて一つの指標にするために全てのAPの平均(mean)を計算したものがmAPになります。
COCO(Common Objects in Context)
COCOは物体検出のデータセットを提供しており、mAPによる評価を定義しています。多くのモデルがCOCOのデータセットと評価方式を採用しています。
ただし、注意点としてCOCOではmAPを単にAPと呼んでおり、それがクラス平均かどうかは文脈から判断するように述べています。よって、COCOのサイトの説明などを読むときに混乱しないように注意してください。
$${AP^{IoU=.50}}$$は、IoU Thresholdを0.50と設定して計算したmAPのことです。$${AP@.50}$$とも表示されます。
$${AP^{IoU=.75}}$$ならば、IoU Thresholdが0.75になります。これも$${AP@.75}$$と表示されたりします。
また、COCOがメインのmAPとして定義しているのは$${AP@[.50:.05:.95]}$$で、これはIoU Thresholdを0.50から0.05ずつ増やして0.95までのmAPの結果を平均したものになります。
$${AP^{IoU=.50}}$$
$${AP^{IoU=.55}}$$
$${AP^{IoU=.60}}$$
$${AP^{IoU=.65}}$$
$${AP^{IoU=.70}}$$
$${AP^{IoU=.75}}$$
$${AP^{IoU=.80}}$$
$${AP^{IoU=.85}}$$
$${AP^{IoU=.90}}$$
$${AP^{IoU=.95}}$$
また、物体検出の対象となるオブジェクトの大きさによってmAPの定義をしています。
$${AP^{small}}$$ (32平方ピクセル)
$${AP^{medium}}$$ (32から96平方ピクセル)
$${AP^{large}}$$ (それ以上)
最後に、他のデータセット(PASCAL VOCなど)ではAPの計算が少々異なりますが基本的な考え方は同じです。
最後に
mAPについての仕組みを理解すると、いくつかの問題点も見えてきます。
IoU Thresholdをいろんな値にしてmAPを計算するのは良いのですが、それが実際何を意味するのかは明確ではありません。例えば、IoU Threshold=0.50だとすごく成績が良いのに0.75だと悪いとしても、モデルの精度がすごく悪いということにはならないかもしれません。IoU Threshold=0.70でも測ってみたりして色々比較する必要があるかもしれません。キリが無いですね。
データセット内のクラスのバランス具合によって評価結果に異なる影響が出くることが考えられます。数が少ないクラスは訓練データが少ないので、APも悪くなりがちでmAP全体に影響を与えるかもしれません。よって、訓練中はAPをクラスごとにチェックするのも有効だと思われます。
mAPという指標は、さまざまな設定やデータセットに依存するものだということ理解しておくのは重要だと思います。
参照
COCO(Common Objects in Context)
https://cocodataset.org/#detection-eval
mAP(mean Average Precision)for Object Detection
https://jonathan-hui.medium.com/map-mean-average-precision-for-object-detection-45c121a31173
Breaking Down Mean Average Precision(mAP)
https://towardsdatascience.com/breaking-down-mean-average-precision-map-ae462f623a52
