定义:测量在特定数据集中检测相应物体准确度的一个标准
图像理解:Ground-truth bounding box :地面测量真实边界框(绿色)
Pridicted bounding box:预测值边界框(红色)
计算公式:
总的目的是求出相交部分的面,再求出总的面积,最后求比值
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
参考文章来源: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]
计算结果类似的代码为,但不为列表:
总结:
# 列表推导公式: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上面的、左面、下面、右面的线所在的坐标
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总的面积
验算了一个,是对的