본문 바로가기
컴퓨터 언어/Python_Pytorch

[ PyTorch / torchvision ] make_grid() 사용하기

by SuperMemi 2022. 8. 30.
반응형

[ PyTorch / torchvision ] make_grid() 사용하기

 

https://pytorch.org/


[ 이전 글 ]

[ Pytorch ] 파이토치 텐서 합치는 방법 : cat(), stack() ( + dim의 의미와, 병합 방식의 차이)

[ Pytorch ] nn.BCELoss, nn.BCEWithLogitsLoss, nn.CrossEntropyLoss, nn.NLLLoss 총정리


torchivision.utils.make_grid (링크)

이미지 텐서들을 모아서 grid 형태로 만들어주는 함수입니다. 이미지 시각화에 유용합니다. 

parameters 

  • tensor (Tensor or list) : 4D mini-batch Tensor (Batch, Channel, Height, Width) 또는 같은 크기의 이미지 리스트
  • nrow (int, optional) : 한 행에 표시될 이미지의 개수. 최종 그리드의 형태는 ( Batch / nrow, nrow )가 됩니다. (Default : 8)
  • padding (int, optional) : 전체 텐서의 좌우상하 각각 padding + 이미지 사이 간격 pdding (Default : 2)
  • normalize (bool, optional) : True 일 경우, image 를 0~1 값으로 변환. (아래 value_range의 min, max 값을 기준) (Default : False)
  • value_range (tuple, optional) : 튜플 (min, max) 을 따로 설정가능. (Default : tensor에서 자동으로 min, max 계산)
  • scale_each (bool, optional) : True 일 경우, 전체 이미지에서 min, max를 찾는 것이 아니라 각 이미지 별로 scaling 진행. (Default : False)
  • pad_value (float, optional) : 패딩 되는 픽셀의 값 (Default : 0)

 

returns

  • tensor : 이미지의 그리드를 담은 텐서 반환. (type : grid(Tensor)
  • 쉽게말해 여러 이미지 텐서를 타일처럼 합쳐서 하나의 텐서로 만들어 줍니다.

예시 

  • 1 ) 시각화 코드
  • 2 ) make_grid 적용
  • 3 ) make_grid 적용 : nrow 설정
  • 4 ) make_grid 적용 : nrow 가 이미지 개수에 맞춰서 딱 떨어지지 않을 때

사용된 사진 : dog1.jpg, dog2.jpg

아래의 사진을 다운 받으셔서 assets 이라는 파일 아래에 저장해주세요.

ex) assets/dog1.jpg

from torch/vision

 

1 ) 시각화 코드

make_grid 의 결과를 확인하기 위한 시각화 코드입니다.

# code from https://pytorch.org/vision/stable/auto_examples/plot_visualization_utils.html

import torch
import numpy as np
import matplotlib.pyplot as plt

import torchvision.transforms.functional as F

plt.rcParams["savefig.bbox"] = 'tight'

def show(imgs):
    if not isinstance(imgs, list): # 하나의 이미지일때
        imgs = [imgs]
    fig, axs = plt.subplots(ncols=len(imgs), squeeze=False) # 총 사진의 개수만큼 plot
    for i, img in enumerate(imgs):
        img = img.detach() # 학습 그래프에서 제외
        img = F.to_pil_image(img) # torch.tensor 에서 pil 이미지로 변환
        axs[0, i].imshow(np.asarray(img)) # numpy 배열로 변경후, 가로로 이미지를 나열
        axs[0, i].set(xticklabels=[], yticklabels=[], xticks=[], yticks=[])

위의 코드를 이해하기 위해서는 아래의 글을 참고하시면 좋습니다.

 

[ Python / PIL ] PIL 이미지와 Torch.Tensor 변환 (ToTensor, ToPILImage)

 

[ Python / PIL ] PIL 이미지와 Torch.Tensor 변환 (ToTensor, ToPILImage)

2021.12.29 - [Computer Language/Python] - [ Python / PIL ] PIL 이미지, Numpy 배열 변환 및 저장 ( Image.fromarray(), np.array(), np.asarray() ) [ Python / PIL ] PIL 이미지, Numpy 배열 변환 및 저장 (..

supermemi.tistory.com

 

2 ) make_grid 적용

전체 이미지가 2개입니다. Default nrow 인 8보다 작습니다.

make_grid 의 결과로 한 행에 2개의 이미지가 순서대로 들어간 형태가 됩니다.

# code from https://pytorch.org/vision/stable/auto_examples/plot_visualization_utils.html
from torchvision.utils import make_grid
from torchvision.io import read_image
from pathlib import Path

# read_image : 이미지 파일을 읽어옵니다.
dog1_int = read_image(str(Path('assets') / 'dog1.jpg')) # assets/dog1.jpg
dog2_int = read_image(str(Path('assets') / 'dog2.jpg')) # assets/dog2.jpg

# 두 이미지를 리스트로 연결해 줍니다.
dog_list = [dog1_int, dog2_int] # size:(2,3,500,500)

grid = make_grid(dog_list) # Default : padding(2)

# grid shape (Channel, Height, Width)
# Channel : 3 (RGB)
# Height : 504 
# Width : 1006 
print(grid.shape) # torch.Size([3, 504, 1006])

show(grid)

Padding 의 결과 grid shape 입니다.

  • Channel : 3 (RGB)
  • Height : 504 = 500 (세로 이미지 1 개) + 4 (위아래 끝)
  • Wdith : 1006 = 1000 (가로 이미지 2 개) + 4 (좌우 끝) + 2 (두 이미지 사이 간격 패딩) 

결과

 

3 ) make_grid 적용 : nrow 설정

이번에는 전체 이미지가 6개이고, nrow=3 으로 설정해봤습니다.

이미지의 개수가 nrow 보다 큽니다.

즉, make_grid 의 결과로 한 행에 이미지가 순서대로 3개씩 들어갑니다.

# code from https://pytorch.org/vision/stable/auto_examples/plot_visualization_utils.html
from torchvision.utils import make_grid
from torchvision.io import read_image
from pathlib import Path

# read_image : 이미지 파일을 읽어옵니다.
dog1_int = read_image(str(Path('assets') / 'dog1.jpg')) # assets/dog1.jpg
dog2_int = read_image(str(Path('assets') / 'dog2.jpg')) # assets/dog2.jpg

# 여섯개의 이미지를 리스트로 연결해 줍니다.
dog_list = [dog1_int, dog2_int, dog1_int, dog2_int, dog1_int, dog2_int]
# size:(6,3,500,500)

grid = make_grid(dog_list, nrow=3) # 한 행의 이미지를 3개씩 넣는다. Default : padding(2)

# grid shape (Channel, Height, Width)
# Channel : 3 (RGB)
# Height : 1006
# Width : 1508
print(grid.shape) # torch.Size([3, 1006, 1508])

show(grid)

Padding 의 결과 grid shape 입니다.

  • Channel : 3 (RGB)
  • Height : 1006 = 1000 (세로 이미지 2 개) + 4 (위아래 끝) + 2 (두 이미지 사이 간격 패딩)
  • Wdith : 1508 = 1500 (가로 이미지 3 개) + 4 (좌우 끝) + 4 (세 이미지 사이 간격 패딩)

결과

 

4 ) make_grid 적용 : nrow 가 이미지 개수에 맞춰서 딱 떨어지지 않을 때

이번에는 전체 이미지가 6개이고, nrow=4 으로 설정해봤습니다. 

앞에서와 마찬가지로, make_grid 의 결과로 한 행에 이미지가 순서대로 4개씩 들어갑니다.

그러나 두번째 행에 4개를 채워야 하는데 남은 이미지가 2개밖에 없습니다!!

남은 2개의 자리는 padding 처리합니다. pad_value 를 바꿔보면 알 수 있습니다. 

# code from https://pytorch.org/vision/stable/auto_examples/plot_visualization_utils.html
from torchvision.utils import make_grid
from torchvision.io import read_image
from pathlib import Path

# read_image : 이미지 파일을 읽어옵니다.
dog1_int = read_image(str(Path('assets') / 'dog1.jpg')) # assets/dog1.jpg
dog2_int = read_image(str(Path('assets') / 'dog2.jpg')) # assets/dog2.jpg

# 여섯개의 이미지를 리스트로 연결해 줍니다.
# size:(6,3,500,500)
dog_list = [dog1_int, dog2_int, dog1_int, dog2_int, dog1_int, dog2_int]

# 한 행의 이미지를 4개씩 넣는다. 
# pad 는 회색으로 채워넣음
# Default : padding(2)
grid = make_grid(dog_list, nrow=4, pad_value=128) 


# grid shape (Channel, Height, Width)
# Channel : 3 (RGB)
# Height : 1006
# Width : 2010
print(grid.shape) # torch.Size([3, 1006, 2010])

show(grid)

Padding 의 결과 grid shape 입니다.

  • Channel : 3 (RGB)
  • Height : 1006 = 1000 (세로 이미지 2 개) + 4 (위아래 끝) + 2 (두 이미지 사이 간격 패딩)
  • Wdith : 2010 = 1000 (가로 이미지 2 개) + 1000 (빈 이미지 자리 패딩) + 4 (좌우 끝) + 6 (네 이미지 사이 간격 패딩)

결과


[ 다음 글 ]

[ PyTorch / torchvision ] draw_bounding_boxes() 사용하기

 

[ PyTorch / torchvision ] draw_bounding_boxes() 사용하기

[ PyTorch / torchvision ] draw_bounding_boxes() 사용하기 [ 이전 글 ] [ PyTorch / torchvision ] make_grid() 사용하기 [ Pytorch ] 파이토치 텐서 합치는 방법 : cat(), stack() ( + dim의 의미와, 병..

supermemi.tistory.com

[ PyTorch / torchvision ] draw_segmentation_masks() 사용하기

 

[ PyTorch / torchvision ] draw_segmentation_masks() 사용하기

[ PyTorch / torchvision ] draw_segmentation_masks() 사용하기 [ 이전 글 ] [ PyTorch / torchvision ] draw_bounding_boxes() 사용하기 [ PyTorch / torchvision ] make_grid() 사용하기 [ Pytorch ] nn..

supermemi.tistory.com


[ 참고 ]

https://pytorch.org/vision/stable/auto_examples/plot_visualization_utils.html


 

반응형