목차
반응형
1. Torchvision(토치비전)은 언제 사용?
- 컴퓨터 비전 프로젝트에서 사용함.
2. Torchvision(토치비전)의 주요 기능 요약
- 데이터셋 접근 및 사용: torchvision은 MNIST, CIFAR-10, ImageNet 등 다양한 사전 정의된 데이터셋을 제공합니다. 이를 통해 쉽게 데이터를 로드하고 실험할 수 있습니다.
- 데이터 변환(Transformation): 이미지 데이터를 전처리하거나 증강하기 위한 다양한 변환 기능을 제공합니다. 예를 들어, 이미지의 크기를 조정하거나, 회전, 뒤집기 등의 작업을 쉽게 수행할 수 있습니다.
- 모델: 사전 훈련된 다양한 모델을 제공하여, 이미지 분류, 객체 탐지, 세그멘테이션 등 다양한 비전 태스크에 활용할 수 있습니다. ResNet, VGG, AlexNet 등의 유명한 모델을 쉽게 불러와 사용할 수 있습니다.
3. 사전 제공 데이터셋
3.1. 사전 제공 데이터셋 리스트
torchvision 라이브러리에서 제공하는 몇 가지 사전 정의된 데이터셋은 다음과 같습니다:
MNIST | 손으로 쓴 숫자 데이터셋. 기계 학습 분야에서 널리 사용됩니다. |
CIFAR-10 | 10개 카테고리의 60000개 32x32 컬러 이미지를 포함합니다. |
CIFAR-100 | CIFAR-10과 유사하지만, 100개 카테고리를 포함합니다. |
ImageNet | 다양한 카테고리의 백만 단위의 레이블이 있는 이미지 데이터셋입니다. |
COCO | 이미지 인식, 분할 및 객체 탐지를 위한 데이터셋입니다. |
VOC | 이미지 분류, 객체 탐지 등을 위한 데이터셋입니다. |
3.2. 데이터셋 불러오는 예시코드
데이터셋을 불러올 때는 `transforms`를 이용해 데이터를 변환해 주는 내용을 정의해 주면 됨.
- `datasets` 에서 데이터셋을 불러옴
- `transforms`로 데이터를 변형
import torch
from torchvision import datasets, transforms
# 데이터셋을 불러오기 위한 변환 정의
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
# 훈련 데이터셋 불러오기
trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
# 테스트 데이터셋 불러오기
testset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
# 데이터 로더 생성
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)
print("MNIST 데이터셋이 성공적으로 불러와졌습니다.")
3.3. 커스텀 데이터셋 불러오는 예제 코드
커스텀하게 데이터셋을 만들 때 에는
- 커스텀 데이터셋 정의 (클래스)
- `transforms`를 이용해 데이터를 변환해 주는 내용을 정의해 주면 됨.
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms
import os
from PIL import Image
class CustomDataset(Dataset):
def __init__(self, image_paths, transform=None):
self.image_paths = image_paths
self.transform = transform
def __len__(self):
return len(self.image_paths)
def __getitem__(self, idx):
image_path = self.image_paths[idx]
image = Image.open(image_path)
if self.transform:
image = self.transform(image)
return image
# 예제 사용
image_paths = ['./data/img1.jpg', './data/img2.jpg'] # 실제 이미지 경로로 대체
transform = transforms.Compose([
transforms.Resize((128, 128)),
transforms.ToTensor(),
])
dataset = CustomDataset(image_paths=image_paths, transform=transform)
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)
4. 전처리
4.1. 주요 전처리 함수
torchvision.transforms 모듈에서 사용할 수 있는 주요 이미지 변형 함수들을 요약한 것입니다:
Resize | 이미지의 크기를 조정합니다. |
CenterCrop | 이미지의 중앙을 기준으로 정사각형으로 잘라냅니다. |
RandomCrop | 이미지에서 무작위로 선택한 위치를 기준으로 정사각형으로 잘라냅니다. |
RandomHorizontalFlip | 주어진 확률로 이미지를 수평으로 뒤집습니다. |
RandomVerticalFlip | 주어진 확률로 이미지를 수직으로 뒤집습니다. |
ToTensor | PIL 이미지나 NumPy ndarray를 PyTorch 텐서로 변환합니다. |
Normalize | 채널별로 평균과 표준편차를 사용하여 이미지를 정규화합니다. |
ColorJitter | 이미지의 밝기, 대비, 포화도, 색조를 무작위로 변경합니다. |
RandomRotation | 주어진 각도 범위 내에서 이미지를 무작위로 회전시킵니다. |
RandomResizedCrop | 원본 이미지에서 무작위 크기와 비율로 잘라내어 주어진 크기로 리사이징합니다. |
Grayscale | 이미지를 회색조로 변환합니다. |
Compose | 여러 변형(transforms)을 하나로 결합하여 순차적으로 적용합니다. |
코드 예시
- Compose를 이용해 여러 변형을 하나로 묶어줌
transform = transforms.Compose([
transforms.Resize((256, 256)),
transforms.CenterCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
4.2. 데이터 커스텀 변형
torchvision에서 제공하지 않는 특정 변형을 수행하려면 커스텀 변형 클래스를 작성할 수 있습니다. 이를 위해 Python의 __call__ 메서드를 사용하여 클래스를 정의합니다. 이 메서드는 객체를 함수처럼 호출할 수 있게 해줍니다.
from torchvision import transforms
from PIL import ImageOps, ImageEnhance
class AdjustBrightness:
def __init__(self, factor):
self.factor = factor
def __call__(self, img):
enhancer = ImageEnhance.Brightness(img)
img_enhanced = enhancer.enhance(self.factor)
return img_enhanced
# 사용 예시
transform = transforms.Compose([
AdjustBrightness(1.5),
transforms.ToTensor()
])
5. 사전 훈련된 모델 사용
5.1. 사전 훈련된 모델
PyTorch의 `torchvision.models` 모듈은 다양한 사전 훈련된 모델을 제공합니다. 이러한 모델들은 대규모 이미지 데이터셋(예: ImageNet)에서 훈련되었으며, 다양한 컴퓨터 비전 태스크에 즉시 사용할 수 있습니다. 사전 훈련된 모델을 사용하는 것은 다음과 같은 장점이 있습니다:
- 높은 정확도: 대규모 데이터셋에서 훈련된 모델들은 높은 성능을 제공합니다.
- 시간 절약: 처음부터 모델을 훈련시키는 대신, 사전 훈련된 모델을 사용하여 시간을 절약할 수 있습니다.
- 전이 학습: 사전 훈련된 모델을 출발점으로 사용하여 특정 태스크에 맞게 미세 조정(fine-tuning)함으로써 새로운 작업에 쉽게 적용할 수 있습니다.
사전학습 모델
alexnet | AlexNet은 깊은 합성곱 신경망(CNN) 구조 중 하나로, 이미지 분류 태스크에서 널리 사용됩니다. |
vgg | VGG 모델은 깊이에 따라 여러 버전(VGG11, VGG13, VGG16, VGG19)이 있으며, 이미지 분류에서 높은 정확도를 보여줍니다. |
resnet | ResNet은 깊은 네트워크에서 발생할 수 있는 소실된 기울기 문제를 해결하기 위해 잔차 연결(residual connections)을 도입한 모델입니다. |
inception | Inception 모델(또는 GoogLeNet)은 병렬로 배열된 여러 크기의 컨볼루션 레이어를 통해 이미지의 다양한 스케일을 효율적으로 학습할 수 있도록 설계되었습니다. |
densenet | DenseNet은 각 레이어가 이전 모든 레이어와 연결되는 밀집 연결(dense connections) 구조를 가지고 있어, 효율적인 그래디언트 흐름을 가능하게 합니다. |
mobilenet_v2 | MobileNetV2는 경량화된 네트워크로, 모바일이나 임베디드 장치에서 고성능을 유지하면서도 효율적으로 동작하기 위해 설계되었습니다. |
efficientnet | EfficientNet은 스케일링 방식을 통해 다양한 크기에서 효율적으로 작동하도록 최적화된 모델로, 높은 정확도와 효율성을 자랑합니다. |
mobilenet_v3 | MobileNetV3은 경량화와 효율성에 초점을 맞춘 모델로, 최신 컴퓨터 비전 태스크에 적합합니다. |
regnet | RegNet은 시스템적인 접근 방식을 통해 설계된 네트워크 구조로, 다양한 작업에 대해 효율적인 성능을 제공합니다. |
vit | Vision Transformer(ViT)는 이미지 처리를 위해 Transformer 구조를 사용하는 모델로, 최근 주목받고 있는 접근 방식입니다. |
사전학습 모델 사용 예시
import torchvision.models as models
# 사전 훈련된 ResNet-18 모델 불러오기
resnet18 = models.resnet18(pretrained=True)
# 모델을 평가 모드로 설정
resnet18.eval()
5.2. 파인 튜닝하는 방법
파인 튜닝은 사전 훈련된 모델을 기반으로 추가 학습을 수행하여 새로운 태스크에 적용하는 과정입니다. 주로 다음 단계를 포함합니다:
- 사전 훈련된 모델 불러오기: torchvision.models에서 제공하는 사전 훈련된 모델을 불러옵니다.
- 출력 레이어 변경: 대부분의 경우, 원본 모델의 출력 레이어를 새로운 태스크의 클래스 수에 맞게 변경해야 합니다.
- 모델 파라미터 고정: 필요에 따라 사전 훈련된 모델의 일부 또는 전체 파라미터를 고정(freeze)하여 추가 학습 중에 업데이트되지 않도록 할 수 있습니다.
- 추가 학습 수행: 새로운 데이터셋에 대해 모델을 학습시킵니다. 이때, 고정하지 않은 파라미터만 업데이트됩니다.
import torchvision.models as models
import torch.nn as nn
# 사전 훈련된 모델 불러오기
model = models.resnet18(pretrained=True)
# 모든 파라미터를 고정
for param in model.parameters():
param.requires_grad = False
# 마지막 Fully Connected 레이어 변경
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 10) # 예를 들어, 10개 클래스가 있는 경우
# 이제 model.fc는 학습될 수 있지만, 나머지 네트워크는 고정됩니다.
코드 설명
- num_ftrs = model.fc.in_features:
- model.fc는 ResNet 모델의 마지막 FC 레이어를 가리킵니다.
- in_features 속성은 이 레이어로 들어오는 입력 특성의 수, 즉 레이어의 입력 크기를 나타냅니다.
- 이 값을 num_ftrs 변수에 저장하여, 새로운 FC 레이어를 생성할 때 입력 크기로 사용합니다.
- model.fc = nn.Linear(num_ftrs, 10):
- nn.Linear는 PyTorch에서 제공하는 Fully Connected 레이어(또는 선형 레이어)를 생성하는 클래스입니다.
- num_ftrs는 앞서 저장한 레이어의 입력 크기로, 이전 레이어의 출력과 일치해야 합니다.
- 10은 새로운 FC 레이어의 출력 크기로 설정됩니다. 이는 모델이 최종적으로 분류해야 하는 클래스의 수를 의미합니다. 예를 들어, 10개의 다른 클래스를 분류하는 문제에서는 출력 크기를 10으로 설정합니다.
- 결과적으로, 이 코드는 모델의 마지막 레이어를 새로운 데이터셋에 맞게 조정하여, 사전 훈련된 네트워크의 나머지 부분은 그대로 유지하면서 새로운 태스크에 적합하게 파인 튜닝할 수 있도록 합니다.
모델 저장
# 모델의 state_dict 저장
torch.save(model.state_dict(), 'model_state_dict.pth')
모델 불러오기
model = ... # 모델 구조를 동일하게 재정의
# 모델의 state_dict 로드
model.load_state_dict(torch.load('model_state_dict.pth'))
# 모델을 평가 모드로 설정
model.eval()
6. 객체 탐지 및 세그멘테이션
torchvision에는 아래와 같은 모델도 사용할 수 있습니다.
- 객체 탐지를 위한 모델 사용하기 (예: Faster R-CNN, SSD)
- 세그멘테이션을 위한 모델 사용하기 (예: FCN, DeepLab)
- 커스텀 데이터셋에 적용
7. 고급 기능
- 비디오 및 3D 데이터셋 처리
객체 탐지 및 세그먼테이션, 비디오 및 3D 데이터셋 처리는 다음 페이지에 나눠서. 작성하도록 하겠습니다.
반응형
'Deep Learning > Pytorch' 카테고리의 다른 글
Pytorch(파이토치) 텐서보드(tensorboard) 사용하기(1) - 스칼라 (0) | 2024.02.11 |
---|---|
[Pytorch] CNN 모델 돌려보기 예제 (0) | 2022.12.27 |