Source code for jaclearn.imageaug.shape
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# File : shape.py
# Author : Jiayuan Mao
# Email : maojiayuan@gmail.com
# Date : 01/19/2018
#
# This file is part of Jacinle.
# Distributed under terms of the MIT license.
import itertools
import collections
import jacinle.random as random
from jacinle.image import imgproc
from jacinle.utils.argument import get_2dshape
__all__ = [
'random_crop',
'random_crop_random_shape',
'random_crop_and_resize',
'random_size_crop',
'horizontal_flip_augment'
]
def _rand_2dshape(upper_bound, lower_bound=None):
lower_bound = lower_bound or (0, ) * len(upper_bound)
return tuple(itertools.starmap(random.randint, zip(lower_bound, upper_bound)))
[docs]
def random_crop(img, target_shape):
"""random crop a image. output size is target_shape"""
rest = imgproc._get_crop2d_rest(img, target_shape)
start = _rand_2dshape(rest)
return imgproc._crop2d(img, start, target_shape)
[docs]
def random_crop_random_shape(img, max_shape, min_shape=0):
max_shape = get_2dshape(max_shape)
min_shape = get_2dshape(min_shape)
assert min_shape[0] < img.shape[0] < max_shape[0] and min_shape[1] < img.shape[1] < max_shape[1]
tar_shape = _rand_2dshape(max_shape, lower_bound=min_shape)
return random_crop(img, tar_shape)
[docs]
def random_crop_and_resize(img, max_shape, target_shape, min_shape=0):
target_shape = get_2dshape(target_shape)
cropped = random_crop_random_shape(img, max_shape, min_shape=min_shape)
return imgproc.resize(cropped, target_shape)
[docs]
def random_size_crop(img, target_shape, area_range, aspect_ratio=None, contiguous_ar=False, *, nr_trial=10):
"""random size crop used for Facebook ImageNet data augmentation
see https://github.com/facebook/fb.resnet.torch/blob/master/datasets/imagenet.lua
"""
target_shape = get_2dshape(target_shape)
h, w = img.shape[:2]
area = h * w
area_range = area_range if isinstance(area, collections.Iterable) else (area_range, 1)
if aspect_ratio is None:
assert contiguous_ar == False
aspect_ratio = [h / w]
for i in range(nr_trial):
target_area = random.uniform(area_range[0], area_range[1]) * area
target_ar = random.choice(aspect_ratio)
nw = int(round((target_area * target_ar) ** 0.5))
nh = int(round((target_area / target_ar) ** 0.5))
if random.rand() < 0.5:
nh, nw = nw, nh
if nh <= h and nw <= w:
sx, sy = random.randint(w - nw + 1), random.randint(h - nh + 1)
img = img[sy:sy + nh, sx:sx + nw]
return imgproc.resize(img, target_shape)
scale = min(*target_shape) / min(h, w)
return imgproc.center_crop(imgproc.resize_scale(img, scale), target_shape)
[docs]
def horizontal_flip_augment(img, prob):
if random.rand() < prob:
return img[:, ::-1]
return img