IOU代码详细解释


定义:测量在特定数据集中检测相应物体准确度的一个标准

图像理解:Ground-truth bounding box :地面测量真实边界框(绿色)

                  Pridicted bounding box:预测值边界框(红色)

IOU代码详细解释_第1张图片

计算公式:

IOU代码详细解释_第2张图片

总的目的是求出相交部分的面,再求出总的面积,最后求比值

python代码:

1 def bb_intersection_over_union(boxA, boxB):
#定义一个函数来计算IOU的值
2    boxA = [int(x) for x in boxA]
3    boxB = [int(x) for x in boxB]
 
4    xA = max(boxA[0], boxB[0])
5    yA = max(boxA[1], boxB[1])
6    xB = min(boxA[2], boxB[2])
7    yB = min(boxA[3], boxB[3])
 
8    interArea = max(0, xB - xA + 1) * max(0, yB - yA + 1)
 
9    boxAArea = (boxA[2] - boxA[0] + 1) * (boxA[3] - boxA[1] + 1)
10    boxBArea = (boxB[2] - boxB[0] + 1) * (boxB[3] - boxB[1] + 1)
    
11    iou = interArea / float(boxAArea + boxBArea - interArea)
 
12    return iou

 解析第2行    boxA = [int(x) for x in boxA]

参考文章来源:https://blog.csdn.net/aic1999/article/details/79752864

解释与之类似:

y= [x*x for x in range(10)]

输出的是一个列表:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

计算结果类似的代码为,但不为列表:

IOU代码详细解释_第3张图片

总结:

 # 列表推导公式:c for b in a : 

首先for b in a 很好理解:

然后我们对这个b进行c操作,并且以c操作后的形式输出一个列表。

y= [x*x for x in range(10)]

所以实现的就是输出一个从0~99的平方数的列表。

  boxA = [int(x) for x in boxA]的意思也就是从boxA中提取每一个元素x,并且每一个元素均为正数

参考文章:https://blog.csdn.net/weixin_38145317/article/details/89211286,

# box1=[top, left, bottom, right]=[x1_min,y1_min,x1_max,y1_max] # box1上面的、左面、下面、右面的线所在的坐标
# box2=[top, left, bottom, right]=[x2_min,y2_min,x2_max,y2_max] # box2上面的、左面、下面、右面的线所在的坐标

 IOU代码详细解释_第4张图片

4    xA = max(boxA[0], boxB[0])     #BoxA、BoxB两个宽度之间的交集的左边值,即阴影的宽度w的最左边值
5    yA = max(boxA[1], boxB[1])     #BoxA、BoxB两个高度之间的交集的上面边值,即阴影的高度h的最上边值
6    xB = min(boxA[2], boxB[2])      #BoxA、BoxB两个宽度之间的交集的左边值,即阴影的宽度w的最右边值
7    yB = min(boxA[3], boxB[3])      #BoxA、BoxB两个高度之间的交集的上面边值,即阴影的高度h的最下边值

最后经过(xA,0),( xB,0),(0, yA ),(0,yB)的直线最后中为计算公式-----分子-----阴影部分

阴影部分的面积(xB - xA) *(yB -  yA)

代码:

8    interArea = max(0, xB - xA + 1) * max(0, yB - yA + 1)     #BoxA,BoxB相交阴影部分面积

至于为什么这么写,还需要一个大佬来解决吧,我的思考是有可能就是判断boxA、boxB之间是否有交集而写的

9    boxAArea = (boxA[2] - boxA[0] + 1) * (boxA[3] - boxA[1] + 1)            #boxA的面积
10    boxBArea = (boxB[2] - boxB[0] + 1) * (boxB[3] - boxB[1] + 1)          #boxB的面积

11    iou = interArea / float(boxAArea + boxBArea - interArea)                #阴影部分/ boxA、boxB总的面积

IOU代码详细解释_第5张图片

验算了一个,是对的

 

 

你可能感兴趣的:(IOU代码详细解释)