import numpy as np
# 定义IOU(交并比)计算公式, 传入真实框和其他移动后的框
def iou(box, boxes, isMin=False):
# 计算原始真实框的面积
box_area = (box[2] - box[0]) * (box[3] - box[1])
# 计算移动后的框的面积,这里计算的是矩阵
boxes_area = (boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1])
# 找到两个框的内部点计算交集
x1 = np.maximum(box[0], boxes[:, 0])
y1 = np.maximum(box[1], boxes[:, 1])
x2 = np.minimum(box[2], boxes[:, 2])
y2 = np.minimum(box[3], boxes[:, 3])
# 然后找到交集区域的长和宽,有的框没有交集那么相差可能为负,所以需要使用0来规整数据
w = np.maximum(0, x2 - x1)
h = np.maximum(0, y2 - y1)
# 计算交集的面积
inter_area = w * h
# 两种计算方法:1是交并比等于交集除以并集,2是交集除以最小的面积
if isMin:
ovr_area = np.true_divide(inter_area, np.minimum(boxes_area, box_area))
else:
ovr_area = np.true_divide(inter_area, (boxes_area + box_area - inter_area))
# 返回交并比,也就是IOU
return ovr_area
# 定义NMS,筛选符