123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- import numpy as np
- from .boxes_utils import assert_and_normalize_shape
- def translate_boxes(boxes, x_shift=0, y_shift=0, copy=True):
- """translate boxes coordinates in x and y dimensions.
-
- Args:
- boxes: (N, 4+K)
- x_shift: array-like whose shape is (), (1,), (N,), (1, 1) or (N, 1)
- shift in x dimension
- y_shift: array-like whose shape is (), (1,), (N,), (1, 1) or (N, 1)
- shift in y dimension
- copy: bool
-
- References:
- `datasets.pipelines.RandomCrop` in mmdetection
- """
- boxes = np.array(boxes, dtype=np.float32, copy=copy)
-
- x_shift = np.asarray(x_shift, np.float32)
- y_shift = np.asarray(y_shift, np.float32)
- x_shift = assert_and_normalize_shape(x_shift, boxes.shape[0])
- y_shift = assert_and_normalize_shape(y_shift, boxes.shape[0])
-
- boxes[:, 0] += x_shift
- boxes[:, 1] += y_shift
- boxes[:, 2] += x_shift
- boxes[:, 3] += y_shift
- return boxes
-
-
- def adjust_boxes(boxes, x_min_shift, y_min_shift, x_max_shift, y_max_shift, copy=True):
- """
- Args:
- boxes: (N, 4+K)
- x_min_shift: array-like whose shape is (), (1,), (N,), (1, 1) or (N, 1)
- shift (x_min, y_min) in x dimension
- y_min_shift: array-like whose shape is (), (1,), (N,), (1, 1) or (N, 1)
- shift (x_min, y_min) in y dimension
- x_max_shift: array-like whose shape is (), (1,), (N,), (1, 1) or (N, 1)
- shift (x_max, y_max) in x dimension
- y_max_shift: array-like whose shape is (), (1,), (N,), (1, 1) or (N, 1)
- shift (x_max, y_max) in y dimension
- copy: bool
- """
- boxes = np.array(boxes, dtype=np.float32, copy=copy)
- x_min_shift = np.asarray(x_min_shift, np.float32)
- y_min_shift = np.asarray(y_min_shift, np.float32)
- x_max_shift = np.asarray(x_max_shift, np.float32)
- y_max_shift = np.asarray(y_max_shift, np.float32)
- x_min_shift = assert_and_normalize_shape(x_min_shift, boxes.shape[0])
- y_min_shift = assert_and_normalize_shape(y_min_shift, boxes.shape[0])
- x_max_shift = assert_and_normalize_shape(x_max_shift, boxes.shape[0])
- y_max_shift = assert_and_normalize_shape(y_max_shift, boxes.shape[0])
-
- boxes[:, 0] += x_min_shift
- boxes[:, 1] += y_min_shift
- boxes[:, 2] += x_max_shift
- boxes[:, 3] += y_max_shift
- return boxes
-
-
- def inflate_or_deflate_boxes(boxes, width_delta=0, height_delta=0, copy=True):
- """
- Args:
- boxes: (N, 4+K)
- width_delta: array-like whose shape is (), (1,), (N,), (1, 1) or (N, 1)
- height_delta: array-like whose shape is (), (1,), (N,), (1, 1) or (N, 1)
- copy: bool
- """
- boxes = np.array(boxes, dtype=np.float32, copy=copy)
- width_delta = np.asarray(width_delta, np.float32)
- height_delta = np.asarray(height_delta, np.float32)
- width_delta = assert_and_normalize_shape(width_delta, boxes.shape[0])
- height_delta = assert_and_normalize_shape(height_delta, boxes.shape[0])
-
- half_width_delta = width_delta * 0.5
- half_height_delta = height_delta * 0.5
- boxes[:, 0] -= half_width_delta
- boxes[:, 1] -= half_height_delta
- boxes[:, 2] += half_width_delta
- boxes[:, 3] += half_height_delta
- return boxes
-
- def inflate_boxes_to_square(boxes, copy=True):
- """Inflate boxes to square
- Args:
- boxes: (N, 4+K)
- copy: bool
- """
- boxes = np.array(boxes, dtype=np.float32, copy=copy)
- widths = boxes[:, 2] - boxes[:, 0]
- heights = boxes[:, 3] - boxes[:, 1]
- max_side_lengths = np.maximum(widths, heights)
-
- width_deltas = np.subtract(max_side_lengths, widths, widths)
- height_deltas = np.subtract(max_side_lengths, heights, heights)
- width_deltas *= 0.5
- height_deltas *= 0.5
- boxes[:, 0] -= width_deltas
- boxes[:, 1] -= height_deltas
- boxes[:, 2] += width_deltas
- boxes[:, 3] += height_deltas
- return boxes
-
- def deflate_boxes_to_square(boxes, copy=True):
- """Deflate boxes to square
- Args:
- boxes: (N, 4+K)
- copy: bool
- """
- boxes = np.array(boxes, dtype=np.float32, copy=copy)
- widths = boxes[:, 2] - boxes[:, 0]
- heights = boxes[:, 3] - boxes[:, 1]
- min_side_lengths = np.minimum(widths, heights)
-
- width_deltas = np.subtract(min_side_lengths, widths, widths)
- height_deltas = np.subtract(min_side_lengths, heights, heights)
- width_deltas *= 0.5
- height_deltas *= 0.5
- boxes[:, 0] -= width_deltas
- boxes[:, 1] -= height_deltas
- boxes[:, 2] += width_deltas
- boxes[:, 3] += height_deltas
- return boxes
|