版权归属:
更多关注:
1 问题
PyTorch实现image-to-image时,需要对image pair进行相同参数的transform(i.e. sync),torchvision已经实现了多种针对single image的transform,但是在使用时input image与target image的transform不一致,上网查阅没有发现好的方法,因此只能自己实现。查看了TorchVision的Transform代码,自己也是可以仿照实现。
2 Random Scale and Crop原理
将原始图片放大scale=r倍,为了满足crop后的图片中间的蓝色区域没有被分割遗漏,就需要满足crop size > min crop size,进而得到r > 2n/(m+n)。
如果将n=256, m=172带入,r大概1.2左右。反过来如果令r在[1.0, 1.2]之间那么m=170.6,实际中取m=170 or 172。
3 实现代码
Talk is cheap, show me the code.
#coding=utf-8
import torchvision.transforms as transforms
import torchvision.transforms.functional as F
import random
import numpy as np
from PIL import Image
import numbers
import collections
import sys
if sys.version_info < (3, 3):
Sequence = collections.Sequence
Iterable = collections.Iterable
else:
Sequence = collections.abc.Sequence
Iterable = collections.abc.Iterable
def get_sync_transform(opt):
transform_list = []
osize = [opt.loadSize, opt.loadSize]
transform_list.append(Resize(osize, Image.BILINEAR))
transform_list.append(RandomScaleCrop())
if opt.isTrain and not opt.no_flip:
transform_list.append(transforms.RandomHorizontalFlip())
transform_list += [ToTensor(),
Normalize