Spaces:
Running
Running
| import random | |
| import os | |
| from util.mosaic import get_random_parameter | |
| import numpy as np | |
| import torch | |
| import torchvision.transforms as transforms | |
| import cv2 | |
| from . import image_processing as impro | |
| from . import degradater | |
| def to_tensor(data,gpu_id): | |
| data = torch.from_numpy(data) | |
| if gpu_id != '-1': | |
| data = data.cuda() | |
| return data | |
| def normalize(data): | |
| ''' | |
| normalize to -1 ~ 1 | |
| ''' | |
| return (data.astype(np.float32)/255.0-0.5)/0.5 | |
| def anti_normalize(data): | |
| return np.clip((data*0.5+0.5)*255,0,255).astype(np.uint8) | |
| def tensor2im(image_tensor, gray=False, rgb2bgr = True ,is0_1 = False, batch_index=0): | |
| image_tensor =image_tensor.data | |
| image_numpy = image_tensor[batch_index].cpu().float().numpy() | |
| if not is0_1: | |
| image_numpy = (image_numpy + 1)/2.0 | |
| image_numpy = np.clip(image_numpy * 255.0,0,255) | |
| # gray -> output 1ch | |
| if gray: | |
| h, w = image_numpy.shape[1:] | |
| image_numpy = image_numpy.reshape(h,w) | |
| return image_numpy.astype(np.uint8) | |
| # output 3ch | |
| if image_numpy.shape[0] == 1: | |
| image_numpy = np.tile(image_numpy, (3, 1, 1)) | |
| image_numpy = image_numpy.transpose((1, 2, 0)) | |
| if rgb2bgr and not gray: | |
| image_numpy = image_numpy[...,::-1]-np.zeros_like(image_numpy) | |
| return image_numpy.astype(np.uint8) | |
| def im2tensor(image_numpy, gray=False,bgr2rgb = True, reshape = True, gpu_id = '-1',is0_1 = False): | |
| if gray: | |
| h, w = image_numpy.shape | |
| image_numpy = (image_numpy/255.0-0.5)/0.5 | |
| image_tensor = torch.from_numpy(image_numpy).float() | |
| if reshape: | |
| image_tensor = image_tensor.reshape(1,1,h,w) | |
| else: | |
| h, w ,ch = image_numpy.shape | |
| if bgr2rgb: | |
| image_numpy = image_numpy[...,::-1]-np.zeros_like(image_numpy) | |
| if is0_1: | |
| image_numpy = image_numpy/255.0 | |
| else: | |
| image_numpy = (image_numpy/255.0-0.5)/0.5 | |
| image_numpy = image_numpy.transpose((2, 0, 1)) | |
| image_tensor = torch.from_numpy(image_numpy).float() | |
| if reshape: | |
| image_tensor = image_tensor.reshape(1,ch,h,w) | |
| if gpu_id != '-1': | |
| image_tensor = image_tensor.cuda() | |
| return image_tensor | |
| def shuffledata(data,target): | |
| state = np.random.get_state() | |
| np.random.shuffle(data) | |
| np.random.set_state(state) | |
| np.random.shuffle(target) | |
| def random_transform_single_mask(img,out_shape): | |
| out_h,out_w = out_shape | |
| img = cv2.resize(img,(int(out_w*random.uniform(1.1, 1.5)),int(out_h*random.uniform(1.1, 1.5)))) | |
| h,w = img.shape[:2] | |
| h_move = int((h-out_h)*random.random()) | |
| w_move = int((w-out_w)*random.random()) | |
| img = img[h_move:h_move+out_h,w_move:w_move+out_w] | |
| if random.random()<0.5: | |
| if random.random()<0.5: | |
| img = img[:,::-1] | |
| else: | |
| img = img[::-1,:] | |
| if img.shape[0] != out_h or img.shape[1]!= out_w : | |
| img = cv2.resize(img,(out_w,out_h)) | |
| return img | |
| def get_transform_params(): | |
| crop_flag = True | |
| rotat_flag = np.random.random()<0.2 | |
| color_flag = True | |
| flip_flag = np.random.random()<0.2 | |
| degradate_flag = np.random.random()<0.5 | |
| flag_dict = {'crop':crop_flag,'rotat':rotat_flag,'color':color_flag,'flip':flip_flag,'degradate':degradate_flag} | |
| crop_rate = [np.random.random(),np.random.random()] | |
| rotat_rate = np.random.random() | |
| color_rate = [np.random.uniform(-0.05,0.05),np.random.uniform(-0.05,0.05),np.random.uniform(-0.05,0.05), | |
| np.random.uniform(-0.05,0.05),np.random.uniform(-0.05,0.05)] | |
| flip_rate = np.random.random() | |
| degradate_params = degradater.get_random_degenerate_params(mod='weaker_2') | |
| rate_dict = {'crop':crop_rate,'rotat':rotat_rate,'color':color_rate,'flip':flip_rate,'degradate':degradate_params} | |
| return {'flag':flag_dict,'rate':rate_dict} | |
| def random_transform_single_image(img,finesize,params=None,test_flag = False): | |
| if params is None: | |
| params = get_transform_params() | |
| if params['flag']['degradate']: | |
| img = degradater.degradate(img,params['rate']['degradate']) | |
| if params['flag']['crop']: | |
| h,w = img.shape[:2] | |
| h_move = int((h-finesize)*params['rate']['crop'][0]) | |
| w_move = int((w-finesize)*params['rate']['crop'][1]) | |
| img = img[h_move:h_move+finesize,w_move:w_move+finesize] | |
| if test_flag: | |
| return img | |
| if params['flag']['rotat']: | |
| h,w = img.shape[:2] | |
| M = cv2.getRotationMatrix2D((w/2,h/2),90*int(4*params['rate']['rotat']),1) | |
| img = cv2.warpAffine(img,M,(w,h)) | |
| if params['flag']['color']: | |
| img = impro.color_adjust(img,params['rate']['color'][0],params['rate']['color'][1], | |
| params['rate']['color'][2],params['rate']['color'][3],params['rate']['color'][4]) | |
| if params['flag']['flip']: | |
| img = img[:,::-1] | |
| #check shape | |
| if img.shape[0]!= finesize or img.shape[1]!= finesize: | |
| img = cv2.resize(img,(finesize,finesize)) | |
| print('warning! shape error.') | |
| return img | |
| def random_transform_pair_image(img,mask,finesize,test_flag = False): | |
| params = get_transform_params() | |
| img = random_transform_single_image(img,finesize,params) | |
| params['flag']['degradate'] = False | |
| params['flag']['color'] = False | |
| mask = random_transform_single_image(mask,finesize,params) | |
| return img,mask | |
| def showresult(img1,img2,img3,name,is0_1 = False): | |
| size = img1.shape[3] | |
| showimg=np.zeros((size,size*3,3)) | |
| showimg[0:size,0:size] = tensor2im(img1,rgb2bgr = False, is0_1 = is0_1) | |
| showimg[0:size,size:size*2] = tensor2im(img2,rgb2bgr = False, is0_1 = is0_1) | |
| showimg[0:size,size*2:size*3] = tensor2im(img3,rgb2bgr = False, is0_1 = is0_1) | |
| cv2.imwrite(name, showimg) | |