Maxima's Lab

[Python, Pytorch] torchvision.transforms 사용법 본문

Python/Pytorch

[Python, Pytorch] torchvision.transforms 사용법

Minima 2022. 9. 20. 22:51
728x90
SMALL

안녕하세요, 오늘은 Pytorch 내 torchvision.transforms에 대해 알아보도록 하겠습니다.

 

transforms 내 알아볼 내용들은 다음과 같습니다.

 

  • CenterCrop
  • RandomCrop
  • Resize
  • RandomVerticalFlip & RandomHorizontalFlip

 

아래의 Original Image에 대해 적용해보도록 하겠습니다.

 

Original Image

위의 이미지는 (256, 256, 3) Shape을 지니고 있는 이미지입니다. 먼저, (200, 200, 3) Shape로 Center Crop을 적용해보겠습니다.

 

import torch
import torchvision.transforms as transforms

transforms = transforms.Compose(
    [transforms.ToTensor(),
     transforms.CenterCrop(size=(200, 200))]
)

result = transforms(img)
result = result.permute(1,2,0).detach().numpy()

plt.figure(figsize=(9, 9))
plt.imshow(result)
plt.axis("off")
plt.show()

위의 코드를 적용한 Center Cropped Image는 다음과 같습니다.

 

Center Cropped Image

위의 전체 코드에 대해 알아보도록 하겠습니다.

 

print(type(img))

result = transforms(img)
print(type(result))
print("Tensor Result Shape : ", result.shape)
print(result.device)

result = result.permute(1,2,0).detach().numpy()
print(type(result))
print("Numpy Result Shape : ", result.shape)
<class 'numpy.ndarray'>
<class 'torch.Tensor'>
Tensor Result Shape :  torch.Size([3, 200, 200])
cpu
<class 'numpy.ndarray'>
Numpy Result Shape :  (200, 200, 3)

 img의 type은 순차적으로 transforms 함수를 적용 전(numpy.ndarray) -->  함수 적용 후(torch.Tensor) --> detach().numpy() 적용 후(numpy.ndarray) 변화하는 것을 볼 수 있습니다.

 

또한, img의 shape은 transforms 함수를 적용하기 전에는 (256, 256, 3) 이지만 적용 후에는 (3, 200, 200)로 변하게 되고, permute(1, 2, 0)를 통해 (200, 200, 3)으로 변합니다. 참고 사항으로, torch.Tensor로 사용되는 동안 해당 Tensor의 device는 cpu인 것을 확인할 수 있습니다.

 


import torch
import torchvision.transforms as transforms

transforms = transforms.Compose(
    [transforms.ToTensor(),
     transforms.RandomCrop(size=(200, 200))]
)

위의 transforms 함수를 통해 Random Crop을 적용한 이미지 결과는 다음과 같습니다.

 

Random Cropped Image

 


다음은 Center Crop 후 Resize를 적용하기 위한 코드입니다.

 

import torch
import torchvision.transforms as transforms

transforms = transforms.Compose(
    [transforms.ToTensor(),
     transforms.CenterCrop(size=(200, 200)),
     transforms.Resize(size=(128, 128))]
)

위의 코드를 적용하게 되면, Original Image (256, 256, 3) --> Center Cropped Image (3, 200, 200) --> Resized Image (3, 128, 128)로 변하게 되며 permute(1, 2, 0)를 통해 최종적으로 (128, 128, 3)의 형태로 변하게 됩니다.

 


다음은 RandomVerticalFlip(p) & RandomHorizontalFlip(p)에 대한 코드입니다.

 

import torch
import torchvision.transforms as transforms

transforms_Vflip = transforms.Compose(
    [transforms.ToTensor(),
     transforms.RandomVerticalFlip(p=0.9)]
)

transforms_Hflip = transforms.Compose(
    [transforms.ToTensor(),
     transforms.RandomHorizontalFlip(p=0.9)]
)

위의 코드에서 p=0.9의 확률로 무작위로 Vertical Flip & Horizontal Flip를 적용하게 됩니다. 해당 결과는 다음과 같습니다.

(p 값의 default 값은 0.5 입니다.)

 

Vertical Flipped Image

 

Horizontal Flipped Image

 


지금까지, Pytorch 내 transforms를 사용하는 방법에 대해서 알아보았습니다.

728x90
LIST
Comments