본문 바로가기

ImageNet 다운로드에서 사용하기까지 [Kaggle 이용]

반응형

 ImageNet을 다운하고, PyTorch에서 사용하는 방법까지를 기술한 내용입니다. 명료하게 나와있는 블로그가 없어 직접 글을 쓰게 되었습니다. 사용한 OS는 Linux 기반인 Ubuntu입니다.

Kaggle을 사용하여 ImageNet을 다운 받고, PyTorch에서 이를 사용하는 방법을 기술합니다.

아래의 과정을 전부 따라해야 정상적으로 ImageNet dataset을 사용할 수 있습니다.

참고: https://towardsdatascience.com/downloading-and-using-the-imagenet-dataset-with-pytorch-f0908437c4be

 

Downloading and Using the ImageNet Dataset with PyTorch

Train your image classification models with the most popular research dataset

towardsdatascience.com

 

 

 

 

 

Kaggle 가입과 rule 동의 및 kaggle.json 다운로드

1. Kaggle에 가입한다. https://www.kaggle.com/

 

Kaggle: Your Machine Learning and Data Science Community

Kaggle is the world’s largest data science community with powerful tools and resources to help you achieve your data science goals.

www.kaggle.com

2. 자신의 프로필을 누른 후, Account 항목으로 들어간다.
3. 중간쯤에 옅은 색으로 되어 있는 "Create New API Token"을 누른다.
4. kaggle.json을 다운받는다. (kaggle.json에는 개인의 Token의 담겨 있다.)
5. 여기에 접속해서 rule에 동의한다.

 

 

반응형

 

 

 

Ubuntu에 Kaggle package 설치 및 ImageNet 다운로드

1. Ubuntu에서 Kaggle을 다운 받는다.

pip install kaggle

2. kaggle.json 파일을 ~/.kaggle/ 에 위치시킨다. (또는 /home/userhome/.kaggle)
3. ImageNet을 다운받는다.

kaggle competitions download -c imagenet-object-localization-challenge

4. 다음의 명령어로 압출 풀린 imagenet이 저장된 디렉토리를 만든다.

mkdir -p ~/.data/imagenet

5. 다운받은 ImageNet 파일을 푼다.

unzip imagenet-object-localization-challenge.zip -d ~/.data/imagenet

6. ~/.data/imagenet 폴더로 이동한다.

cd ~/.data/imagenet

7. meta 데이터 파일을 다운받는다.

wget https://raw.githubusercontent.com/raghakot/keras-vis/master/resources/imagenet_class_index.json
wget https://gist.githubusercontent.com/paulgavrikov/3af1efe6f3dff63f47d48b91bb1bca6b/raw/00bad6903b5e4f84c7796b982b72e2e617e5fde1/ILSVRC2012_val_labels.json

 

 

 

 

 

 

ImageNet을 사용하기 위한 PyTorch 코드

ImageNet class 생성 (필요에 따라 pip install image 실행)

import os
from torch.utils.data import Dataset
from PIL import Image
import json
class ImageNetKaggle(Dataset):
    def __init__(self, root, split, transform=None):
        self.samples = []
        self.targets = []
        self.transform = transform
        self.syn_to_class = {}
        with open(os.path.join(root, "imagenet_class_index.json"), "rb") as f:
                    json_file = json.load(f)
                    for class_id, v in json_file.items():
                        self.syn_to_class[v[0]] = int(class_id)
        with open(os.path.join(root, "ILSVRC2012_val_labels.json"), "rb") as f:
                    self.val_to_syn = json.load(f)
        samples_dir = os.path.join(root, "ILSVRC/Data/CLS-LOC", split)
        for entry in os.listdir(samples_dir):
            if split == "train":
                syn_id = entry
                target = self.syn_to_class[syn_id]
                syn_folder = os.path.join(samples_dir, syn_id)
                for sample in os.listdir(syn_folder):
                    sample_path = os.path.join(syn_folder, sample)
                    self.samples.append(sample_path)
                    self.targets.append(target)
            elif split == "val":
                syn_id = self.val_to_syn[entry]
                target = self.syn_to_class[syn_id]
                sample_path = os.path.join(samples_dir, entry)
                self.samples.append(sample_path)
                self.targets.append(target)
    def __len__(self):
            return len(self.samples)
    def __getitem__(self, idx):
            x = Image.open(self.samples[idx]).convert("RGB")
            if self.transform:
                x = self.transform(x)
            return x, self.targets[idx]

 

사용하기 예시

train_data = ImageNet(
    root=f'~/.data/imagenet',
    split='train',
    transform=train_transform
)


test_data = ImageNet(
    root=f'~/.data/imagenet',
    split='val',
    transform=train_transform
)
반응형