[ PyTorch / torchvision ] make_grid() 사용하기
[ 이전 글 ]
[ 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
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)
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_segmentation_masks() 사용하기
[ 참고 ]
https://pytorch.org/vision/stable/auto_examples/plot_visualization_utils.html
'컴퓨터 언어 > Python_Pytorch' 카테고리의 다른 글
[ PyTorch / torchvision ] draw_segmentation_masks() 사용하기 (0) | 2022.08.31 |
---|---|
[ PyTorch / torchvision ] draw_bounding_boxes() 사용하기 (0) | 2022.08.30 |
[ Pytorch ] nn.BCELoss, nn.BCEWithLogitsLoss, nn.CrossEntropyLoss, nn.NLLLoss 총정리 (0) | 2022.08.21 |
[ Pytorch ] 파이토치 텐서 합치는 방법 : cat(), stack() ( + dim의 의미와, 병합 방식의 차이) (0) | 2022.08.18 |
[ Pytorch ] 파이토치 설치하기 (0) | 2021.08.10 |