Closed
Description
🚀 Feature
I'd like to easily be able to draw a bounding box onto an image represented as a torch tensor.
Motivation
Using YOLO, I get a bunch of bounding boxes in an image. I want to be able to easily draw those onto a torch tensor (created via torchvision.transforms.ToTensor
). This seems like a reasonable request because other bbox utilities such as NMS exist in torchvision.
Pitch
tensor_image = torch.tensor(...)
new_img = torchvision.utils.draw_bounding_box(
tensor_image,
[x_min, y_min, x_max, y_max],
)
Alternatives
I think the following works right now, but the torch.Tensor
> PIL.Image
> torch.Tensor
conversion for a single operation per image makes me feel uncomfortable due to efficiency.
# entirely untested!
tensor_image = torch.tensor(...)
def draw_bounding_box(tensor, bbox, **kwargs): # TODO: don't use a kwargs dict
# adapted from https://pytorch.org/docs/stable/_modules/torchvision/utils.html#save_image
from PIL import Image
# TODO: none of the kwargs to make_grid are in this scope
grid = make_grid(tensor, nrow=nrow, padding=padding, pad_value=pad_value,
normalize=normalize, range=range, scale_each=scale_each)
# Add 0.5 after unnormalizing to [0, 255] to round to nearest integer
ndarr = grid.mul(255).add_(0.5).clamp_(0, 255).permute(1, 2, 0).to('cpu', torch.uint8).numpy()
# TODO: convert bbox to the appropriate type
return cv2.rectangle(ndarr, bbox) # use PIL if opencv-python isn't a dependency
Additional context
See cv2.rectangle
(source) and PIL.ImageDraw.rectangle
(source).