Question: transforms.Resize와 transforms.CenterCrop을 동일한 사이즈로 하면 같지 않을까?
A : (1) 단일 사이즈만을 정의하면 Resize한 결과와 CenterCrop한 결과가 다르고,
(2) (H,W)를 모두 정의하면 그 결과가 같다.
아래의 예시 코드는 Pytorch tutorial의 DCGAN 구현 코드이다. 코드에서 데이터 셋에 대하여 Resize 후 CenterCrop을 하는 preprocessing 과정을 거친다.
dataset = dset.ImageFolder(root=dataroot,
transform=transforms.Compose([
transforms.Resize(image_size),
transforms.CenterCrop(image_size),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
]))
(출처: DCGAN 튜토리얼 — 파이토치 한국어 튜토리얼 (PyTorch tutorials in Korean))
이때, transforms.Resize의 정의는 pytorch 공식 문서에서 확인할 수 있는데, 단일 int 를 size의 parameter로 넘겨주게 되면 이미지의 짧은 edge가 입력 받은 인자의 크기가 되면서 이미지 비율이 유지되도록 resize 된다고 한다.
예를 들어, 150x50 크기의 이미지를 transforms.Resize(10)를 적용한다면 30x10으로 resize될 수 있다.
따라서 transforms.Resize의 결과는 항상 nxn의 정사각 이미지 형태가 아닐 수 있다.
따라서, 해당 resized 된 결과에 대하여 CenterCrop을 적용해야만 nxn 이미지의 형태가 되는 것이다.
다만 size에 대하여 transforms.Resize(size=(N,N))으로 적용하면 resize된 output이 정사각 형태가 되므로 CenterCrop(N)의 필요성이 없어지게 된다.
즉, size에 전달하는 인자의 형태에 따라 CenterCrop의 필요성이 정해지니 Resize 함수의 인자에 따른 동작을 잘 이해하고 적용하여야 한다.
