AI/Dataset

[Dataset] Tiny ImageNet 다운로드, ImageNet download, 구성 차이

도도걸만단 2025. 1. 29. 00:31
반응형

ImageNet 데이터셋은 Train, Validation, Test 세 가지 파트로 나뉘며, 아래와 같이 구성됩니다:

 

ImageNet 데이터셋 구성

1. Train (학습 데이터셋):

샘플 수: 1,281,167개

약 1,000개의 클래스(카테고리)로 나뉘어 있습니다.

클래스당 약 1,281개의 이미지가 있습니다.

2. Validation (검증 데이터셋):

샘플 수: 50,000개

각 클래스당 50개의 이미지가 포함되어 있습니다.

3. Test (테스트 데이터셋):

샘플 수: 100,000개

라벨이 제공되지 않으며, 모델 평가를 위한 용도로 사용됩니다.

 

ImageNet download huggingface

250908 update

huggingface API token은 미리 copy paste 하기.

import os
from datasets import load_dataset
from huggingface_hub.hf_api import HfFolder

# (이미 토큰 저장된 상태라면 반복 불필요)
HfFolder.save_token("your_token")

# 데이터 로드 (이미 계속 있는 객체라면 생략 가능)
dataset = load_dataset("ILSVRC/imagenet-1k")

# 저장 폴더 구조 지정
output_base = "./imagenet_saved"
splits = ["train", "validation", "test"]

for split in splits:
    ds = dataset[split]
    out_dir = os.path.join(output_base, split)
    os.makedirs(out_dir, exist_ok=True)

    print(f"Saving '{split}' split to {out_dir}")

    # 이미지 저장 (각 이미지를 파일로)
    for idx, example in enumerate(ds):
        img = example["image"]  # PIL.Image 객체, 이미지컬럼 자동 디코딩
        label = example["label"]
        label_dir = os.path.join(out_dir, str(label))
        os.makedirs(label_dir, exist_ok=True)

        # RGBA 이미지를 RGB로 변환
        if img.mode in ("RGBA", "P"):
            img = img.convert("RGB")

        img_path = os.path.join(label_dir, f"{idx:08d}.jpg")
        img.save(img_path)

    print(f" -- Saved {len(ds)} images for split '{split}'")

#  또는, Dataset 형태 그대로 저장하려면:
for split in splits:
    ds = dataset[split]
    ds.save_to_disk(os.path.join(output_base, f"hf_{split}"))
    print(f"Dataset '{split}' saved via save_to_disk()")

 


데이터셋 세부 구조 확인 방법

 

Hugging Face Datasets를 사용할 경우

 

아래 코드를 통해 데이터셋의 각 파트 개수를 확인할 수 있습니다:

 

from datasets import load_dataset

# ImageNet 데이터셋 로드

dataset = load_dataset("ILSVRC/imagenet-1k", cache_dir="/mnt/data", trust_remote_code=True)

# 각 데이터셋 개수 출력

print(f"Train set size: {len(dataset['train'])}")

print(f"Validation set size: {len(dataset['validation'])}")

print(f"Test set size: {len(dataset['test'])}")

 

데이터셋 크기 확인 결과

Train set size: 1281167

Validation set size: 50000

Test set size: 100000

 

 

ImageNet 데이터셋은 매우 큰 크기를 가지고 있으므로, 전체 데이터를 다루기 어려운 경우 Tiny-ImageNet과 같은 작은 버전을 사용하기도 합니다.

Tiny-ImageNet 구성:

Train: 100,000개 (200 클래스, 클래스당 500개)

Validation: 10,000개 (200 클래스, 클래스당 50개)

Test: 10,000개


Tiny ImageNet을 다운로드하고 사용할 수 있도록 설정하는 방법은 아래와 같습니다:

 

1. Tiny ImageNet 데이터셋 다운로드

 

방법 1: wget 명령어 사용 (Linux)

 

터미널에서 아래 명령어를 실행합니다:

wget http://cs231n.stanford.edu/tiny-imagenet-200.zip

 

방법 2: 웹 브라우저로 다운로드 (Windows/Mac)

 

아래 링크를 복사하여 브라우저 주소창에 입력하면 다운로드됩니다:

 

http://cs231n.stanford.edu/tiny-imagenet-200.zip

 

2. 압축 해제

 

다운로드한 파일(tiny-imagenet-200.zip)의 압축을 풉니다:

unzip tiny-imagenet-200.zip

 

3. 데이터 구조 변경

 

TensorFlow의 ImageDataGenerator를 사용하려면 디렉토리 구조를 조정해야 합니다. 아래 Python 코드를 사용하세요:

import os
import shutil
import pandas as pd

def preprocess_tiny_imagenet():
    BASE = './tiny-imagenet-200'
    train_src = os.path.join(BASE, 'train')
    val_src = os.path.join(BASE, 'val')

   

    # Preprocess 디렉토리 생성

    train_dest = os.path.join(BASE, 'train_preprocess')
    val_dest = os.path.join(BASE, 'valid_preprocess')
    os.makedirs(train_dest, exist_ok=True)
    os.makedirs(val_dest, exist_ok=True)

    # Train 데이터 복사
    for class_dir in os.listdir(train_src):
        class_path = os.path.join(train_src, class_dir, 'images')
        target_path = os.path.join(train_dest, class_dir)
        os.makedirs(target_path, exist_ok=True)
        for image in os.listdir(class_path):
            shutil.copy(os.path.join(class_path, image), target_path)

    # Validation 데이터 복사
    val_annotations = pd.read_csv(
        os.path.join(val_src, 'val_annotations.txt'),
        sep='\t', header=None,
        names=['img', 'label', 'bbox1', 'bbox2', 'bbox3', 'bbox4']
    )

    for _, row in val_annotations.iterrows():
        label_dir = os.path.join(val_dest, row['label'])
        os.makedirs(label_dir, exist_ok=True)
        shutil.copy(os.path.join(val_src, 'images', row['img']), label_dir)


if __name__ == "__main__":
    preprocess_tiny_imagenet()

 

4. TensorFlow ImageDataGenerator로 데이터 로드

 

위의 코드를 실행한 뒤, 데이터셋을 불러오는 코드입니다:

 

from tensorflow.keras.preprocessing.image import ImageDataGenerator

# 경로 설정
train_dir = './tiny-imagenet-200/train_preprocess'
valid_dir = './tiny-imagenet-200/valid_preprocess'

# 데이터 증강 및 전처리
train_datagen = ImageDataGenerator(rescale=1/255)
valid_datagen = ImageDataGenerator(rescale=1/255)

# 데이터 로드
BATCH_SIZE = 32
IMG_SIZE = (64, 64)

train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=IMG_SIZE,
    batch_size=BATCH_SIZE,
    class_mode='categorical',
    shuffle=True
)

valid_generator = valid_datagen.flow_from_directory(
    valid_dir,
    target_size=IMG_SIZE,
    batch_size=BATCH_SIZE,
    class_mode='categorical',
    shuffle=False
)

 

 

다운로드 및 구조 변경을 마친 후, 학습 모델에서 데이터를 사용할 준비가 됩니다.

위 코드는 Linux, Mac, Windows 모두에서 사용할 수 있습니다.

반응형