Spaces:
Running
on
A10G
Running
on
A10G
# Copyright (c) OpenMMLab. All rights reserved. | |
import numpy as np | |
def bbox_xyxy2xywh(bbox_xyxy): | |
"""Transform the bbox format from x1y1x2y2 to xywh. | |
Args: | |
bbox_xyxy (np.ndarray): Bounding boxes (with scores), shaped (n, 4) or | |
(n, 5). (left, top, right, bottom, [score]) | |
Returns: | |
np.ndarray: Bounding boxes (with scores), | |
shaped (n, 4) or (n, 5). (left, top, width, height, [score]) | |
""" | |
bbox_xywh = bbox_xyxy.copy() | |
bbox_xywh[:, 2] = bbox_xywh[:, 2] - bbox_xywh[:, 0] | |
bbox_xywh[:, 3] = bbox_xywh[:, 3] - bbox_xywh[:, 1] | |
return bbox_xywh | |
def bbox_xywh2xyxy(bbox_xywh): | |
"""Transform the bbox format from xywh to x1y1x2y2. | |
Args: | |
bbox_xywh (ndarray): Bounding boxes (with scores), | |
shaped (n, 4) or (n, 5). (left, top, width, height, [score]) | |
Returns: | |
np.ndarray: Bounding boxes (with scores), shaped (n, 4) or | |
(n, 5). (left, top, right, bottom, [score]) | |
""" | |
bbox_xyxy = bbox_xywh.copy() | |
bbox_xyxy[:, 2] = bbox_xyxy[:, 2] + bbox_xyxy[:, 0] | |
bbox_xyxy[:, 3] = bbox_xyxy[:, 3] + bbox_xyxy[:, 1] | |
return bbox_xyxy | |
def bbox_xywh2cs(bbox, aspect_ratio, padding=1., pixel_std=200.): | |
"""Transform the bbox format from (x,y,w,h) into (center, scale) | |
Args: | |
bbox (ndarray): Single bbox in (x, y, w, h) | |
aspect_ratio (float): The expected bbox aspect ratio (w over h) | |
padding (float): Bbox padding factor that will be multilied to scale. | |
Default: 1.0 | |
pixel_std (float): The scale normalization factor. Default: 200.0 | |
Returns: | |
tuple: A tuple containing center and scale. | |
- np.ndarray[float32](2,): Center of the bbox (x, y). | |
- np.ndarray[float32](2,): Scale of the bbox w & h. | |
""" | |
x, y, w, h = bbox[:4] | |
center = np.array([x + w * 0.5, y + h * 0.5], dtype=np.float32) | |
if w > aspect_ratio * h: | |
h = w * 1.0 / aspect_ratio | |
elif w < aspect_ratio * h: | |
w = h * aspect_ratio | |
scale = np.array([w, h], dtype=np.float32) / pixel_std | |
scale = scale * padding | |
return center, scale | |
def bbox_cs2xywh(center, scale, padding=1., pixel_std=200.): | |
"""Transform the bbox format from (center, scale) to (x,y,w,h). Note that | |
this is not an exact inverse operation of ``bbox_xywh2cs`` because the | |
normalization of aspect ratio in ``bbox_xywh2cs`` is irreversible. | |
Args: | |
center (ndarray): Single bbox center in (x, y) | |
scale (ndarray): Single bbox scale in (scale_x, scale_y) | |
padding (float): Bbox padding factor that will be multilied to scale. | |
Default: 1.0 | |
pixel_std (float): The scale normalization factor. Default: 200.0 | |
Returns: | |
ndarray: Single bbox in (x, y, w, h) | |
""" | |
wh = scale / padding * pixel_std | |
xy = center - 0.5 * wh | |
return np.r_[xy, wh] | |