Spaces:
Running
Running
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) |