PyTorch의 torchvision 패키지
1. PyTorch torchvision 패키지 소개
PyTorch는 강력한 딥러닝 프레임워크로, 많은 연구자와 개발자들이 이미지 처리와 관련된 작업을 수행할 때 사용합니다. PyTorch의 서브 패키지 중 하나인 torchvision은 이미지 데이터셋의 "로드"와 "변환 " 을 간편하게 할 수 있도록 돕는 도구입니다.
torchvision 패키지는 다음과 같은 주요 구성 요소로 이루어져 있습니다.
1) Datasets(데이터셋): 여러 유명한 이미지 데이터셋을 손쉽게 불러올 수 있는 기능을 제공합니다. 예를 들어, CIFAR-10, ImageNet, MNIST 등 다양한 데이터셋을 지원합니다.
2) Transforms(변환): 이미지 데이터를 전처리하고 변환할 수 있는 다양한 기법을 제공합니다. 이는 데이터 증강(Data Augmentation)과 전처리(Preprocessing)에 유용합니다.
3) Models(모델): 사전 학습된(pre-trained) 여러 이미지 분류 모델을 제공합니다. ResNet, VGG, AlexNet 등의 모델을 간편하게 불러와 사용할 수 있습니다.
4) Utils(유틸리티): 이미지 처리와 관련된 다양한 유틸리티 함수들을 제공합니다. 이를 통해 이미지 입출력, 시각화 등을 쉽게 수행할 수 있습니다.
즉, torchvision을 사용하면, 복잡한 이미지 데이터 로딩 및 전처리 과정을 단순화할 수 있고, 코드의 가독성과 유지보수성을 높일 수 있습니다.
2. torchvision의 기능과 활용 방법
2.1 Datasets(데이터셋)
torchvision.datasets 모듈은 다양한 이미지 데이터셋을 로드하는 기능을 제공합니다. 다음은 Fashion MNIST 데이터셋을 불러오는 예제입니다.
datasets.FashionNIST 클래스를 사용하여 Fashion MNIST 데이터셋을 로드합니다. root는 데이터가 저장될 경로를 지정하고, train은 학습용 (train) 또는 테스트용(test) 데이터를 불러올지 선택합니다. download는 데이터셋이 로컬에 없을 경우 다운로드합니다.
import torchvision.datasets as datasets
train_dataset = datasets.FashionMNIST(
root='data',
train=True,
download=True,
transform=None # 이미지 변환(transformations)은 나중에 적용
)
test_dataset = datasets.FashionMNIST(
root='data',
train=False,
download=True,
transform=None
)
print(f'Training set size: {len(train_dataset)}')
print(f'Test set size: {len(test_dataset)}')
※ 코드 설명
1) 라이브러리 임포트:
import torchvision.datasets as datasets
torohvision.datasets 모듈을 datasets라는 이름으로 임포트합니다.
2) 훈련 데이터셋 로드:
train_dataset = datasets.FashionMNIST(
root='data', train=True,
>
download=True,
transform=None
root='data': 데이터셋을 저장할 디렉토리를 지정합니다. 여기서는 'data' 디렉토리를 사용합니다.
train-True: 훈련용 데이터셋을 로드합니다. FashionMNIST 데이터셋은 훈련 데이 터와 테스트 데이터로 나뉘어 있습니다.
download=True: 지정한 디렉토리에 데이터셋이 없으면 인터넷에서 다운로드하여 저장합니다.
transform=ilone: 이미지 변환(transformations)은 적용하지 않습니다.
3) 테스트 데이터셋 로드:
test_dataset = datasets.FashionMNIST(
root='data',
train=False,
download=True,
transform=None
>
train-False: 테스트용 데이터셋을 로드합니다. 나머지 인수는 위와 동일합니다.
4) 데이터셋 크기 출력:
print(f'Training set size: {len(train_dataset)}') print(f'Test set size: {len(test_dataset)}')
train_dataset과 test_dataset의 크기를 출력합니다. Ien 함수를 사용하여 데이터 셋의 샘플 수를 얻을 수 있습니다.
Training set size: 60000
Test set size: 10000
import matplotlib.pyplot as plt
# 여러 샘플 확인
for i in range(3):
image, label = train_dataset[i]
print(f'Sample {i + 1}')
print(f'Label: {label}')
plt.imshow(image, cmap='gray')
plt.title(f'Label: {label}')
plt.show()
Sample 1
Label: 9

Sample 2
Label: 0

Sample 3
Label: 0

2.2 Transforms(변환)
torchvision.transforms 모듈은 이미지 데이터를 다양한 방식으로 변환할 수 있는 기능을 제공합니다. 예를 들어, 이미지를 텐서(tensor)로 변환하거나, 정규화 (normalization), 크기 조정(resize) 등의 작업을 할 수 있습니다.
FashionMINIST 데이터셋을 다운로드하고, 훈련 데이터셋과 테스트 데이터셋으로 각각 로드하며, 데이터 전처리를 적용합니다. 전처리 과정에서 이미지를 텐서로 변환 합니다.
import torchvision.transforms as transforms
transform = transforms.Compose([
transforms.ToTensor(), # 이미지를 텐서로 변환
])
train_dataset = datasets.FashionMNIST(
root='data',
train=True,
download=True,
transform=transform # train 이미지 변환 적용
)
test_dataset = datasets.FashionMNIST(
root='data',
train=False,
download=True,
transform=transform # test 이미지 변환 적용
)
※ 코드 설명
1) 라이브러리 임포트:
import torchvision.transforms as transforms
해당 코드는 torohvision.transforms 모듈을 transforma라는 이름으로 임포트합니다. 이 모듈에는 이미지 데이터 변환을 위한 다양한 클래스와 함수들이 포함되어 있습니다.
2) 이미지 변환 정의:
transform = transforms.Compose([
])
transforms. ToTensor(), # 이미지를 텐서로 변환
transforma.Compose([...]): 여러 변환을 순서대로 적용할 수 있도록 묶어주는함 수입니다.
transforma.ToTensor(): 이미지 데이터를 파이토치 텐서로 변환합니다. 이 변환은 이미지를 [0. 255] 범위의 픽셀 값에서 [0.0. 1.0] 범위의 값으로 변환합니다.
3) 훈련 데이터셋 로드:
train_dataset = datasets.FashionMNIST(
root='data',
train=True,
download=True,
transform=transform #train 이미지 변환 적용
transform-transform 앞서 정의한 이미지 변환을 적용합니다. 이 변환은 데이터셋의 각 이미지에 대해 텐서 변환을 수행합니다.
4) 테스트 데이터셋 로드:
test_dataset = datasets.FashionMNIST(
root='data',
>
train=False,
download=True,
transform=transform #test 이미지 변환 적용
train False 테스트용 데이터셋을 로드합니다. 나머지 인수는 훈련 데이터셋 로드와 동일합니다.
2.3 Models(모델)
torohvision_models 모듈은 딥러닝 연구와 응용을 위해 사전 학습된 여러 유명한 모 델들을 제공하여, 사용자가 쉽게 모델을 로드하고 사용할 수 있도록 돕습니다. 이러 한 모델은 일반적으로 ImageNet 데이터셋으로 학습된 것이며, 사용자 정의 작업에 사용할 수 있습니다. 예를 들어, ResNet, VGG, AlexNet, MobileNet 등이 포함됩니다.
해당 코드는 torohvision 라이브러리의 모델 기능을 사용하여 사전학습된 (Pretrained) ResNet-18 모델을 로드하는 예제입니다:
import torchvision.models as models
resnet18 = models.resnet18(pretrained=True)
※ 코드 설명
1) 라이브러리 임포트:
import torchvision.models as models
이 코드는 torohvision_models 모듈을 models라는 이름으로 임포트합니다. 이 모듈에는 다양한 사전 학습된 모델들이 포함되어 있습니다.
2) ResNet-18 모델 로드:
resnet18 = models.resnet18(pretrained=True)
modela.reanet18 torchvision에서 제공하는 ResNet-18 모델을 로드하는 함수입니다.
pretrained=True: 사전 학습된 가중치를 사용하여 모델을 로드합니다. 이를 통해 사용자는 사전학습된 모델을 기반으로 추가 학습(Fine-Tuning)을 하거나, 즉시 예측 작업에 사용할 수 있습니다.
2.4 Utils(유틸리티)
torohvision.utils 모듈은 이미지 데이터를 다루는 다양한 유틸리티 함수들을 제공 합니다. 주요 함수는 다음과 같습니다:
make_arid 여러 이미지를 격자 형태로 결합하여 시각화할 수 있도록 하나의 이미지로 만듭니다. 주로 데이터셋에서 샘플 이미지를 시각화할 때 사용됩니다.
save_image:이미지를 파일로 저장하는 함수입니다. 텐서 형태의 이미지를 쉽게 저장할 수 있습니다.
해당 코드는 torohvision.utils 모듈의 make_ar id 기능을 사용하여 FashionMNIST 데이터셋의 이미지를 격자 형태로 결합하고, 이를 시각화하는 예제입니다.
import torchvision.utils as utils
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import numpy as np
# 이미지를 격자 형태로 결합하여 시각화
def show(img):
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)), cmap='gray')
plt.show()
# Fashion MNIST 데이터셋 로드 및 변환 정의
transform = transforms.Compose([
transforms.ToTensor()
])
dataset = datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform)
dataloader = DataLoader(dataset, batch_size=4, shuffle=True)
# 첫 번째 배치의 이미지를 격자로 결합하여 시각화
dataiter = iter(dataloader)
images, labels = next(dataiter)
img_grid = utils.make_grid(images)
show(img_grid)
※ 코드 설명
1) 라이브러리 임포트:
import torchvision.utils as utils
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import numpy as np
torovision.utils : torohvision의 유틸리티 기능을 제공하는 모듈로, 특히 이미지 관련 유틸리티 함수들을 포함하고 있습니다.
DataLoader : 파이토치의 데이터 로더 클래스로, 데이터셋을 미니 배치로 나누고, 셔플링 및 멀티프로세싱 기능을 제공합니다.
matplotlib pyplot 및 numpy : 이미지 시각화와 배열 조작을 위해 사용됩니다.
2) 이미지를 시각화하는 함수 정의:
def show(img):
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)), cmap='gray')
plt.show()
show(img): 이미지를 넘파이 배열로 변환하고, matplotlib를 사용하여 시각화하는 함수입니다. np.transpose를 사용하여 텐서의 차원 순서를 (채널, 높이, 너비)에서 (높이, 너비, 채널)로 변경합니다.
3) Fashion MNIST 데이터셋 로드 및 변환 정의:
transform transforms.Compose([
transforms. ToTensor() ])
dátaset = datasets.FashionMNIST(root='./data', train=True, download=True,
dataloader = DataLoader(dataset, batch_size=4, shuffle=True)
transform = transforma.Compose([transforma_ToTensor()]) : 이미지를 파이토치 텐서로 변환하는 변환 파이프라인을 정의합니다.
datasets.FashionMINIST : FashionNIST 데이터셋을 다운로드하고 로드합니다.
DataLoader : 데이터셋을 미니 배치로 나누고, 데이터를 셔플링하여 로드합니다.
4) 첫 번째 배치의 이미지를 격자로 결합하여 시각화:
dataiter = iter(dataloader)
images, labels = next(dataiter)
img_grid = utils.make_grid(images) show(img_grid)
dataiter = iter(dataloader): 데이터 로더에서 배치를 가져올 수 있는 이터레이터를 생성합니다.