对于轴对齐的边界框,它相对简单。 “轴对齐”表示边界框未旋转;换句话说,框线平行于轴。这是计算两个与轴对齐的边界框的IoU的方法。
def get_iou(bb1, bb2):
"""
Calculate the Intersection over Union (IoU) of two bounding boxes.
Parameters
----------
bb1 : dict
Keys: {'x1', 'x2', 'y1', 'y2'}
The (x1, y1) position is at the top left corner,
the (x2, y2) position is at the bottom right corner
bb2 : dict
Keys: {'x1', 'x2', 'y1', 'y2'}
The (x, y) position is at the top left corner,
the (x2, y2) position is at the bottom right corner
Returns
-------
float
in [0, 1]
"""
assert bb1['x1'] < bb1['x2']
assert bb1['y1'] < bb1['y2']
assert bb2['x1'] < bb2['x2']
assert bb2['y1'] < bb2['y2']
# determine the coordinates of the intersection rectangle
x_left = max(bb1['x1'], bb2['x1'])
y_top = max(bb1['y1'], bb2['y1'])
x_right = min(bb1['x2'], bb2['x2'])
y_bottom = min(bb1['y2'], bb2['y2'])
if x_right < x_left or y_bottom < y_top:
return 0.0
# The intersection of two axis-aligned bounding boxes is always an
# axis-aligned bounding box
intersection_area = (x_right - x_left) * (y_bottom - y_top)
# compute the area of both AABBs
bb1_area = (bb1['x2'] - bb1['x1']) * (bb1['y2'] - bb1['y1'])
bb2_area = (bb2['x2'] - bb2['x1']) * (bb2['y2'] - bb2['y1'])
# compute the intersection over union by taking the intersection
# area and dividing it by the sum of prediction + ground-truth
# areas - the interesection area
iou = intersection_area / float(bb1_area + bb2_area - intersection_area)
assert iou >= 0.0
assert iou <= 1.0
return iou
说明
图片来自此答案
0
在大图像中测试对象检测算法时,我们将检测到的边界框与为地面真相矩形给出的坐标进行比较。
根据Pascal VOC的挑战,存在以下问题:
这意味着我们需要计算重叠百分比。这是否意味着地面真相框被检测到的边界框覆盖了50%?还是边界真值框吸收了边界框的50%?
我进行了搜索,但没有找到标准的算法-这令人惊讶,因为我会认为这在计算机视觉中很常见。 (我是新来的)。我错过了吗?有谁知道这种类型的问题的标准算法是什么?