混同行列の例(物体検知)

物体検知では、「クラスの分類すること」に加えて「物体の領域を検出する」こと 物体検出の評価指標では、画像分類のときとは異なり「物体の領域を検出すること」を含めて評価する

TNは背景予測

  • 物体検知のTNは背景予測になる
  • A true negative is simply the algorithm correctly stating that the area it checked does not hold an object
  • 物体検知のTPは予測とGTの重なりがあったこと
  • その逆なので、何もないところに何もない事を予測すること(背景予測)

GT boundign boxとPredicted bounding box

IoU(Intersection over Union)のいい例と悪い例

Precision, Recall, IoU

2つの領域がどれだけ重なっているかを[0, 1]の間の値で評価する

信頼スコア (Confidence Score)

  • 信頼度スコアとは、そのBboxがどこくらい物体を含んでいるのかを表すスコア
  • 評価のときは、PR曲線(RecallとPrecisionの曲線)を描くために、データの並び替えに使用される

予測したBboxの結果の一覧

  • 下の表の例では、ある画像の中に含まれるりんごを予測した例
  • りんごは画像の中に5個存在(GT Bbox=5)する
  • 予測結果として10個のりんごのBboxが検出された
  • PredictionのBboxとGTのBboxと重なりが50 > IoUの場合にTP、それ以下の場合はFPとなっている
  • 結果はcondidentce Scoreでソートされている
  • 無論、信頼スコアが高い方が、物体の確率が高いので、TPの割合が高いことは容易に想像できる
  • つまり、一般的には上の方がはTPが多く、下の方はFPが多いハズ

NOTE

  • 信頼度スコア(Confidence Score)は、あくまで物体がある信頼度であり、分類の信頼度ではないことに注意
  • また、しきい値的なことは評価のときは考えない
Prediction Bbox NoConfidence Score(%)TP/FP
#196True
#292True
#389False
#488False
#584False
#683True
#780True
#878False
#974False
#1072True

混同行列

物体検知では混同行列は次の指標となる

  • TP: Predicted BboxとGround-truth Bboxが十分に重なっている(IoU > 0.5)
    • つまり、重なった数
    • positiveの意味は重なりがpositiveかどうか
  • FP: Predicted Bboxに対してGround-truth Bbo1が十分に重なっていない (IoU < 0.5)
    • つまり、重ならなかったPrediction Bboxの数
  • FN: Ground-truth Bboxに対してPredicted Bboxが十分に重なっていない (IoU < 0.5)
    • つまり、重ならなかったGT Bboxの数
  • TN: そもそも、重ならないことは予測していないのでなし
    • つまり、背景は予測していない

NOTE: 下の表は混同行列っぽいが、混同行列ではないので注意

IoU ≥ 0.5IoU < 0.5
Predicted BBoxに対してGround-truth BBoxがTPFP
Ground-truth BBoxに対してPredicted BBoxがTPFN

$$ Precision = \frac{TP}{TP + FP} \\ Recall = \frac{TP}{TP + FN} $$

つまり、

$$ Precision = \frac{正しく(IoU≥0.5)で検出できた数}{全てのPredictedBBoxの数} \\ Recall = \frac{正しく(IoU≥0.5)で検出できた数}{全てのGTBBoxの数} $$

日本語にすると、

  • Precisionは
    • 全ての予測結果(IoUに限らず全てのPredicted BBox)の内,正しくIoUが0.5以上で予測できた割合を表す
  • Recallは
    • 実際の正解結果(GT BBox)の内,IoUが0.5以上で正解結果とほぼ近しい位置のBBoxを予測できた割合を表す

PrecisionとRecall

例を用いてPrecisionとRecallの計算例を示す

  • GT BBoxの数=5個だとして(つまり、りんごが5個あったと仮定して),
  • 機械が10個のりんごのbboxを予測していることを示している
Prediction Bbox NoConfidence Score(%)Correct?PrecisionRecall
#196True1/1 = 11/5 = 0.2
#292True2/2 = 12/5 = 0.4
#389False2/3 = 0.6672/5 = 0.4
#488False2/4 = 0.52/5 = 0.4
#584False2/5 = 0.42/5 = 0.4
#683True3/6 = 0.53/5 = 0.6
#780True4/7 = 0.5714/5 = 0.8
#878False4/8 = 0.54/5 = 0.8
#974False4/9 = 0.4444/5 = 0.8
#1072True5/10 = 0.55/5 = 1.0

Prediction Bbox Noが3番目の計算を例にとると、

$$ Precision = \frac{それまで見てきたTrueの数}{それまで見てきたPredicted BBoxの総数} = 2/3 = 0.667 $$

$$ Recall = \frac{それまで見てきたTrueの数}{全てのGT BBoxの数} = 2/5 = 0.4 $$

Djangoの例

射撃に例えると、

-射撃の精度(Precision)実際に的に当てた数(Recall)
信頼スコアが高いところの結果高め(狙い済まして当てている、スナイパーライフル)低め(少ししか撃っていないため)
信頼スコアが低いところの結果低め(数撃ちゃ当たる戦法、マシンガン)高め(たくさん撃って的にあたっているため)

つまり、次のことが言える

  • スナイパーライフルで絶対に当たるところ(信頼度が高いところのみ)だけ撃つと、
    • 精度は高いが、逃す確率も高い
  • マシンガンで数撃ちゃ当たる戦法だと、
    • 精度は低いが、当たる確率は高い

つまり、PrecisionとRecallはトレードオフ

  • 弾を撃てば撃つほど当てやすいが1発あたりの弾の精度は下がり、打たないほど当てにくいが1発あたりの精度は高い
  • 信頼スコアも高いところと低いところが混ざっているので、その2つが混在している
  • なので、総合的に判断しなければいけない

つまり、Djangoが必要ということ

兵士使用するたまの数撃った弾に対する射撃精度(precision)眼の前の敵に対する射撃精度(recall)
Django100発百発百中敵は絶対逃さない
スナイパー兵10発百発百中敵は逃しがち
マシンガン兵100万発百発撃って、1発命中敵は逃さない(当てる)

そして、実際には、部隊(モデル)には、スナイパー兵(信頼スコア高)とマシンガン兵(信頼スコア低)の射撃結果(予測結果)が混ざっているので、 じゃあ部隊の精度はどのくらいなのかを、PR曲線で算出する必要がある

PR曲線

NOTE:

  • ROC曲線と似ているが、ROC曲線ではないので注意
  • ROCはX軸はFPF, Y軸はTPF

最後に,先ほど求めた物体検出のPrecisionとRecallを用いて,APとmAPを計算する

  • AP (average precision)を出すためのもの
  • APを出すために,表2の結果のRecallを横軸,Precisionを縦軸にとり,グラフを描きます.

式は次。(r=recall, p=precisio)

$$ AP = \int_0^1 p(r) dr $$

  • 積分を行うために,上図のようにジグザグなパターンを滑らかにする
  • 具体的には,下図のように,各Recallのレベルで横に見た時に,Precisionの値が最大の値に置き換える

  • ここで原理的には通常の積分を行うのですが,
  • プログラム上で積分を行う際には,全ての点を扱うわけにはいかないので
  • 11点の代表点を取り、下で計算する

$$ AP = \frac{1}{11}*(p(0) + p(0.1) + ・・・ + p(1.0)) $$

結果、平均の精度であるAPを算出した

  • なお、11点はPascal VOCの場合
  • もし、複数物体の検出なら、クラスごとにAPがでるので、それを平均した$mAP$も算出する

MS COCO

Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.378
Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.560
Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.409
Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.194
Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.431
Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.539
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.303
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.483
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.511
Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.262
Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.577
Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.700
  • MS COCOは101点となる
  • なお、MS COCOのAPIの$AP_50$や$AP_75$はIoUの値が50%や75%以上でTPとするなどの、TPかのしきい値を変えたものである
  • IoU=0.50:0.95の意味は0.05刻みに0.50~0.95まで基準IoUを変えたmAPの平均
  • COCOではmAPとAPという言葉を区別せずに使っているので注意
  • small / medium / largeに分けたオブジェクトの大きさごとの値も測定している
  • -1.00の場合は該当なし

REFERENCES:

  • https://qiita.com/mdo4nt6n/items/08e11426e2fac8433fed
  • https://www.sigfoss.com/developer_blog/detail?actual_object_id=267
  • http://cocodataset.org/#detection-eval
  • http://www.thothchildren.com/chapter/5c5baad741f88f26724f6b46#:~:text=PR%E6%9B%B2%E7%B7%9A(Precision%2DRecall%20Curve,%E8%BB%B8%E3%81%AB%E3%83%97%E3%83%AD%E3%83%83%E3%83%88%E3%81%97%E3%81%9F%E3%82%B0%E3%83%A9%E3%83%95.&text=%E5%A4%A7%E6%96%B9ROC%E6%9B%B2%E7%B7%9A%E3%81%A8%E5%90%8C%E3%81%98,%E3%81%8C%E3%81%82%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB%E6%9C%89%E7%94%A8.
  • https://stackoverflow.com/questions/16271603/how-to-categorize-true-negatives-in-sliding-window-object-detection
  • https://medium.com/@jonathan_hui/map-mean-average-precision-for-object-detection-45c121a31173