最近在复现论文过程中需要计算IoU,对这个问题苦恼已久,同时由于YOLO输出的坐标在图上是左上角顶点和右下角顶点,但是图是倒着的,即Y轴向下,因此实际上输出的坐标是左下角顶点和右上角顶点,由于强迫症我将它们转化成了常用直角坐标系下的左上右下顶点,因此在判断是否相交以及计算IoU的代码与原始代码有差别,遂进行记录分享:
判断两个预测框是否重叠的函数定义如下:
def check_intersection(a, b):
x1, y1, x2, y2 = a[0:4]
x3, y3, x4, y4 = b[0:4]
if x2 < x3 or x4 < x1 or y3 < y2 or y4 > y1:
return False
else:
return True
计算IoU的代码如下:
def calculate_iou(a, b):
x1, y1, x2, y2 = a[0:4]
x3, y3, x4, y4 = b[0:4]
x_overlap = min(x2, x4) - max(x1, x3)
y_overlap = min(y1, y3) - max(y2, y4)
if x_overlap > 0 and y_overlap > 0:
intersection_area = x_overlap * y_overlap
# 计算并集面积
area_a = (x2 - x1 ) * (y1 - y2 )
area_b = (x4 - x3 ) * (y3 - y4)
union_area = area_a + area_b - intersection_area
# 计算IoU值
iou = intersection_area / union_area
注意:我的边界框坐标与YOLO输出的不同,YOLO输出的坐标是x轴向右为正方向和y轴向下为正方向的矩形的左上角和右下角顶点坐标,但在Y轴向上为正方向的矩形中为左下和右上坐标,我由于强迫症将它转换成了标准直角坐标系下左上右下的坐标,因此计算方式与原本的有差别。