소소한 블로그

[6주차 - Day27] Augmentation 적용 결과 시각화하기 본문

부스트캠프 AI Tech

[6주차 - Day27] Augmentation 적용 결과 시각화하기

happy_ai 2021. 9. 9. 12:11

Train datasets은 실제 데이터 분포를 설명하기에는 너무 제한적입니다.

Augmentation은 Train datasets의 분포를 더 dense하게 만드는 효과를 낼 수 있습니다.

 

여기서는 다른 것이 아닌 Augmentation이 적용된 이후의 이미지를

확인하는 방법에 대해서 알아보겠습니다.


코드는 아래와 같습니다.

import matplotlib.pyplot as plt
import torchvision
import random

# 시각화할 데이터
img, label = next(iter(qd_train_dataloader))

# 랜덤으로 8개 시각화할 예정
idx = random.randint(0, 55)
inverse_class_dict = {value:key for key,value in class_dict.items()}

# 시각화 start
visualized_img = torchvision.utils.make_grid(img[idx:idx+8], nrow=4)
visualized_img = visualized_img.cpu().numpy()
visualized_img = visualized_img.transpose((1,2,0))

plt.figure(figsize=(15,20))
plt.title([inverse_class_dict[int(label[i])] for i in range(idx, idx+8)])

plt.imshow(visualized_img)
plt.show()
# 시각화 end

하나씩 살펴보겠습니다.

1. torchvision.utils.make_grid 사용

한번에 여러개의 사진을 보고 싶어서 해당 함수를 사용하였습니다.

 

 

2. visualized_img.cpu().numpy()

이 코드를 작성한 이유는 tensor형태의 변수를 시각화를 위해서는 transpose함수를 사용해야 하는데,

(transpose를 사용해야하는 이유는 아래 3번째 항목에서 설명하겠습니다.)

transpose는 numpy에 적용되는 함수이기 때문입니다.

만약 시각화를 하고 싶은 tensor가 gpu에 올라가있다면,

numpy로 바로 변환하지 못하므로

tensor를 cpu로 옮긴 후 numpy 형태로 변환하였습니다.

 

 

3. visualized_img.transpose((1, 2, 0))

이와 같이 transpose를 하는 이유는

PyTorch는 기본 Tensor 형태가 (batch, channel, height, width)이고,

PILLow와 Matplotlib의 기본 이미지 array 형태는 (batch, height, width, channel)이기 때문입니다.

+ 참고

https://stackoverflow.com/questions/53623472/how-do-i-display-a-single-image-in-pytorch

 

How do I display a single image in PyTorch?

I want to display a single image loaded using ImageLoader and stored in a PyTorch Tensor. When I try to display it via plt.imshow(image) I get: TypeError: Invalid dimensions for image data The .sh...

stackoverflow.com

 

 

항상 이미지 확인할 때마다 구글링을 하는 것이 아쉬워

이렇게 글로 정리해봤습니다ㅎㅎ

 

그럼 이만~