ImageNet을 다운하고, PyTorch에서 사용하는 방법까지를 기술한 내용입니다. 명료하게 나와있는 블로그가 없어 직접 글을 쓰게 되었습니다. 사용한 OS는 Linux 기반인 Ubuntu입니다.
Kaggle을 사용하여 ImageNet을 다운 받고, PyTorch에서 이를 사용하는 방법을 기술합니다.
아래의 과정을 전부 따라해야 정상적으로 ImageNet dataset을 사용할 수 있습니다.
참고: https://towardsdatascience.com/downloading-and-using-the-imagenet-dataset-with-pytorch-f0908437c4be
Kaggle 가입과 rule 동의 및 kaggle.json 다운로드
1. Kaggle에 가입한다. https://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
)
'인공지능 대학원 자료 정리 > 참고 정리' 카테고리의 다른 글
[인공지능 기술] AI 학습 시 메모리 절약 Gradient checkpointing (0) | 2022.10.02 |
---|