Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

이미지를 PyTorch Tensor(텐서)로 변환하는 방법

PyTorch 텐서(tensor)는 단일 데이터 타입으로 구성된 요소들을 담고 있는 n차원 배열(행렬)입니다. 텐서는 NumPy 배열과 매우 유사하지만, 결정적인 차이점이 하나 있습니다. 바로 PyTorch 텐서는 GPU를 활용해 수치 연산을 가속화할 수 있다는 점입니다. 이러한 고속 연산을 수행하려면 먼저 이미지를 텐서 형태로 변환해야 합니다.

이 글에서는 이미지를 PyTorch 텐서로 변환하는 방법을 단계별로 살펴보겠습니다.

변환 절차

  • 필요한 라이브러리 임포트: torch, torchvision, Pillow 라이브러리가 필요합니다.

  • 이미지 읽기: 이미지는 PIL 이미지이거나 [0, 255] 범위의 값으로 구성된 numpy.ndarray(HxWxC) 형태여야 합니다. 여기서 H, W, C는 각각 이미지의 높이(height), 너비(width), 채널 수(channels)를 의미합니다.

  • 변환(transform) 정의: transforms.ToTensor()를 사용하여 이미지를 텐서로 변환하는 transform을 정의합니다.

  • 텐서 변환 실행: 앞서 정의한 transform을 이미지에 적용하여 텐서로 변환합니다.

예제 1: PIL 이미지를 텐서로 변환하기

# 필요한 라이브러리 임포트
import torch
from PIL import Image
import torchvision.transforms as transforms

# 이미지 읽기
image = Image.open('Penguins.jpg')

# 이미지를 텐서로 변환하는 transform 정의
transform = transforms.ToTensor()

# 이미지를 PyTorch 텐서로 변환
tensor = transform(image)

# 변환된 이미지 텐서 출력
print(tensor)

출력 결과

tensor([[[0.4510, 0.4549, 0.4667, ..., 0.3333, 0.3333, 0.3333],
         [0.4549, 0.4510, 0.4627, ..., 0.3373, 0.3373, 0.3373],
         [0.4667, 0.4588, 0.4667, ..., 0.3451, 0.3451, 0.3412],
         ...,
         [0.6706, 0.5020, 0.5490, ..., 0.4627, 0.4275, 0.3333],
         [0.4196, 0.5922, 0.6784, ..., 0.4627, 0.4549, 0.3569],
         [0.3569, 0.3529, 0.4784, ..., 0.3922, 0.4314, 0.3490]],

        [[0.6824, 0.6863, 0.7020, ..., 0.6392, 0.6392, 0.6392],
         [0.6863, 0.6824, 0.6980, ..., 0.6314, 0.6314, 0.6314],
         [0.6980, 0.6902, 0.6980, ..., 0.6392, 0.6392, 0.6353],
         ...,
         [0.7255, 0.5412, 0.5765, ..., 0.5255, 0.5020, 0.4157],
         [0.4706, 0.6314, 0.7098, ..., 0.5255, 0.5294, 0.4392],
         [0.4196, 0.3961, 0.5020, ..., 0.4510, 0.5059, 0.4314]],

        [[0.8157, 0.8196, 0.8353, ..., 0.7922, 0.7922, 0.7922],
         [0.8196, 0.8157, 0.8314, ..., 0.7882, 0.7882, 0.7882],
         [0.8314, 0.8235, 0.8314, ..., 0.7961, 0.7961, 0.7922],
         ...,
         [0.6235, 0.5059, 0.6157, ..., 0.4863, 0.4941, 0.4196],
         [0.3922, 0.6000, 0.7176, ..., 0.4863, 0.5216, 0.4431],
         [0.3686, 0.3647, 0.4863, ..., 0.4235, 0.4980, 0.4353]]])

위 파이썬 프로그램에서는 PIL 이미지를 텐서로 성공적으로 변환했습니다. 참고로 transforms.ToTensor()는 픽셀 값을 자동으로 [0, 255] 범위에서 [0.0, 1.0] 범위로 스케일링하며, 이미지 차원을 (H x W x C)에서 (C x H x W) 순서로 재배열한다는 점도 기억해 두면 좋습니다.

예제 2: OpenCV로 읽은 이미지를 텐서로 변환하기

PIL뿐만 아니라 OpenCV를 사용해서도 이미지를 읽을 수 있습니다. OpenCV로 읽어들인 이미지는 numpy.ndarray 타입이며, 역시 transforms.ToTensor()를 통해 텐서로 변환할 수 있습니다. 다음 예제를 확인해 보세요.

# 필요한 라이브러리 임포트
import torch
import cv2
import torchvision.transforms as transforms

# 이미지 읽기
image = cv2.imread('Penguins.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 이미지를 텐서로 변환하는 transform 정의
transform = transforms.ToTensor()

# 이미지를 PyTorch 텐서로 변환
tensor = transform(image)

# 변환된 이미지 텐서 출력
print(tensor)

출력 결과

tensor([[[0.4510, 0.4549, 0.4667, ..., 0.3333, 0.3333, 0.3333],
         [0.4549, 0.4510, 0.4627, ..., 0.3373, 0.3373, 0.3373],
         [0.4667, 0.4588, 0.4667, ..., 0.3451, 0.3451, 0.3412],
         ...,
         [0.6706, 0.5020, 0.5490, ..., 0.4627, 0.4275, 0.3333],
         [0.4196, 0.5922, 0.6784, ..., 0.4627, 0.4549, 0.3569],
         [0.3569, 0.3529, 0.4784, ..., 0.3922, 0.4314, 0.3490]],

        [[0.6824, 0.6863, 0.7020, ..., 0.6392, 0.6392, 0.6392],
         [0.6863, 0.6824, 0.6980, ..., 0.6314, 0.6314, 0.6314],
         [0.6980, 0.6902, 0.6980, ..., 0.6392, 0.6392, 0.6353],
         ...,
         [0.7255, 0.5412, 0.5765, ..., 0.5255, 0.5020, 0.4157],
         [0.4706, 0.6314, 0.7098, ..., 0.5255, 0.5294, 0.4392],
         [0.4196, 0.3961, 0.5020, ..., 0.4510, 0.5059, 0.4314]],

        [[0.8157, 0.8196, 0.8353, ..., 0.7922, 0.7922, 0.7922],
         [0.8196, 0.8157, 0.8314, ..., 0.7882, 0.7882, 0.7882],
         [0.8314, 0.8235, 0.8314, ..., 0.7961, 0.7961, 0.7922],
         ...,
         [0.6235, 0.5059, 0.6157, ..., 0.4863, 0.4941, 0.4196],
         [0.3922, 0.6000, 0.7176, ..., 0.4863, 0.5216, 0.4431],
         [0.3686, 0.3647, 0.4863, ..., 0.4235, 0.4980, 0.4353]]])

주의할 점은 OpenCV는 기본적으로 이미지를 BGR 순서로 불러오기 때문에, 위 예제처럼 cv2.cvtColor(image, cv2.COLOR_BGR2RGB)를 사용해 RGB 순서로 변환해 주는 것이 좋습니다. 그래야 PIL로 처리한 결과와 동일한 텐서 값을 얻을 수 있습니다.

마무리

정리하면, 이미지를 PyTorch 텐서로 변환하는 과정은 매우 간단합니다. PIL 또는 OpenCV로 이미지를 읽은 뒤, transforms.ToTensor() transform을 정의하고 적용하기만 하면 됩니다. 이렇게 변환된 텐서는 GPU 가속 연산과 딥러닝 모델 학습에 바로 활용할 수 있습니다.