123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- import numpy as np
- from .boxes_utils import assert_and_normalize_shape
- def flip_boxes(boxes, x_center=0, y_center=0, direction='h'):
- """
- Args:
- boxes: (N, 4+K)
- x_center: array-like whose shape is (), (1,), (N,), (1, 1) or (N, 1)
- y_center: array-like whose shape is (), (1,), (N,), (1, 1) or (N, 1)
- direction: str
- """
- assert direction in ['x', 'h', 'horizontal',
- 'y', 'v', 'vertical',
- 'o', 'b', 'both']
- boxes = np.asarray(boxes, np.float32)
- ret_boxes = boxes.copy()
-
- x_center = np.asarray(x_center, np.float32)
- y_center = np.asarray(y_center, np.float32)
- x_center = assert_and_normalize_shape(x_center, boxes.shape[0])
- y_center = assert_and_normalize_shape(y_center, boxes.shape[0])
-
- if direction in ['o', 'b', 'both', 'x', 'h', 'horizontal']:
- ret_boxes[:, 0] = 2 * x_center - boxes[:, 2]
- ret_boxes[:, 2] = 2 * x_center - boxes[:, 0]
- if direction in ['o', 'b', 'both', 'y', 'v', 'vertical']:
- ret_boxes[:, 1] = 2 * y_center - boxes[:, 3]
- ret_boxes[:, 3] = 2 * y_center - boxes[:, 1]
- return ret_boxes
-
-
- def fliplr_boxes(boxes, x_center=0, y_center=0):
- """
- Args:
- boxes: (N, 4+K)
- x_center: array-like whose shape is (), (1,), (N,), (1, 1) or (N, 1)
- y_center: array-like whose shape is (), (1,), (N,), (1, 1) or (N, 1)
- """
- boxes = np.asarray(boxes, np.float32)
- ret_boxes = boxes.copy()
-
- x_center = np.asarray(x_center, np.float32)
- y_center = np.asarray(y_center, np.float32)
- x_center = assert_and_normalize_shape(x_center, boxes.shape[0])
- y_center = assert_and_normalize_shape(y_center, boxes.shape[0])
-
- ret_boxes[:, 0] = 2 * x_center - boxes[:, 2]
- ret_boxes[:, 2] = 2 * x_center - boxes[:, 0]
- return ret_boxes
-
-
- def flipud_boxes(boxes, x_center=0, y_center=0):
- """
- Args:
- boxes: (N, 4+K)
- x_center: array-like whose shape is (), (1,), (N,), (1, 1) or (N, 1)
- y_center: array-like whose shape is (), (1,), (N,), (1, 1) or (N, 1)
- """
- boxes = np.asarray(boxes, np.float32)
- ret_boxes = boxes.copy()
-
- x_center = np.asarray(x_center, np.float32)
- y_center = np.asarray(y_center, np.float32)
- x_center = assert_and_normalize_shape(x_center, boxes.shape[0])
- y_center = assert_and_normalize_shape(y_center, boxes.shape[0])
-
- ret_boxes[:, 1] = 2 * y_center - boxes[:, 3]
- ret_boxes[:, 3] = 2 * y_center - boxes[:, 1]
- return ret_boxes
-
-
- def transpose_boxes(boxes, x_center=0, y_center=0):
- """
- Args:
- boxes: (N, 4+K)
- x_center: array-like whose shape is (), (1,), (N,), (1, 1) or (N, 1)
- y_center: array-like whose shape is (), (1,), (N,), (1, 1) or (N, 1)
- """
- boxes = np.asarray(boxes, np.float32)
- ret_boxes = boxes.copy()
-
- x_center = np.asarray(x_center, np.float32)
- y_center = np.asarray(y_center, np.float32)
- x_center = assert_and_normalize_shape(x_center, boxes.shape[0])
- y_center = assert_and_normalize_shape(y_center, boxes.shape[0])
-
- shift = x_center - y_center
- ret_boxes[:, 0] = boxes[:, 1] + shift
- ret_boxes[:, 1] = boxes[:, 0] - shift
- ret_boxes[:, 2] = boxes[:, 3] + shift
- ret_boxes[:, 3] = boxes[:, 2] - shift
- return ret_boxes
- def flip_boxes_in_image(boxes, image_width, image_height, direction='h'):
- """
- Args:
- boxes: (N, 4+K)
- image_width: int
- image_width: int
- direction: str
-
- References:
- `core.bbox.bbox_flip` in mmdetection
- `datasets.pipelines.RandomFlip.bbox_flip` in mmdetection
- """
- x_center = (image_width - 1) * 0.5
- y_center = (image_height - 1) * 0.5
- ret_boxes = flip_boxes(boxes, x_center, y_center, direction=direction)
- return ret_boxes
-
-
- def rot90_boxes_in_image(boxes, image_width, image_height, n=1):
- """Rotate boxes counter-clockwise by 90 degrees.
-
- References:
- np.rot90
- cv2.rotate
- tf.image.rot90
- """
- n = n % 4
- if n == 0:
- ret_boxes = boxes.copy()
- elif n == 1:
- ret_boxes = transpose_boxes(boxes)
- ret_boxes = flip_boxes_in_image(ret_boxes, image_width, image_height, 'v')
- elif n == 2:
- ret_boxes = flip_boxes_in_image(boxes, image_width, image_height, 'o')
- else:
- ret_boxes = transpose_boxes(boxes)
- ret_boxes = flip_boxes_in_image(ret_boxes, image_width, image_height, 'h');
- return ret_boxes
-
-
|