본문 바로가기

Computer Vision

[Pytorch] transforms.Resize 후 transforms.CenterCrop 하는 이유

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 함수의 인자에 따른 동작을 잘 이해하고 적용하여야 한다. 

출처 : Resize — Torchvision 0.14 documentation (pytorch.org)

 

728x90