# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os import cv2 import paddle import numpy as np from PIL import Image, ImageEnhance def normalize(im, mean, std): im = im.astype(np.float32, copy=False) / 255.0 im -= mean im /= std return im def permute(im): im = np.transpose(im, (2, 0, 1)) return im def resize(im, target_size=608, interp=cv2.INTER_LINEAR): if isinstance(target_size, list) or isinstance(target_size, tuple): w = target_size[0] h = target_size[1] else: w = target_size h = target_size im = cv2.resize(im, (w, h), interpolation=interp) return im def resize_long(im, long_size=224, interpolation=cv2.INTER_LINEAR): value = max(im.shape[0], im.shape[1]) scale = float(long_size) / float(value) resized_width = int(round(im.shape[1] * scale)) resized_height = int(round(im.shape[0] * scale)) im = cv2.resize(im, (resized_width, resized_height), interpolation=interpolation) return im def horizontal_flip(im): if len(im.shape) == 3: im = im[:, ::-1, :] elif len(im.shape) == 2: im = im[:, ::-1] return im def vertical_flip(im): if len(im.shape) == 3: im = im[::-1, :, :] elif len(im.shape) == 2: im = im[::-1, :] return im def brightness(im, brightness_lower, brightness_upper): brightness_delta = np.random.uniform(brightness_lower, brightness_upper) im = ImageEnhance.Brightness(im).enhance(brightness_delta) return im def contrast(im, contrast_lower, contrast_upper): contrast_delta = np.random.uniform(contrast_lower, contrast_upper) im = ImageEnhance.Contrast(im).enhance(contrast_delta) return im def saturation(im, saturation_lower, saturation_upper): saturation_delta = np.random.uniform(saturation_lower, saturation_upper) im = ImageEnhance.Color(im).enhance(saturation_delta) return im def hue(im, hue_lower, hue_upper): hue_delta = np.random.uniform(hue_lower, hue_upper) im = np.array(im.convert('HSV')) im[:, :, 0] = im[:, :, 0] + hue_delta im = Image.fromarray(im, mode='HSV').convert('RGB') return im def rotate(im, rotate_lower, rotate_upper): rotate_delta = np.random.uniform(rotate_lower, rotate_upper) im = im.rotate(int(rotate_delta)) return im def is_image_file(filename: str) -> bool: '''Determine whether the input file name is a valid image file name.''' ext = os.path.splitext(filename)[-1].lower() return ext in ['.bmp', '.dib', '.png', '.jpg', '.jpeg', '.pbm', '.pgm', '.ppm', '.tif', '.tiff'] def get_img_file(dir_name: str) -> list: '''Get all image file paths in several directories which have the same parent directory.''' images = [] for parent, dirnames, filenames in os.walk(dir_name): for filename in filenames: if not is_image_file(filename): continue img_path = os.path.join(parent, filename) images.append(img_path) images.sort() return images def subtract_imagenet_mean_batch(batch: paddle.Tensor) -> paddle.Tensor: """Subtract ImageNet mean pixel-wise from a BGR image.""" mean = np.zeros(shape=batch.shape, dtype='float32') mean[:, 0, :, :] = 103.939 mean[:, 1, :, :] = 116.779 mean[:, 2, :, :] = 123.680 mean = paddle.to_tensor(mean) return batch - mean def gram_matrix(data: paddle.Tensor) -> paddle.Tensor: """Get gram matrix""" b, ch, h, w = data.shape features = data.reshape((b, ch, w * h)) features_t = features.transpose((0, 2, 1)) gram = features.bmm(features_t) / (ch * h * w) return gram