物体検出におけるmAP(meanAveragePrecision)に関しての疑問点

# 1. 物体検出におけるmAP(meanAveragePrecision)に関して

## 1.1. 目次

- [1. 物体検出におけるmAP(meanAveragePrecision)に関して](#1-物体検出におけるmapmeanaverageprecisionに関して)
  - [1.1. 目次](#11-目次)
  - [1.2. 結論](#12-結論)
  - [1.3. イントロダクション](#13-イントロダクション)
  - [1.4. 疑問点と調査](#14-疑問点と調査)
        - [1.4.1. AP@50やAP@75などの複数の指標について](#141-ap50やap75などの複数の指標について)
        - [1.4.2. 複数画像でのAPの計算](#142-複数画像でのapの計算)
        - [1.4.3. 正解ボックスの１対１対応について](#143-正解ボックスの１対１対応について)
  - [1.5. その他わかったこと](#15-その他わかったこと)
        - [1.5.1. pycocotoolsの使い方](#151-pycocotoolsの使い方)
        - [1.5.2. APの計算方法(PR曲線の面積の計算について)](#152-apの計算方法pr曲線の面積の計算について)

## 1.2. 結論

物体検出の指標のmAPの解説記事読んだ。
次の疑問点が浮かんだので調べた。

- Q. AP@50やAP@75などの複数の指標があるのはなぜか？
  - A. タスクの厳しさによって指標を変えてるのではないかと考察。ちなみにPascalVOCデータセットだとAP@50で算出して、COCOデータセットだとAP@50からAP@95まで0.05刻みでAPを算出してAP@50とAP@75とすべてのAPの平均値を使っている。
- Q. 複数画像の場合のAPの計算はどうなるのか？
  - A. 複数画像の場合は、すべての予測ボックスをTPとFPに振り分けてからPR曲線を作って計算している。
- Q. 予測ボックスがTPに分類された時にIoUを計算した正解ボックスは再利用されるのか？（1対1対応なのか？）
  - A. １対１対応である。

## 1.3. イントロダクション

物体検出にはmAP(meanAveragePrecision)と呼ばれる指標が使われている。
この指標は、物体検出モデルのPrecision(精度)とRecall(再現性)の両方を評価することができる指標である。
計算方法は、まずカテゴリ毎に予測ボックスをTPとFPに分類してPrecisionとRecallを計算する。
その結果をもとにPR曲線を作成し曲線の面積を計算することでカテゴリ毎のAPが得られる。
そしてカテゴリの種類で平均をとるという方法である。
予測ボックスをTPとFPに分類するには、予測ボックスと正解ボックスとの`IoU(Inter Of Union)`と呼ばれるスコアを算出して閾値を超えているモノをTP、超えていないモノをFPとする手法を用いる。
これらのより具体的な解説に関しては以下の記事に記載しているのでココでは解説しない。

- AP計算とIoUの計算<https://qiita.com/cv_carnavi/items/08e11426e2fac8433fed>

この記事では、この指標の計算方法について疑問に思った点（当たり前すぎて解説していないのかもしれない）を記載していく。
疑問に思った点は以下である。

- AP@50やAP@75などの指標があるのはなぜか？
- APの計算は複数画像の場合どうなるのか？
- 予測ボックスがTPに分類された時にIoUを計算した正解ボックスは再利用されるのか？（1対1対応なのか？）

上記の疑問点に関して、物体検出の有名なデータセットである COCO Dataset のコンペティションの評価プログラムを見ながら適宜解決していく。
- [COCO Dataset](https://cocodataset.org/#download)
- [pycocotools COCO Datasetの評価プログラム](https://github.com/cocodataset/cocoapi/tree/master/PythonAPI)

## 1.4. 疑問点と調査

### 1.4.1. AP@50やAP@75などの複数の指標について

AP@hoge のhogeの部分は予測ボックスをTPとFPに振り分けるためのIoU閾値である。
この閾値が高いと、正解ボックスとの一致具合が厳しくなるのでAPが低くなる。
ゆえに、タスクにおける予測の精度が厳しい場合、高いIoU閾値を用いる指標が用いられると考えられる。例えば、検出結果の対象物をロボットで掴むなどのタスクなどでは、厳しい予測が必要になるだろう。

補足として、有名なデータセットである`PascalVOC`データセットでは`AP@50`が使われている。
また、有名なデータセットである`COCO`データセットでは`AP@50`から`AP@95`まで`0.05`刻みのAPが計算されて、すべてのAPの平均と`AP@50`と`AP@75`が用いられる。

### 1.4.2. 複数画像でのAPの計算

APの計算の説明は単体の画像についての説明が多く。複数の画像での計算方法がよくわからなかった。
そのため次の2つの計算方法が考えついた。

1. 単体の画像で予測ボックスをTPとFPに振り分けてからAPを計算し、すべての画像でのAPを平均してモデルのAPとする
2. 画像ごとに予測ボックスをTPとFPに振り分けてから全ての予測ボックスでAPを計算してモデルのAPとする。
   
この違いについてはCOCO Datasetの評価プログラムである[pycocotools](https://github.com/cocodataset/cocoapi/tree/master/PythonAPI)のプログラムを見てきた。
その結果、プログラムでは後者の処理を行っていた。
具体的な処理は以下であった。

- 予測ボックスの数に合わせたTPFP分類用配列を用意してゼロで初期化する。
- 予測ボックスがTPに分類される場合対応する正解ボックスのIDを代入する
- 全ての画像で上記を行う
- 全ての画像でのTPFP分類用配列を連結する。
- TPFP分類用配列のゼロ以外の要素のあるモノをTP、ゼロのモノをFPに分類する
- APを計算する

### 1.4.3. 正解ボックスの１対１対応について

TPFPの分類は、予測ボックスと正解ボックスとのIoUが閾値を超えているかで判定される。
予測ボックスがTPに分類される場合、その予測ボックスは正解ボックスに近しいわけである。
ところが、１つの正解ボックスに対して予測ボックスが複数重なる場合がある。
正解ボックスとのIoUが閾値以下の場合は問題ないが、閾値を超えている場合はどのようにするべきか？この点について書かれている情報が見つけられなかった。
そこで再び[pycocotools](https://github.com/cocodataset/cocoapi/blob/master/PythonAPI/pycocotools/cocoeval.py)のプログラムを見てきた。
その結果、正解ボックスはただ一つの予測ボックスと対応する　ことがわかった。
具体的な処理は以下であった。

- 予測ボックスをConfidenceScoreの順に並べる
- 予測ボックスと正解ボックスの全てのIOUを計算した行列を作成する
- 予測ボックスをConfidenceScoreの順に見ていき、閾値を超えた最大のIoUを持つ正解ボックスとの組み合わせを探す。
  - 正解ボックスが使用済みなら無視する
- 組み合わせがあれば、予測ボックスをTPとし、正解ボックスに使用済みのフラグを立てる

## 1.5. その他わかったこと

### 1.5.1. pycocotoolsの使い方

違う記事で記述予定

### 1.5.2. APの計算方法(PR曲線の面積の計算について)

APの計算に関して、COCO Datasetでは全ての面積を計算するのでなく101ポイントでの補間手法が用いられていた。
ちなみに PascalVOC では11ポイント補間手法を用いている。