矩阵运算:求giou

矩阵运算:求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

相关文章: