refactor api
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
"""Bounding box helpers. Boxes are [xmin, ymin, xmax, ymax] unless noted.
|
||||
|
||||
Used by training and by the production server, so keep this free of
|
||||
training-only dependencies."""
|
||||
|
||||
|
||||
def iou(boxA, boxB):
|
||||
xA = max(boxA[0], boxB[0])
|
||||
yA = max(boxA[1], boxB[1])
|
||||
xB = min(boxA[2], boxB[2])
|
||||
yB = min(boxA[3], boxB[3])
|
||||
|
||||
inter_area = max(0, xB - xA) * max(0, yB - yA)
|
||||
|
||||
boxA_area = (boxA[2] - boxA[0]) * (boxA[3] - boxA[1])
|
||||
boxB_area = (boxB[2] - boxB[0]) * (boxB[3] - boxB[1])
|
||||
|
||||
union = boxA_area + boxB_area - inter_area
|
||||
|
||||
return inter_area / union if union > 0 else 0
|
||||
|
||||
|
||||
def nms(bboxes, iou_threshold=0.1):
|
||||
"""bboxes: [confidence, xmin, ymin, xmax, ymax]. Returns boxes without
|
||||
the confidence, highest confidence first."""
|
||||
bboxes = sorted(bboxes, key=lambda x: x[0], reverse=True)
|
||||
|
||||
keep = []
|
||||
while bboxes:
|
||||
best = bboxes.pop(0)
|
||||
keep.append(best[1:5])
|
||||
bboxes = [box for box in bboxes if iou(best[1:5], box[1:5]) < iou_threshold]
|
||||
|
||||
return keep
|
||||
|
||||
|
||||
def xy_center_to_edges(xcenter, ycenter, width, height):
|
||||
width = max(width, 1)
|
||||
height = max(height, 1)
|
||||
|
||||
x = xcenter - (width / 2)
|
||||
y = ycenter - (height / 2)
|
||||
|
||||
return [x, y, x + width, y + height]
|
||||
|
||||
|
||||
def cell_to_image_coords(x, y, img_w, img_h, S, cell_i, cell_j):
|
||||
"""Grid-cell-relative position -> image position."""
|
||||
return x + (img_w / S) * cell_i, y + (img_h / S) * cell_j
|
||||
|
||||
|
||||
def image_to_cell_coords(x, y, img_w, img_h, S, cell_i, cell_j):
|
||||
"""Image position -> grid-cell-relative position."""
|
||||
return x - (img_w / S) * cell_i, y - (img_h / S) * cell_j
|
||||
|
||||
|
||||
def is_center_in_grid_cell(x, y, img_w, img_h, S, cell_i, cell_j):
|
||||
gt_cell_i = min(int(x / (img_w / S)), S - 1)
|
||||
gt_cell_j = min(int(y / (img_h / S)), S - 1)
|
||||
return (gt_cell_i == cell_i) and (gt_cell_j == cell_j)
|
||||
|
||||
|
||||
def scale_box(box, scale_w, scale_h):
|
||||
return [int(box[0] * scale_w), int(box[1] * scale_h), int(box[2] * scale_w), int(box[3] * scale_h)]
|
||||
Reference in New Issue
Block a user