如何通过python实现IOU计算代码实例
IntersectionoverUnion(IOU)是一种测量在特定数据集中检测相应物体准确度的一个标准。IoU是一个简单的测量标准,只要是在输出中得出一个预测范围(boundingboxes)的任务都可以用IoU来进行测量。
IoU分数是对象类别分割问题的标准性能度量[1]。给定一组图像,IoU测量给出了在该组图像中存在的对象的预测区域和地面实况区域之间的相似性
计算两个矩形的交并比,通常在检测任务里面可以作为一个检测指标。你的预测bbox和groundtruth之间的差异,就可以通过IOU来体现。
代码如下
#!/usr/bin/envpython
#encoding:utf-8
importnumpyasnp
'''
函数说明:计算两个框的重叠面积
输入:
rec1第一个框xminyminxmaxymax
rec2第二个框xminyminxmaxymax
输出:
iouv重叠比例0没有
'''
defcompute_iou(rec1,rec2):
#computingareaofeachrectangles
S_rec1=(rec1[2]-rec1[0])*(rec1[3]-rec1[1])#H1*W1
S_rec2=(rec2[2]-rec2[0])*(rec2[3]-rec2[1])#H2*W2
#computingthesum_area
sum_area=S_rec1+S_rec2#总面积
#findtheeachedgeofintersectrectangle
left_line=max(rec1[0],rec2[0])
right_line=min(rec1[2],rec2[2])
top_line=max(rec1[1],rec2[1])
bottom_line=min(rec1[3],rec2[3])
#judgeifthereisanintersect
ifleft_line>=right_lineortop_line>=bottom_line:
#print("没有重合区域")
return0
else:
#print("有重合区域")
intersect=(right_line-left_line)*(bottom_line-top_line)
iouv=(float(intersect)/float(sum_area-intersect))*1.0
returniouv
'''
函数说明:获取两组匹配结果
输入:
rectA车位
rectB车辆
threod重叠面积最小数值界限默认0.6
输出:
CarUse一维数组保存是否占用1占用0没有
'''
defTestCarUse(rectA,rectB,threod=0.6,debug=0):
#threod=0.8#设定最小值
ALength=len(rectA)
BLength=len(rectB)
#创建保存匹配结果的矩阵
recIOU=np.zeros((ALength,BLength),dtype=float,order='C')
#用于记录车位能够使否占用
CarUse=np.zeros((1,ALength),dtype=int,order='C')
foriinrange(0,ALength):
forjinrange(0,BLength):
iou=compute_iou(rectA[i],rectB[j])
recIOU[i][j]=format(iou,'.3f')
ifiou>=threod:
CarUse[0,i]=1#有一个超过匹配认为车位i被占用
ifdebug==1:
print('----匹配矩阵----')
print(recIOU)
'''
print('----车位占用情况----')
foriinrange(0,ALength):
msg='车位'+str(i)+"-"+str(CarUse[0][i])
print(msg)
'''
returnCarUse
if__name__=='__main__':
#A代表车位
rectA1=(30,10,70,20)
rectA2=(70,10,80,20)
rectA=[rectA1,rectA2]
#B代表检测车辆
rectB1=(20,10,35,20)
rectB2=(30,15,70,25)
rectB3=(70,10,80,20)
rectB=[rectB1,rectB2,rectB3]
#获取车位占用情况rectA车位rectB车辆0.6占面积最小比
CarUse=TestCarUse(rectA,rectB,0.6,1)
print('----车位占用情况----')
foriinrange(0,len(CarUse)+1):
msg='车位'+str(i)+"-"+str(CarUse[0][i])
print(msg)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。