이것저것 기록

[DL, PyTorch] 이미지를 텐서(Tensor)로 변환하기 본문

Data Science/ML & DL

[DL, PyTorch] 이미지를 텐서(Tensor)로 변환하기

anweh 2020. 9. 30. 13:30

나만의 데이터셋을 CNN에 학습시키기 위한 첫 번째 단계 - 

이미지를 텐서 자료형으로 변환하는 것. 

 

딥러닝에서 이미지, 텍스트, 음성, 비디오 등의 데이터를 다룰 때, 이 데이터들을 파이썬 모듈 (이미지의 경우는 PIL이나 openCV)로 데이터를 numpy array의 형태로 불러온 후 torch.Tensor로 변환하는 작업이 필수적이다. 

나만의 데이터셋을 텐서로 변환하는 순서는 다음과 같다.

 

 

 

 

1. 이미지 파일을 텐서로 변환 및 정규화하기

from PIL import Image
import torch
from torch.utils.data import Dataset, DataLoader
import numpy as np
import torchvision
from torchvision import transforms



trans = transforms.Compose([transforms.Resize((100,100)), 
                            transforms.ToTensor(),
                            transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5))])
trainset = torchvision.datasets.ImageFolder(root = '이미지 파일이 들어있는 폴더의 상위경로', 
					transform = trans)

일단 이미지 전처리가 필요하다. 

transforms.Compose를 통해 이미지파일을 resize, totensor, normalize 시켜준다. 

이미지 파일의 크기를 맞춰주기 위한 'Resize'는 이미 이미지 파일이 정사각형으로 모두 동일하다면 스킵해도 된다. 

그리고 To.Tensor()를 통해 이미지를 텐서로 변환해준다. 

파이토치를 사용해 프로세스를 진행하려면 이미지를 텐서로 변환해서 네트워크에 넣어줘야하기 때문!

Normalize()를 해주면 이미지 데이터의 분산의 중심을 원점으로 맞춰주게 된다. 

  • 이미지의 경우 픽셀 값 하나는 0 ~ 255 값을 갖는다. 하지만 ToTensor()로 타입 변경시 0 ~ 1 사이의 값으로 바뀜.
  • transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))를 이용하여 -1 ~ 1사이의 값으로 normalized 시킴

trainset의 10번째 item

__getitem__을 통해 특정 인덱스의 아이템을 출력해봤다. 

이렇게 확인하면 텐서 변환 및 정규화가 잘 됐는지 확인할 수 있다. 

shape 확인

shape을 출력해봤다. 보다시피 [3, 100, 100]의 shape을 가지는 것을 알 수 있다.

이미지 파일이 RGB three channel이니까 3이 맞고, 높이와 넓이도 앞서 지정해준대로 잘 설정 돼 있는 모습.

 

 

 

 

 

2. DataLoader를 통해 네트워크에 올리기 

ImageFolder를 통해 불러온 trainset을 DataLoader를 사용하여 Batch형식으로 네트워크에 올려보자. 

trainloader = DataLoader(trainset, batch_size=5, shuffle=False, num_workers=2)
dataiter = iter(trainloader)
images = dataiter.next()
print(images)

 

 

 

 

Comments