오늘은 ImageFolder를 이용한 이미지 데이터 로딩 방법에 대해 알아보겠습니다. 기본적인 사용 예는 다음과 같습니다:
from torchvision.datasets import ImageFolder
from torchvision import transforms
data_transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
])
dataset = ImageFolder(root='./data', transform=data_transform)
설명
- 데이터 구조: 각 클래스별로 하위 디렉토리를 두고, 그 안에 해당 클래스의 모든 이미지 파일을 저장합니다. 예를 들어, '강아지'와 '고양이'라는 클래스가 있다면, 루트 디렉토리 아래에 각각의 폴더를 만들어 이미지를 저장합니다.
- 상속 관계: 이 클래스는
torchvision.datasets.DatasetFolder에서 상속받아 필요한 메소드를 오버라이드하여 사용자 정의 데이터셋을 만들 수 있습니다.
인수들
- root (문자열): 데이터셋의 최상위 디렉토리 경로입니다.
- transform (호출 가능, 선택 사항): PIL 이미지를 입력으로 받아 변환된 버전을 반환하는 함수 또는 변환기입니다. 예를 들어, 무작위로 이미지를 자르는
transforms.RandomCrop등을 사용할 수 있습니다. - target_transform (호출 가능, 선택 사항): 타겟(일반적으로 클래스 레이블)을 입력으로 받아 변환하는 함수 또는 변환기입니다.
- loader (호출 가능, 선택 사항): 이미지 파일의 경로를 주면 이를 불러오는 함수입니다.
- is_valid_file (호출 가능, 선택 사항): 이미지 파일의 유효성을 확인하는 함수입니다.
속성
- classes (리스트): 알파벳 순서대로 정렬된 클래스 이름 리스트입니다.
- class_to_idx (딕셔너리): 클래스 이름을 키로, 해당 클래스의 인덱스를 값으로 가지는 딕셔너리입니다.
- imgs (리스트): 이미지 경로와 클래스 인덱스를 튜플로 저장한 리스트입니다.
예제
다음과 같은 디렉토리 구조를 가정해 보겠습니다:
root/
강아지/
img1.png
img2.png
고양이/
img3.png
img4.png
위 구조를 사용하여 데이터를 로드하려면, root를 위 디렉토리의 경로로 설정하면 됩니다. 그러면 각 클래스 하위 디렉토리의 이미지 파일들이 읽혀지고, 각 이미지에 대해 해당 클래스의 레이블이 할당됩니다. 또한, transform 및 target_transform 파라미터를 통해 이미지와 레이블을 전처리할 수 있습니다.
transform과 target_transform의 차이점
이 두 파라미터는 머신러닝과 딥러닝에서 데이터 전처리 및 증강에 주로 사용됩니다.
- transform (호출 가능, 선택 사항):
- 역할: 입력 데이터(주로 이미지)를 처리하기 위한 파라미터입니다. PIL 이미지를 입력받아 변환된 버전을 반환합니다.
- 예시:
transforms.RandomCrop을 사용하여 이미지를 무작위로 잘라내거나,transforms.Resize를 사용하여 크기를 조절할 수 있습니다.
- target_transform (호출 가능, 선택 사항):
- 역할: 목표 데이터(주로 클래스 레이블)를 처리하기 위한 파라미터입니다. 클래스 레이블을 입력받아 변환합니다.
- 예시:
torch.tensor를 사용하여 클래스 레이블을 PyTorch 텐서로 변환하거나 다른 필요에 따라 데이터를 처리할 수 있습니다.
두 파라미터의 주요 차이점은 transform은 입력 데이터를 다루고, target_transform은 목표 데이터를 다룬다는 점입니다.