|
|
@ -344,7 +344,8 @@ def xyxy2xywh(x):
|
|
|
|
Returns:
|
|
|
|
Returns:
|
|
|
|
y (np.ndarray | torch.Tensor): The bounding box coordinates in (x, y, width, height) format.
|
|
|
|
y (np.ndarray | torch.Tensor): The bounding box coordinates in (x, y, width, height) format.
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
y = torch.empty_like(x) if isinstance(x, torch.Tensor) else np.empty_like(x)
|
|
|
|
assert x.shape[-1] == 4, f'input shape last dimension expected 4 but input shape is {x.shape}'
|
|
|
|
|
|
|
|
y = torch.empty_like(x) if isinstance(x, torch.Tensor) else np.empty_like(x) # faster than clone/copy
|
|
|
|
y[..., 0] = (x[..., 0] + x[..., 2]) / 2 # x center
|
|
|
|
y[..., 0] = (x[..., 0] + x[..., 2]) / 2 # x center
|
|
|
|
y[..., 1] = (x[..., 1] + x[..., 3]) / 2 # y center
|
|
|
|
y[..., 1] = (x[..., 1] + x[..., 3]) / 2 # y center
|
|
|
|
y[..., 2] = x[..., 2] - x[..., 0] # width
|
|
|
|
y[..., 2] = x[..., 2] - x[..., 0] # width
|
|
|
@ -362,7 +363,8 @@ def xywh2xyxy(x):
|
|
|
|
Returns:
|
|
|
|
Returns:
|
|
|
|
y (np.ndarray | torch.Tensor): The bounding box coordinates in (x1, y1, x2, y2) format.
|
|
|
|
y (np.ndarray | torch.Tensor): The bounding box coordinates in (x1, y1, x2, y2) format.
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
y = torch.empty_like(x) if isinstance(x, torch.Tensor) else np.empty_like(x)
|
|
|
|
assert x.shape[-1] == 4, f'input shape last dimension expected 4 but input shape is {x.shape}'
|
|
|
|
|
|
|
|
y = torch.empty_like(x) if isinstance(x, torch.Tensor) else np.empty_like(x) # faster than clone/copy
|
|
|
|
dw = x[..., 2] / 2 # half-width
|
|
|
|
dw = x[..., 2] / 2 # half-width
|
|
|
|
dh = x[..., 3] / 2 # half-height
|
|
|
|
dh = x[..., 3] / 2 # half-height
|
|
|
|
y[..., 0] = x[..., 0] - dw # top left x
|
|
|
|
y[..., 0] = x[..., 0] - dw # top left x
|
|
|
@ -386,7 +388,8 @@ def xywhn2xyxy(x, w=640, h=640, padw=0, padh=0):
|
|
|
|
y (np.ndarray | torch.Tensor): The coordinates of the bounding box in the format [x1, y1, x2, y2] where
|
|
|
|
y (np.ndarray | torch.Tensor): The coordinates of the bounding box in the format [x1, y1, x2, y2] where
|
|
|
|
x1,y1 is the top-left corner, x2,y2 is the bottom-right corner of the bounding box.
|
|
|
|
x1,y1 is the top-left corner, x2,y2 is the bottom-right corner of the bounding box.
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
y = torch.empty_like(x) if isinstance(x, torch.Tensor) else np.empty_like(x)
|
|
|
|
assert x.shape[-1] == 4, f'input shape last dimension expected 4 but input shape is {x.shape}'
|
|
|
|
|
|
|
|
y = torch.empty_like(x) if isinstance(x, torch.Tensor) else np.empty_like(x) # faster than clone/copy
|
|
|
|
y[..., 0] = w * (x[..., 0] - x[..., 2] / 2) + padw # top left x
|
|
|
|
y[..., 0] = w * (x[..., 0] - x[..., 2] / 2) + padw # top left x
|
|
|
|
y[..., 1] = h * (x[..., 1] - x[..., 3] / 2) + padh # top left y
|
|
|
|
y[..., 1] = h * (x[..., 1] - x[..., 3] / 2) + padh # top left y
|
|
|
|
y[..., 2] = w * (x[..., 0] + x[..., 2] / 2) + padw # bottom right x
|
|
|
|
y[..., 2] = w * (x[..., 0] + x[..., 2] / 2) + padw # bottom right x
|
|
|
@ -410,7 +413,8 @@ def xyxy2xywhn(x, w=640, h=640, clip=False, eps=0.0):
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
if clip:
|
|
|
|
if clip:
|
|
|
|
clip_boxes(x, (h - eps, w - eps)) # warning: inplace clip
|
|
|
|
clip_boxes(x, (h - eps, w - eps)) # warning: inplace clip
|
|
|
|
y = torch.empty_like(x) if isinstance(x, torch.Tensor) else np.empty_like(x)
|
|
|
|
assert x.shape[-1] == 4, f'input shape last dimension expected 4 but input shape is {x.shape}'
|
|
|
|
|
|
|
|
y = torch.empty_like(x) if isinstance(x, torch.Tensor) else np.empty_like(x) # faster than clone/copy
|
|
|
|
y[..., 0] = ((x[..., 0] + x[..., 2]) / 2) / w # x center
|
|
|
|
y[..., 0] = ((x[..., 0] + x[..., 2]) / 2) / w # x center
|
|
|
|
y[..., 1] = ((x[..., 1] + x[..., 3]) / 2) / h # y center
|
|
|
|
y[..., 1] = ((x[..., 1] + x[..., 3]) / 2) / h # y center
|
|
|
|
y[..., 2] = (x[..., 2] - x[..., 0]) / w # width
|
|
|
|
y[..., 2] = (x[..., 2] - x[..., 0]) / w # width
|
|
|
@ -431,7 +435,7 @@ def xyn2xy(x, w=640, h=640, padw=0, padh=0):
|
|
|
|
Returns:
|
|
|
|
Returns:
|
|
|
|
y (np.ndarray | torch.Tensor): The x and y coordinates of the top left corner of the bounding box
|
|
|
|
y (np.ndarray | torch.Tensor): The x and y coordinates of the top left corner of the bounding box
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
y = torch.empty_like(x) if isinstance(x, torch.Tensor) else np.empty_like(x)
|
|
|
|
y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x)
|
|
|
|
y[..., 0] = w * x[..., 0] + padw # top left x
|
|
|
|
y[..., 0] = w * x[..., 0] + padw # top left x
|
|
|
|
y[..., 1] = h * x[..., 1] + padh # top left y
|
|
|
|
y[..., 1] = h * x[..., 1] + padh # top left y
|
|
|
|
return y
|
|
|
|
return y
|
|
|
@ -446,9 +450,9 @@ def xywh2ltwh(x):
|
|
|
|
Returns:
|
|
|
|
Returns:
|
|
|
|
y (np.ndarray | torch.Tensor): The bounding box coordinates in the xyltwh format
|
|
|
|
y (np.ndarray | torch.Tensor): The bounding box coordinates in the xyltwh format
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
y = torch.empty_like(x) if isinstance(x, torch.Tensor) else np.empty_like(x)
|
|
|
|
y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x)
|
|
|
|
y[:, 0] = x[:, 0] - x[:, 2] / 2 # top left x
|
|
|
|
y[..., 0] = x[..., 0] - x[..., 2] / 2 # top left x
|
|
|
|
y[:, 1] = x[:, 1] - x[:, 3] / 2 # top left y
|
|
|
|
y[..., 1] = x[..., 1] - x[..., 3] / 2 # top left y
|
|
|
|
return y
|
|
|
|
return y
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -461,9 +465,9 @@ def xyxy2ltwh(x):
|
|
|
|
Returns:
|
|
|
|
Returns:
|
|
|
|
y (np.ndarray | torch.Tensor): The bounding box coordinates in the xyltwh format.
|
|
|
|
y (np.ndarray | torch.Tensor): The bounding box coordinates in the xyltwh format.
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
y = torch.empty_like(x) if isinstance(x, torch.Tensor) else np.empty_like(x)
|
|
|
|
y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x)
|
|
|
|
y[:, 2] = x[:, 2] - x[:, 0] # width
|
|
|
|
y[..., 2] = x[..., 2] - x[..., 0] # width
|
|
|
|
y[:, 3] = x[:, 3] - x[:, 1] # height
|
|
|
|
y[..., 3] = x[..., 3] - x[..., 1] # height
|
|
|
|
return y
|
|
|
|
return y
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -474,9 +478,9 @@ def ltwh2xywh(x):
|
|
|
|
Args:
|
|
|
|
Args:
|
|
|
|
x (torch.Tensor): the input tensor
|
|
|
|
x (torch.Tensor): the input tensor
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
y = torch.empty_like(x) if isinstance(x, torch.Tensor) else np.empty_like(x)
|
|
|
|
y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x)
|
|
|
|
y[:, 0] = x[:, 0] + x[:, 2] / 2 # center x
|
|
|
|
y[..., 0] = x[..., 0] + x[..., 2] / 2 # center x
|
|
|
|
y[:, 1] = x[:, 1] + x[:, 3] / 2 # center y
|
|
|
|
y[..., 1] = x[..., 1] + x[..., 3] / 2 # center y
|
|
|
|
return y
|
|
|
|
return y
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -569,9 +573,9 @@ def ltwh2xyxy(x):
|
|
|
|
Returns:
|
|
|
|
Returns:
|
|
|
|
y (np.ndarray | torch.Tensor): the xyxy coordinates of the bounding boxes.
|
|
|
|
y (np.ndarray | torch.Tensor): the xyxy coordinates of the bounding boxes.
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
y = torch.empty_like(x) if isinstance(x, torch.Tensor) else np.empty_like(x)
|
|
|
|
y = x.clone() if isinstance(x, torch.Tensor) else np.copy(x)
|
|
|
|
y[:, 2] = x[:, 2] + x[:, 0] # width
|
|
|
|
y[..., 2] = x[..., 2] + x[..., 0] # width
|
|
|
|
y[:, 3] = x[:, 3] + x[:, 1] # height
|
|
|
|
y[..., 3] = x[..., 3] + x[..., 1] # height
|
|
|
|
return y
|
|
|
|
return y
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|