forked from PulseFocusPlatform/PulseFocusPlatform
152 lines
4.0 KiB
Python
152 lines
4.0 KiB
Python
import numpy as np
|
|
import sys
|
|
import time
|
|
from shapely.geometry import Polygon
|
|
import paddle
|
|
|
|
paddle.set_device('gpu:0')
|
|
paddle.disable_static()
|
|
|
|
try:
|
|
from rbox_iou_ops import rbox_iou
|
|
except Exception as e:
|
|
print('import custom_ops error', e)
|
|
sys.exit(-1)
|
|
|
|
# generate random data
|
|
rbox1 = np.random.rand(13000, 5)
|
|
rbox2 = np.random.rand(7, 5)
|
|
|
|
# x1 y1 w h [0, 0.5]
|
|
rbox1[:, 0:4] = rbox1[:, 0:4] * 0.45 + 0.001
|
|
rbox2[:, 0:4] = rbox2[:, 0:4] * 0.45 + 0.001
|
|
|
|
# generate rbox
|
|
rbox1[:, 4] = rbox1[:, 4] - 0.5
|
|
rbox2[:, 4] = rbox2[:, 4] - 0.5
|
|
|
|
print('rbox1', rbox1.shape, 'rbox2', rbox2.shape)
|
|
|
|
# to paddle tensor
|
|
pd_rbox1 = paddle.to_tensor(rbox1)
|
|
pd_rbox2 = paddle.to_tensor(rbox2)
|
|
|
|
iou = rbox_iou(pd_rbox1, pd_rbox2)
|
|
start_time = time.time()
|
|
print('paddle time:', time.time() - start_time)
|
|
print('iou is', iou.cpu().shape)
|
|
|
|
|
|
# get gt
|
|
def rbox2poly_single(rrect, get_best_begin_point=False):
|
|
"""
|
|
rrect:[x_ctr,y_ctr,w,h,angle]
|
|
to
|
|
poly:[x0,y0,x1,y1,x2,y2,x3,y3]
|
|
"""
|
|
x_ctr, y_ctr, width, height, angle = rrect[:5]
|
|
tl_x, tl_y, br_x, br_y = -width / 2, -height / 2, width / 2, height / 2
|
|
# rect 2x4
|
|
rect = np.array([[tl_x, br_x, br_x, tl_x], [tl_y, tl_y, br_y, br_y]])
|
|
R = np.array([[np.cos(angle), -np.sin(angle)],
|
|
[np.sin(angle), np.cos(angle)]])
|
|
# poly
|
|
poly = R.dot(rect)
|
|
x0, x1, x2, x3 = poly[0, :4] + x_ctr
|
|
y0, y1, y2, y3 = poly[1, :4] + y_ctr
|
|
poly = np.array([x0, y0, x1, y1, x2, y2, x3, y3], dtype=np.float32)
|
|
return poly
|
|
|
|
|
|
def intersection(g, p):
|
|
"""
|
|
Intersection.
|
|
"""
|
|
|
|
g = g[:8].reshape((4, 2))
|
|
p = p[:8].reshape((4, 2))
|
|
|
|
a = g
|
|
b = p
|
|
|
|
use_filter = True
|
|
if use_filter:
|
|
# step1:
|
|
inter_x1 = np.maximum(np.min(a[:, 0]), np.min(b[:, 0]))
|
|
inter_x2 = np.minimum(np.max(a[:, 0]), np.max(b[:, 0]))
|
|
inter_y1 = np.maximum(np.min(a[:, 1]), np.min(b[:, 1]))
|
|
inter_y2 = np.minimum(np.max(a[:, 1]), np.max(b[:, 1]))
|
|
if inter_x1 >= inter_x2 or inter_y1 >= inter_y2:
|
|
return 0.
|
|
x1 = np.minimum(np.min(a[:, 0]), np.min(b[:, 0]))
|
|
x2 = np.maximum(np.max(a[:, 0]), np.max(b[:, 0]))
|
|
y1 = np.minimum(np.min(a[:, 1]), np.min(b[:, 1]))
|
|
y2 = np.maximum(np.max(a[:, 1]), np.max(b[:, 1]))
|
|
if x1 >= x2 or y1 >= y2 or (x2 - x1) < 2 or (y2 - y1) < 2:
|
|
return 0.
|
|
|
|
g = Polygon(g)
|
|
p = Polygon(p)
|
|
#g = g.buffer(0)
|
|
#p = p.buffer(0)
|
|
if not g.is_valid or not p.is_valid:
|
|
return 0
|
|
|
|
inter = Polygon(g).intersection(Polygon(p)).area
|
|
union = g.area + p.area - inter
|
|
if union == 0:
|
|
return 0
|
|
else:
|
|
return inter / union
|
|
|
|
|
|
# rbox_iou by python
|
|
def rbox_overlaps(anchors, gt_bboxes, use_cv2=False):
|
|
"""
|
|
|
|
Args:
|
|
anchors: [NA, 5] x1,y1,x2,y2,angle
|
|
gt_bboxes: [M, 5] x1,y1,x2,y2,angle
|
|
|
|
Returns:
|
|
|
|
"""
|
|
assert anchors.shape[1] == 5
|
|
assert gt_bboxes.shape[1] == 5
|
|
|
|
gt_bboxes_ploy = [rbox2poly_single(e) for e in gt_bboxes]
|
|
anchors_ploy = [rbox2poly_single(e) for e in anchors]
|
|
|
|
num_gt, num_anchors = len(gt_bboxes_ploy), len(anchors_ploy)
|
|
iou = np.zeros((num_gt, num_anchors), dtype=np.float32)
|
|
|
|
start_time = time.time()
|
|
for i in range(num_gt):
|
|
for j in range(num_anchors):
|
|
try:
|
|
iou[i, j] = intersection(gt_bboxes_ploy[i], anchors_ploy[j])
|
|
except Exception as e:
|
|
print('cur gt_bboxes_ploy[i]', gt_bboxes_ploy[i],
|
|
'anchors_ploy[j]', anchors_ploy[j], e)
|
|
iou = iou.T
|
|
print('intersection all sp_time', time.time() - start_time)
|
|
return iou
|
|
|
|
|
|
# make coor as int
|
|
ploy_rbox1 = rbox1
|
|
ploy_rbox2 = rbox2
|
|
ploy_rbox1[:, 0:4] = rbox1[:, 0:4] * 1024
|
|
ploy_rbox2[:, 0:4] = rbox2[:, 0:4] * 1024
|
|
|
|
start_time = time.time()
|
|
iou_py = rbox_overlaps(ploy_rbox1, ploy_rbox2, use_cv2=False)
|
|
print('rbox time', time.time() - start_time)
|
|
print(iou_py.shape)
|
|
|
|
iou_pd = iou.cpu().numpy()
|
|
sum_abs_diff = np.sum(np.abs(iou_pd - iou_py))
|
|
print('sum of abs diff', sum_abs_diff)
|
|
if sum_abs_diff < 0.02:
|
|
print("rbox_iou OP compute right!")
|