IOU代码
import numpy as np
def iou(box,boxes,isMin=False):#框的格式定义为:[X1,Y1,X2,Y2,C]。一个框和一堆框做比较。为了区分交集是与并集作比较还是和最小面积做比较,先将最小面积赋予默认值0.
#计算每个框的面积
box_area=(box[2]-box[0])*(box[3]-box[1])#先计算box的面积。一个框的面积计算:(X2-X1)*(Y2-Y1)。索引拿到坐标值:(box[2]-box[0])*(box[3]-box[1])
boxes_area=(boxes[:,2]-boxes[:,0])*(boxes[:,3]-boxes[:,1])#一堆框的格式:[[],[],[],[],[],...]
#计算交集面积
xx1=np.maximum(box[0],boxes[:,0])#左上角X。交集左上角点坐标:两个相交原框中左上角X和Y各自取较大值,作为交集左上角坐标。用于比较的框的左上角x值:box[0];被比较的框的左上角x值:boxes[0]。去两者较大值。
yy1=np.maximum(box[1],boxes[:,1])#同理.左上角Y。
xx2 = np.minimum(box[2], boxes[:, 2]) # 同理.右下角X。
yy2 = np.minimum(box[3], boxes[:, 3]) # 同理.右下角Y。
#判断是否有交集
w=np.maximum(0,xx2-xx1)#当xx2-xx1的值为负值时,表示没有交集,将没有交集的结果变成0即可。使用maximum函数取较大值。
h=np.maximum(0,yy2-yy1)#同理。
#正式计算交集面积
inter=w*h
if isMin:#如果isMin为True,表示除以最小面积。
over=np.true_divide(inter,np.minimum(box_area,boxes_area))#true_divide:除法。isMin为True时,除以最小面积。如何得到最小面积呢?比较box_area和boxes_area,取最小值就可得到最小面积。
else:#否则,除以并集面积。
over = np.true_divide(inter, (box_area+boxes_area-inter))#两个矩形面积相加减去交集面积
return over
来源:CSDN
作者:Clb@Xzh
链接:https://blog.csdn.net/sinat_39783664/article/details/104142787