【面试向】IoU和mIoU

害,要开始正儿八经地准备刷面试题了,今个咱就拿这个IoU开刀。

虽然老夫从来没做过基于检测框的目标检测项目。

Q1:啥是IoU?如何计算IoU?

IoU就是交并比嘛,两个框相交的面积除以合并的面积。

定义bbox1, bbox2为两个长度为 4 的数组,用于表示两个检测框左上和右下坐标点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def BoxIoU(bbox1, bbox2):
x11, y11, x12, y12 = bbox1
x21, y21, x22, y22 = bbox2

# 计算相交面积
iw = max(min(x12, x22) - max(x11, x21), 0)
iy = max(min(y12, y22) - max(y11, y21), 0)
inter = iw * iy

# 计算合并面积
area1 = (x12 - x11) * (y12 - y11)
area2 = (x22 - x21) * (y22 - y21)
uni = area1 + area2 - inter

# 计算交并比
iou = inter / uni
return iou

其实以上应该都只是基于常规检测框的IoU计算,如果是非矩形检测框或者分割任务中的IoU则要另当别论。

对于分割任务,定义mask1, mask2为两个相同大小的二维二值numpy数组。

1
2
def SegIoU(mask1, mask2):
return (mask1 & mask2).sum() / (mask1 | mask2).sum()

Q2:啥是mIoU?如何计算mIoU?

mIoU即均交并比。对于每个类计算一遍IoU后取平均就行了。

-------------本文结束感谢您的阅读-------------