# coding=utf-8 import os import time from collections import OrderedDict import cv2 import numpy as np from PIL import Image __all__ = ['reader'] DATA_DIM = 224 img_mean = np.array([0.485, 0.456, 0.406]).reshape((3, 1, 1)) img_std = np.array([0.229, 0.224, 0.225]).reshape((3, 1, 1)) def resize_short(img, target_size): percent = float(target_size) / min(img.size[0], img.size[1]) resized_width = int(round(img.size[0] * percent)) resized_height = int(round(img.size[1] * percent)) img = img.resize((resized_width, resized_height), Image.LANCZOS) return img def crop_image(img, target_size, center): width, height = img.size size = target_size if center == True: w_start = (width - size) / 2 h_start = (height - size) / 2 else: w_start = np.random.randint(0, width - size + 1) h_start = np.random.randint(0, height - size + 1) w_end = w_start + size h_end = h_start + size img = img.crop((w_start, h_start, w_end, h_end)) return img def process_image(img): img = resize_short(img, target_size=256) img = crop_image(img, target_size=DATA_DIM, center=True) if img.mode != 'RGB': img = img.convert('RGB') img = np.array(img).astype('float32').transpose((2, 0, 1)) / 255 img -= img_mean img /= img_std return img def reader(images=None, paths=None): """ Preprocess to yield image. Args: images (list[numpy.ndarray]): images data, shape of each is [H, W, C]. paths (list[str]): paths to images. Yield: each (collections.OrderedDict): info of original image, preprocessed image. """ component = list() if paths: for im_path in paths: each = OrderedDict() assert os.path.isfile(im_path), "The {} isn't a valid file path.".format(im_path) each['org_im_path'] = im_path each['org_im'] = Image.open(im_path) each['org_im_width'], each['org_im_height'] = each['org_im'].size component.append(each) if images is not None: assert type(images), "images is a list." for im in images: each = OrderedDict() each['org_im'] = Image.fromarray(im[:, :, ::-1]) each['org_im_path'] = 'ndarray_time={}'.format(round(time.time(), 6) * 1e6) each['org_im_width'], each['org_im_height'] = each['org_im'].size component.append(each) for element in component: element['image'] = process_image(element['org_im']) yield element