R/item-transforms-random-geometry.R
item_transform_random_resize_crop.RdCrops the image inside a dataset item to a random area and aspect ratio, then resizes that crop to the given size. For detection items, bounding boxes are cropped along with the image and their coordinates are rescaled to the output size: boxes falling outside the crop are dropped and boxes straddling its border are clipped to it. For segmentation items, the masks are cropped and resized alongside the image with nearest-neighbour sampling, so that they keep their discrete values.
A dataset item, typically an image_with_bounding_box or
image_with_segmentation_mask object containing an image tensor
and associated target data.
(integer vector or integer): Desired output size. If size is
an integer vector of length 2 like c(h, w), output size will be matched
to this. If size is a bare integer, smaller edge of the image will be
matched to this number, i.e., if height > width, then image will be
rescaled to (size * height / width, size).
(numeric vector of length 2): Range of size of the origin size cropped.
(numeric vector of length 2): Range of aspect ratio of the origin aspect ratio cropped. ratio cropped.
(integer, optional): Desired interpolation. An integer
0 = nearest, 2 = bilinear, and 3 = bicubic or a name from
magick::filter_types().
A dataset item of the same class with the image and target cropped and resized.
The crop is drawn again for every item, so that a dataset wrapped with this transform yields a different crop on each access.
The area field of a detection target, when present, is rescaled by the
area ratio between the crop and the output. For rotated boxes, a crop whose
aspect ratio differs from the output one maps the box to a parallelogram: the
enclosing box stays exact and the angle is that of the transformed box axis,
which is exact whenever both edges are scaled alike.
if (FALSE) { # \dontrun{
url <- "https://upload.wikimedia.org/wikipedia/commons/b/b6/Felis_catus-cat_on_snow.jpg"
img <- base_loader(url) |> transform_to_tensor()
boxes <- torch_tensor(matrix(c(600, 200, 2880, 1860), ncol = 4), dtype = torch_float32())
before <- list(x = img, y = list(boxes = boxes, labels = "cat"))
class(before) <- c("image_with_bounding_box", "list")
after <- item_transform_random_resize_crop(before, size = c(600, 800))
before_plot <- draw_bounding_boxes(before, colors = "blue", width = 10)
after_plot <- draw_bounding_boxes(after, colors = "red", width = 10)
tensor_image_browse(before_plot)
tensor_image_browse(after_plot)
} # }