Logical Scribbles
[PyTorch] 파이토치 Torchvision.transforms 를 이용하여 이미지 갖고 놀아보기 본문
이번 포스팅에서는 파이토치의 torchvision.transforms를 갖고 놀아보는 시간을 가져보자.
torchvision.transforms에서는 다양한 변형을 제공한다. 이는 데이터의 전처리 등에 사용되며 데이터가 효과적으로 학습되기 위해 필수적이다. 오늘은 그 변형들 중 Resizing, Random Horizontal Flip, Nomalize, Compose, Center Crop, Five Crop, Gray Scale 그리고 Random Invert를 한 이미지에 적용하고 어떠한 변화가 있나 살펴볼 것이다.
1. 모듈 가져오기
import torch
from torchvision import transforms
import matplotlib.pyplot as plt
모듈로는 torch, transforms, matplotlib.pyplot을 가져온다.
- torch : 이미지를 텐서로 만들기 위하여 기본적으로 필요하다.
- transforms : 오늘의 핵심! 이미지 변환을 해주는 모듈이다.
- matplotlib.pyplot : 변환된 이미지를 그려서 확인할 때 필요하다.
2. 이미지 가져오기
내 블로그의 프로필사진(?)을 갖고 와보자.
from google.colab import drive
drive.mount('Play_with_image')
image = plt.imread('/content/Play_with_image/MyDrive/624cd542-49d9-4b54-b1c5-fe9e3c2d8eff.png')
plt.imshow(image)
plt.show()
구글 Colab에서 드라이브 내 파일을 불러오고 파이썬에서 작업한 결과 파일을 드라이브에 저장 가능하도록 Colab과 드라이브를 연동한다. 그 후 이미지를 가져오고, 출력해본다.
성공적으로 이미지를 불러온 것을 확인할 수 있다. 이제 이 이미지를 텐서로 변환한 후 갖고 놀아보자!
timage = torch.Tensor(image)
timage.shape
#output : torch.Size([512, 512, 3])
이미지가 RGB 컬러를 갖고 있기 때문에 512*512 뒤에 3이 있는 것을 확인할 수 있다. 이미지의 사이즈는 512*512이다.
3. Image Resizing
Resize를 이용하면 이미지의 사이즈를 변경할 수 있다. 나는 기존의 512*512 이미지를 32*32로 바꿔보았다.
play1 = transforms.Resize((32,32))
play1_image = play1(timage.T)
print(play1_image.shape)
plt.imshow(play1_image.T, cmap = 'gray_r')
plt.show()
4. Random Horizontal Flip
Random Horizontal Flip은 임의로 사진을 위아래 대칭을 시켜주는 변형이다. 기본값은 0.5이고, 이는 50% 확률로 사진을 뒤집어준다는 의미이다.
play2 = transforms.RandomHorizontalFlip() #기본 값 0.5
play2_image = play2(timage.T)
print(play2_image.shape)
plt.imshow(play2_image.T, cmap = 'gray_r')
plt.show()
5. Nomalize
Nomalize는 이미지의 경우 픽셀 값 하나 하나가 0 ~ 255 값을 갖는데, 텐서로 타입 변환 시 픽셀 값이 0 ~ 1 사이의 값으로 바뀌게 된다. 이를 -1 ~ 1 사이의 값으로 정규화시켜 이미지를 동일한 조건으로 맞추어줘 학습을 진행하기 위해서 라고한다. 즉, 데이터가 유사한 범위를 가지도록 하기 위함이다.
play3 = transforms.Normalize((0.1), (1.9))
play3_image = play3(timage.T)
print(play3_image.shape)
plt.imshow(play3_image.T, cmap = 'gray_r')
plt.show()
6. Compose
CNN 모델의 이미지 전처리 과정에서 compose를 사용하는 것을 많이 볼 수 있을 것이다. 그만큼 중요하다고 생각된다.
파이토치 설명서에 나와있는 compose에 대한 설명을 가져와봤다.
"transforms.Compose - 여러 단계로 변환해야 하는 경우, Compose를 통해 여러 단계를 묶을 수 있다."
말 그대로 변환의 여러 단계를 1개로 묶어서 진행할 수 있다는 것이다. 엄청 편리한 기능이다. 나는 앞의 Resize, Random Horizontal Flip, Normalize를 묶어서 사용해 보았다. 주의해야할 점은, 맨 처음의 ToPILImage()와 중간의 ToTensor()이다. 데이터릴 PILImage로 바꿔주어 resize, random horizontal flip을 진행한 후, Normalize 작업은 텐서를 가져와 평균 및 표준 편차로 정규화하기 때문에 데이터를 텐서로 변환해 준 것이다.
play4 = transforms.Compose([transforms.ToPILImage(),
transforms.Resize((256, 256)),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize((0.5), (0.5))# T.Normalize([0.5],[0.5])
])
play4_image = play4(timage.T)
print(play4_image.shape)
plt.imshow(play4_image.T, cmap = 'gray_r')
plt.show()
7. Center Crop
Center Crop은 말그대로 이미지의 중앙을 잘라서 새로운 이미지로 변환하는 것이다. 나는 이미지 중앙의 100*100 만큼 잘라보았다.
play5 = transforms.CenterCrop(100)
play5_image = play5(timage.T)
print(play5_image.shape)
plt.imshow(play5_image.T, cmap = 'gray_r')
plt.show()
8. Five Crop
이미지의 모서리 4개와 중앙, 총 5개 구역에서 crop을 진행한다. 결과는 tuple 형태로 반환되고, crop 후 이미지의 크기를 parameter로 요구한다. 이번에도 100*100 사이즈의 이미지로 5개 잘라보고, 출력도 해보았다. Five Crop의 아웃풋이 튜플 형태이기 때문에 기존의 출력과는 코드가 살짝 다르다.
play6 = transforms.FiveCrop(100)
play6_image = play6(timage.T)
for index in range(1,6):
plt.subplot(1, 5, index)
plt.axis('off')
plt.imshow(play6_image[index-1].T, cmap='gray_r')
plt.suptitle('Five Crop printings');
9. Gray Scale
이미지를 gray scale로 변환한다. 아웃풋 이미지의 채널을 파라미터로 설정할 수 있다. 만약 grayscale(1)인 경우 아웃풋으로 1차원 이미지를 반환하고, 3인 경우, RGB 채널을 모두 동일한 값으로 설정하여 출력한다.
- If grayscale(1) : 반환된 이미지는 단일 채널이다.num_output_channels == 1
- If grayscale(3) : 반환된 이미지는 r == g == b인 3채널이다.num_output_channels == 3(출처 : https://pytorch.org/vision/main/generated/torchvision.transforms.Grayscale.html)
play7 = transforms.Grayscale(3)
play7_image = play7(timage.T)
plt.imshow(play7_image.T)
plt.show()
10. Random Invert
이미지를 샘플링 한 후, invert를 진행한다. 입력 파라미터로는 sampling ratio p를 설정 해주어야 한다. 텐서의 경우, 모든 픽셀의 값이 [0,1]로 normalize 되어있는데, 이때, Invert를 수행하면, 1-기존 pixel값을 아웃풋 이미지로 반환한다. 나는 모든 이미지의 픽셀을 샘플링 하여 invert 진행 해보았다.
play8 = transforms.RandomInvert(1)
play8_image = play8(timage.T)
plt.imshow(play8_image.T)
plt.show()
torchvision.transforms 에서는 이번 포스팅에서 소개한 이미지 변형 말고도 더 많은 변형을 제공하고 있다. 더 자세히 알고 싶으면 아래 링크를 참고하면 좋다.
https://pytorch.org/vision/main/transforms.html
끝!
'딥러닝 > PyTorch' 카테고리의 다른 글
[PyTorch] Cosine Annealing Warm Up Restarts (0) | 2024.01.03 |
---|