Spaces:
Running
on
Zero
Running
on
Zero
""" | |
Copied from RT-DETR (https://github.com/lyuwenyu/RT-DETR) | |
Copyright(c) 2023 lyuwenyu. All Rights Reserved. | |
""" | |
from enum import Enum | |
import torch | |
import torchvision | |
from torch import Tensor | |
class BoxProcessFormat(Enum): | |
"""Box process format | |
Available formats are | |
* ``RESIZE`` | |
* ``RESIZE_KEEP_RATIO`` | |
* ``RESIZE_KEEP_RATIO_PADDING`` | |
""" | |
RESIZE = 1 | |
RESIZE_KEEP_RATIO = 2 | |
RESIZE_KEEP_RATIO_PADDING = 3 | |
def box_revert( | |
boxes: Tensor, | |
orig_sizes: Tensor = None, | |
eval_sizes: Tensor = None, | |
inpt_sizes: Tensor = None, | |
inpt_padding: Tensor = None, | |
normalized: bool = True, | |
in_fmt: str = "cxcywh", | |
out_fmt: str = "xyxy", | |
process_fmt=BoxProcessFormat.RESIZE, | |
) -> Tensor: | |
""" | |
Args: | |
boxes(Tensor), [N, :, 4], (x1, y1, x2, y2), pred boxes. | |
inpt_sizes(Tensor), [N, 2], (w, h). input sizes. | |
orig_sizes(Tensor), [N, 2], (w, h). origin sizes. | |
inpt_padding (Tensor), [N, 2], (w_pad, h_pad, ...). | |
(inpt_sizes + inpt_padding) == eval_sizes | |
""" | |
assert in_fmt in ("cxcywh", "xyxy"), "" | |
if normalized and eval_sizes is not None: | |
boxes = boxes * eval_sizes.repeat(1, 2).unsqueeze(1) | |
if inpt_padding is not None: | |
if in_fmt == "xyxy": | |
boxes -= inpt_padding[:, :2].repeat(1, 2).unsqueeze(1) | |
elif in_fmt == "cxcywh": | |
boxes[..., :2] -= inpt_padding[:, :2].repeat(1, 2).unsqueeze(1) | |
if orig_sizes is not None: | |
orig_sizes = orig_sizes.repeat(1, 2).unsqueeze(1) | |
if inpt_sizes is not None: | |
inpt_sizes = inpt_sizes.repeat(1, 2).unsqueeze(1) | |
boxes = boxes * (orig_sizes / inpt_sizes) | |
else: | |
boxes = boxes * orig_sizes | |
boxes = torchvision.ops.box_convert(boxes, in_fmt=in_fmt, out_fmt=out_fmt) | |
return boxes | |