질문 1: 보통 이미지당 label은 어떤 형식으로 저장돼?
- 이미지 데이터의 라벨은 다양한 방식으로 저장될 수 있으며, 사용하는 데이터셋과 상황에 따라 달라집니다. 일반적인 방법은 다음과 같습니다:
- CSV 파일 또는 JSON 파일:
- 이미지 파일 이름과 해당 이미지의 라벨을 매핑한 파일
- 예를 들어, CSV 파일에서 각 행은 이미지 파일 이름과 그에 해당하는 라벨을 포함할 수 있습니다.
- 폴더 구조:
- 이미지를 라벨별로 서로 다른 폴더에 저장
- 폴더 이름이 라벨을 나타내며, 이미지 파일은 해당하는 라벨의 폴더 안에 위치
- 파일 이름:
- 이미지 파일 이름 자체에 라벨 정보를 포함시키는 방법
- 예를 들어,
cat_001.jpg
는 'cat' 클래스의 이미지임을 나타냅니다. 이 방법은 파일 이름 파싱을 필요로 합니다.
- 이 예시에서는 이미지 파일 이름과 라벨을 CSV 파일 형식으로 저장하는 방법을 선택
- 파일 이름에 따라 라벨 0 또는 1을 할당하며, 라벨 1에 해당하는 파일명을 input으로 받아 처리합니다.
import csv
import os
def save_labels_to_csv(image_folder: str, label_1_filenames: list,
csv_path: str):
"""
이미지 폴더와 라벨 1에 해당하는 파일명 리스트를 받아, CSV 파일에 이미지와 라벨을 저장합니다.
"""
with open(csv_path, mode='w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['filename', 'label'])
for filename in os.listdir(image_folder):
label = 1 if filename in label_1_filenames else 0
writer.writerow([filename, label])
image_folder = 'path/to/your/images'
label_1_filenames = ['image1.jpg', 'image2.jpg']
csv_path = 'path/to/your/labels.csv'
save_labels_to_csv(image_folder, label_1_filenames, csv_path)
질문 3: 그렇게 저장된 labelled data를 불러와서, CustomDataset 만드는 코드 작성해줘.
- CSV 파일에서 라벨링된 데이터를 불러와
CustomDataset
클래스를 생성하는 방법을 설명
- 먼저, CSV 파일을 읽어 이미지 파일 경로와 라벨을 로드한 다음, 이 정보를 사용해
CustomDataset
인스턴스를 생성
import pandas as pd
from torch.utils.data import DataLoader, Dataset
from torchvision.transforms import Compose, Resize, ToTensor
from PIL import Image
class CustomDataset(Dataset):
def __init__(self, image_folder: str, csv_file: str, transform=None):
self.df = pd.read_csv(csv_file)
self.image_folder = image_folder
self.transform = transform
def __len__(self):
return len(self.df)
def __getitem__(self, idx):
img_name = os.path.join(self.image_folder, self.df.iloc[idx, 0])
image = Image.open(img_name).convert('RGB')
label = int(self.df.iloc[idx, 1])
if self.transform:
image = self.transform(image)
return image, label
image_folder = 'path/to/your/images'
csv_file = 'path/to/your/labels.csv'
transform = Compose([
Resize((224, 224)),
ToTensor()
])
dataset = CustomDataset(image_folder=image_folder,
csv_file=csv_file,
transform=transform)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4)
for images, labels in dataloader:
pass
- 이 코드는 먼저 CustomDataset 클래스를 정의하여 초기화 함수에서 이미지 폴더 경로, 라벨이 저장된 CSV 파일 경로, 그리고 전처리 변환을 인수로 받습니다.
- len 메서드는 데이터셋의 크기를 반환하고, getitem 메서드는 인덱스에 해당하는 이미지와 라벨을 로드한 후, 전처리 변환을 적용하여 반환합니다.
- DataLoader는 이 데이터셋을 배치 크기로 나누고, 필요에 따라 데이터를 섞어서 모델 학습에 사용할 준비를 합니다.
- 이 구조를 사용하면 데이터셋에 있는 이미지들을 효율적으로 로드하고 전처리하여 PyTorch 모델에 공급할 수 있습니다.