キカベン
機械学習でより便利な世の中へ
G検定対策
お問い合わせ
   

Intersection over Union (IoU) の計算の仕方

thumb image

先日解説したYOLOなどの物体検出(Object Detection)でIoUという言葉が出てくるのですが、これはIntersection over Unionの略です。

たとえば、答えとしてのBounding Boxが以下のようにあったとします。

モデルが予測するBounding Boxがこれとどの程度重なり合っているのかを値で示すのがIoUになります。

完全に一致した場合はIoUは1です。

仮に予測が全くの外れだと、IoUはゼロになります。

では、予測がズレているけど重なりがある場合はどのようにIoUを計算するのでしょうか。

これはIoUの文字通り、Intersection(重なっている部分の面積)をUnion(赤と青の両方の四角で囲まれた面積)で割れば良いわけです。

IoU = 重なった面積 /(赤の面積+青の面積ー重なった面積)

下図で重なった部分を黒く表示しています。この部分が赤と青でカバーされている面積に近づくほどIoUは1に近づきます。

PyTorchのTorchvisionではtorchvision.ops.boxes.box_iouなどの関数が用意されているのでそれを使えばいいのですが、ここでは自分で計算してみましょう。

四角は左上(x1、y1)と右下(x2、y2)で指定します。

よって、赤と青の二つの四角をrとbとすると、

これで、赤と青の面積が計算できます。

赤の面積:r_area = (r.x2 – r.x1) x (r.y2 – r.y1)

青の面積:b_area = (b.x2 – b.x1) x (b.y2 – b.y1)

単純に、幅と高さを掛け合わせているだけですね。

重なった部分の幅と高さは次のように計算できます。

重なった幅 w = min( b.x2, r.x2 ) – max( b.x1, r.x1 )

重なった高さ h = min( b.y2, r.y2 ) – max( b.y1, r.y1 )

よって、重なった面積はIntersection = w x hです。

また、赤と青でカバーされている面積は、

Union = r_area + b_area – w x h

w x hを差し引いているのはr_areaとb_areaを単純に足しただけだと重なっている部分の面積が2倍になってしまうからです。

以上で、IoU = Intersection / Unionが計算できます。

今日はここまで。



コメントを残す

メールアドレスは公開されません。