IoU


Prologue


IUじゃなくIU対象検出モデル論文では,AP 50やAP 75のようにAP(Average Precision)にオプションを追加し,頻繁に会うことができる.論文を読んでいるうちに消化を急いでいたので、感覚で「ああ、なるほど」と言いました.この機会に整理することにしました.

It's one of eveluation metrics


Intersection of Unionをこう書きますPascal VOC、MSCOCOなどのデータセットからモデルを評価するために使用される.一般に,分類や回帰課題ではMAEやMSEを評価指標としているが,目標検出や分割の場合は評価があいまいで統計学的にティカ指数という統計値が与えられる.
J(A, B)=A∩BA∪BJ(\text{A, B})=\begin{array}{c}\text{A}\cap\text{B}\\\hline\text{A}\cup\text{B}\end{array}J(A, B)=A∩BA∪B​​

もともと提花指数は2つのサンプル群がどれだけ似ているかを知るために使われていた.2つのサンプル集団の集合が1の場合、交差の比率は0と1の間の値であり、1に近いほど、2つのサンプル集団は類似している.
IUはこの考えを持ってきた.ターゲットobjectの正解boundingbox(bbox)とモデル予測bboxがどれだけ似ているかを,提花指数で測定した.課題ごとに異なるが,0.5を超えるとうまく捉えられると思われ,これを閾値の基準とする.
IoU=Area of IntersectionArea of Union\text{IoU}=\begin{array}{c}\text{Area of Intersection}\\\hline\text{Area of Union}\end{array}IoU=Area of IntersectionArea of Union​​

Time to implement


IOUの概念を理解しました.今は実施すべきだ.IoUを求めるにはbboxごとに2つの座標しか知らない.左上、右下.あるいは逆にても大丈夫です.座標平面上の原点は左下ですが、コンピュータ入力は画像の左上隅を原点とします.ここでは座標平面を簡単に借りることができます.

私たちが知りたいのは2つのbboxが重なる分野です.上の画像では、bboxは赤で、モデルが予測したbboxは緑です.また、各bboxの左上隅と右下隅の座標を知っている場合、2つのbboxが重なる領域の2つの座標を知っていれば、幅を求めることができます.
複雑に見えますが、各座標をサイズ順に並べて出すと、中間の座標値を求めることでオーバーラップ領域の座標を求めることができます.
xayc整理後、左上隅座標x値の大きい値、y値の小さい値(xb、 ya)(x_b,\y_a)(xb​, ya)、右下角座標x値の小さい値、y値の大きい値(xc、 yd)(x_c,\y_d)(xc​, ydになる.
def get_iou(bbox_gt: list, bbox_p: list) -> float:
    '''
    Args
    	bbox_gt: List of ground truth coordinate.
        [upper left x, upper left y, bottom right x, bottom right y]
    	bbox_p: List of predicted coordinate.
        [upper left x, upper left y, bottom right x, bottom right y]
    return
    	Float Ratio of 2 bbox is overlapped
    '''
    x1 = max(bbox_gt[0], bbox_p[0])
    y1 = min(bbox_gt[1], bbox_p[1])
    x2 = min(bbox_gt[2], bbox_p[2])
    y2 = max(bbox_gt[3], bbox_p[3])
    
    intersection = (x2 - x1) * (y1 - y2)
    
    gt = (bbox_gt[2] - bbox_gt[0]) * (bbox_gt[1] - bbox_gt[3])
    p = (bbox_p[2] - bbox_p[0]) * (bbox_p[1] - bbox_p[3])
    
    union = gt + p - intersection
    
    iou = intersection / union
    
    return iou
    
bbox_gt = [250, 480, 580, 300]
bbox_p = [260, 500, 500, 320]
get_iou(bbox_gt, bbox_p)
>>> 0.5981308411214953

Epilogue


この文章でIUと知り合った.これからは論文をよりよく理解し、mapを理解する準備もできています.同時に、モデルがbboxをどのように予測しているのか知りたいです.では、別の文章から調べてみましょう.