forked from MulongXie/UIED
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBbox.py
122 lines (107 loc) · 4.34 KB
/
Bbox.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import numpy as np
import detect_compo.lib_ip.ip_draw as draw
class Bbox:
def __init__(self, col_min, row_min, col_max, row_max):
self.col_min = col_min
self.row_min = row_min
self.col_max = col_max
self.row_max = row_max
self.width = col_max - col_min
self.height = row_max - row_min
self.box_area = self.width * self.height
def put_bbox(self):
return self.col_min, self.row_min, self.col_max, self.row_max
def bbox_cal_area(self):
self.box_area = self.width * self.height
return self.box_area
def bbox_relation(self, bbox_b):
"""
:return: -1 : a in b
0 : a, b are not intersected
1 : b in a
2 : a, b are identical or intersected
"""
col_min_a, row_min_a, col_max_a, row_max_a = self.put_bbox()
col_min_b, row_min_b, col_max_b, row_max_b = bbox_b.put_bbox()
# if a is in b
if col_min_a > col_min_b and row_min_a > row_min_b and col_max_a < col_max_b and row_max_a < row_max_b:
return -1
# if b is in a
elif col_min_a < col_min_b and row_min_a < row_min_b and col_max_a > col_max_b and row_max_a > row_max_b:
return 1
# a and b are non-intersect
elif (col_min_a > col_max_b or row_min_a > row_max_b) or (col_min_b > col_max_a or row_min_b > row_max_a):
return 0
# intersection
else:
return 2
def bbox_relation_nms(self, bbox_b, bias=(0, 0)):
'''
Calculate the relation between two rectangles by nms
:return: -1 : a in b
0 : a, b are not intersected
1 : b in a
2 : a, b are intersected
'''
col_min_a, row_min_a, col_max_a, row_max_a = self.put_bbox()
col_min_b, row_min_b, col_max_b, row_max_b = bbox_b.put_bbox()
bias_col, bias_row = bias
# get the intersected area
col_min_s = max(col_min_a - bias_col, col_min_b - bias_col)
row_min_s = max(row_min_a - bias_row, row_min_b - bias_row)
col_max_s = min(col_max_a + bias_col, col_max_b + bias_col)
row_max_s = min(row_max_a + bias_row, row_max_b + bias_row)
w = np.maximum(0, col_max_s - col_min_s)
h = np.maximum(0, row_max_s - row_min_s)
inter = w * h
area_a = (col_max_a - col_min_a) * (row_max_a - row_min_a)
area_b = (col_max_b - col_min_b) * (row_max_b - row_min_b)
iou = inter / (area_a + area_b - inter)
ioa = inter / self.box_area
iob = inter / bbox_b.box_area
if iou == 0 and ioa == 0 and iob == 0:
return 0
# import lib_ip.ip_preprocessing as pre
# org_iou, _ = pre.read_img('uied/data/input/7.jpg', 800)
# print(iou, ioa, iob)
# board = draw.draw_bounding_box(org_iou, [self], color=(255,0,0))
# draw.draw_bounding_box(board, [bbox_b], color=(0,255,0), show=True)
# contained by b
if ioa >= 1:
return -1
# contains b
if iob >= 1:
return 1
# not intersected with each other
# intersected
if iou >= 0.02 or iob > 0.2 or ioa > 0.2:
return 2
# if iou == 0:
# print('ioa:%.5f; iob:%.5f; iou:%.5f' % (ioa, iob, iou))
return 0
def bbox_cvt_relative_position(self, col_min_base, row_min_base):
'''
Convert to relative position based on base coordinator
'''
self.col_min += col_min_base
self.col_max += col_min_base
self.row_min += row_min_base
self.row_max += row_min_base
def bbox_merge(self, bbox_b):
'''
Merge two intersected bboxes
'''
col_min_a, row_min_a, col_max_a, row_max_a = self.put_bbox()
col_min_b, row_min_b, col_max_b, row_max_b = bbox_b.put_bbox()
col_min = min(col_min_a, col_min_b)
col_max = max(col_max_a, col_max_b)
row_min = min(row_min_a, row_min_b)
row_max = max(row_max_a, row_max_b)
new_bbox = Bbox(col_min, row_min, col_max, row_max)
return new_bbox
def bbox_padding(self, image_shape, pad):
row, col = image_shape[:2]
self.col_min = max(self.col_min - pad, 0)
self.col_max = min(self.col_max + pad, col)
self.row_min = max(self.row_min - pad, 0)
self.row_max = min(self.row_max + pad, row)