【物体検出】 Intersection over Union (IoU) の計算の仕方
この記事で学ぶこと
先日解説したYOLOなどの物体検出(Object Detection)でIoUという言葉が出てくるのですが、これはIntersection over Unionの略です。
たとえば、答えとしてのBounding Boxが以下のようにあったとします。

モデルが予測するBounding Boxがこれとどの程度重なり合っているのかを値で示すのがIoUになります。
それでは具体例を交えながらIoUの概念を理解し計算の仕方を学びましょう。
完全一致
完全に一致した場合はIoUは1です。

全くの外れ
仮に予測が全くの外れだと、IoUはゼロになります。かすりもしていません。

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

これはIoUの文字通り、Intersection(重なっている部分の面積)をUnion(赤と青の両方の四角で囲まれた面積)で割れば良いわけです。
$$
IoU = \frac{重なった面積}{赤の面積+青の面積ー重なった面積}
$$
下図で重なった部分を黒く表示しています。この部分が赤と青でカバーされている面積に近づくほどIoUは1に近づきます。

IoUの計算方法
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 = \frac{Intersection}{Union}}$$が計算できます。
今日はここまで。
