矩阵运算:求giou
import numpy as np
a = np.array([[0, 0, 3, 3],
[1, 1, 4, 3],
[1, 1, 3, 3]
])
b = np.array([[1, 1, 4, 3],
[3, 0, 4, 3]
])
先求出最大面积, x中的最大值和最小值 y中的最大值和最小值
x_a_min = a[:,0].reshape((-1, 1))
x_min = np.minimum(x_a_min, b[:, 0])
x_a_max = a[:, 2].reshape((-1, 1))
x_max = np.maximum(x_a_max, b[:, 2])
y_a_min = a[:,1].reshape((-1, 1))
y_min =np.minimum(y_a_min, b[:,1])
y_a_max = a[:, 3].reshape((-1, 1))
y_max = np.maximum(y_a_max, b[:,3])
area_c = (x_max-x_min)*(y_max-y_min)
在求出交叉的面积
先求出第一个矩形的长宽
wa = (a[:, 2] - a[:, 0]).reshape((-1, 1))
ha = (a[:, 3] - a[:, 1]).reshape((-1, 1))
求出第二个矩形的长宽
wb = (b[:, 2] - b[:, 0])
hb = (b[:, 3] -b[:, 1])
求出交叉的长宽
w = x_min +wa+wb - x_max
h = y_min+ha+hb - y_max
交叉面积
area = w*h
print(‘area’, area)
#并集的面积
area_a = (a[:, 2]-a[:, 0])*(a[:, 3]-a[:, 1])
area_a = area_a.reshape((-1, 1))
print(‘area_a’, area_a)
area_b = (b[:, 2]-b[:, 0])*(b[:, 3]-b[:, 1])
print(‘area_b’, area_b)
sum_area = area_a+area_b
print(‘add_area’, sum_area)
giou
并集面积
add_area = sum_area - area
end_area = (area_c-add_area)/area_c
giou = box_ious - end_area # box_iou是 ious