Source code for jactorch.transforms.vision.functional.bbox

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# File   : bbox.py
# Author : Jiayuan Mao
# Email  : maojiayuan@gmail.com
# Date   : 12/14/2018
#
# This file is part of Jacinle.
# Distributed under terms of the MIT license.

import numpy as np
from ._utils import apply_affine_transform


[docs] def normalize_bbox(img, bbox): bbox = bbox.copy() bbox[:, 0] /= img.width bbox[:, 1] /= img.height bbox[:, 2] /= img.width bbox[:, 3] /= img.height return bbox
[docs] def denormalize_box(img, bbox): bbox = bbox.copy() bbox[:, 0] *= img.width bbox[:, 1] *= img.height bbox[:, 2] /= img.width bbox[:, 3] /= img.height return bbox
[docs] def refresh_valid(img, bbox): assert bbox.shape[1] in (4, 5), 'Support only (x1, y1, x2, y2, valid) or (x1, y1, x2, y2) typed coordinates' has_valid_bit = bbox.shape[1] == 5 out = bbox.copy() out[:, 0] = np.fmax(out[:, 0], 0) out[:, 1] = np.fmax(out[:, 1], 0) out[:, 2] = np.fmin(out[:, 2], img.width) out[:, 3] = np.fmin(out[:, 3], img.height) if has_valid_bit: v = bbox[:, 4] else: v = 1 valid = (v != 0) & ((out[:, 2] - out[:, 0]) * (out[:, 3] - out[:, 1]) > 0) if has_valid_bit: invalid_indices = np.where(~valid)[0] out[invalid_indices, :] = 0 else: valid_indices = np.where(valid)[0] return out[valid_indices]
[docs] def crop(bbox, x, y, w, h): bbox = bbox.copy() bbox[:, 0] = (bbox[:, 0] - x) bbox[:, 1] = (bbox[:, 1] - w) return bbox
[docs] def pad(bbox, padding): if isinstance(padding, int): padding = (padding, padding, padding, padding) elif len(padding) == 2: padding = (padding[0], padding[1], padding[0], padding[1]) else: assert len(padding) == 4 bbox = bbox.copy() bbox[:, 0] = (bbox[:, 0] + padding[0]) bbox[:, 1] = (bbox[:, 1] + padding[1]) return bbox
[docs] def hflip(img, bbox): bbox = bbox.copy() bbox[:, 0] = img.width - bbox[:, 0] - bbox[:, 2] return bbox
[docs] def vflip(img, bbox): bbox = bbox.copy() bbox[:, 1] = img.height - bbox[:, 1] - bbox[:, 3] return bbox
[docs] def resize(img, bbox, size): h, w = size bbox = bbox.copy() bbox[:, 0] = bbox[:, 0] / img.width * w bbox[:, 1] = bbox[:, 1] / img.height * h bbox[:, 2] = bbox[:, 2] / img.width * w bbox[:, 3] = bbox[:, 3] / img.height * h return bbox
[docs] def affine(bbox, matrix): bbox = bbox.copy() for i in range(bbox.shape[0]): bbox[i, :2] = apply_affine_transform(*bbox[i, :2], matrix) raise NotImplementedError() return bbox