안경잡이개발자

728x90
반응형

  이미지넷(ImageNet) 데이터셋은 MNIST, CIFAR 데이터셋과 더불어 굉장히 유명한 데이터셋이다. 일반적으로 MNIST나 CIFAR는 아이디어에 대한 검증 목적으로 사용한다. 최신 컴퓨팅 장치를 기준으로 보았을 때 데이터셋 자체가 아주 작기 때문에, 어지간한 크기의 뉴럴 네트워크를 이용해도 학습 과정에서 길어야 하루 이내의 시간이 소요되기 때문이다.

 

  ▶ MNIST: 0부터 9까지의 28 x 28 손글씨 사진을 모은 데이터셋 (학습용: 60,000개 / 테스트용: 10,000)

  ▶ CIFAR-10: 10개의 클래스로 구분된 32 x 32 사물 사진을 모은 데이터셋 (학습용: 50,000개 / 테스트용: 10,000개)

 

  다양한 논문에서는 새로운 아이디어에 대한 검증을 위한 목적으로 간단히 MNIST나 CIFAR-10을 이용하곤 한다. 이때 ImageNet을 학습시키기 버거운 경우 CIFAR-100 정도까지의 데이터셋을 이용할 수도 있다. 실제로 대학원 수업 때 과제 목적으로 가장 많이 사용하는 것도 MNIST나 CIFAR-10이다.

 

  반면에 이미지넷(ImageNet)대표적인 대규모(large-scale) 데이터셋이다. 전체 데이터셋에 포함된 이미지만 해도 1,000만 개가 넘는다. 유명한 Amazon Mechanical Turk 서비스를 이용하여 일일이 사람이 분류한 데이터셋이다. 이 데이터셋은 ILSVRC (ImageNet Large Scale Visual Recognition Challenge)로 잘 알려진 국제 대회에서 사용되는 데이터셋으로도 유명하다. 논문에서 가장 자주 등장하는 데이터셋은 ILSVRC 2012 데이터셋이다. 최신 논문도 대개 ILSVRC 2012를 이용해 학습/평가를 진행한다.

 

  사실 일반적으로 딥러닝에 사용되는 데이터셋은 평가(training) / 검증(validation) / 테스트(test) 데이터셋으로 나누어지는데, ILSVRC 2012는 실제 대회에서 사용되었던 데이터셋이며 테스트 데이터셋은 공개하지 않고 있다. 그래서 대개 논문을 쓰기 위한 목적으로는 평가(training) 데이터셋과 검증(validation) 데이터셋을 사용한다.

 

  이 데이터셋은 1,000개의 클래스로 구성되며 총 백만 개가 넘는 데이터를 포함한다. 약 120만 개는 학습(training)에 쓰고, 5만개는 검증(validation)에 쓴다. 학습 데이터셋 용량은 약 138GB, 검증 데이터셋 용량은 약 6GB이다. 특히 분류(classification) 문제에 관심이 있는 딥러닝 연구자라면 대개 이미지넷 데이터셋을 다운로드하는 편이다. 학습 데이터를 확인해 보면 각 클래스당 약 1,000개가량의 사진으로 구성되어 있다.

 

  전체 레이블(label) 이름을 확인하고 싶다면 다음과 같이 이미지넷(ImageNet) 클래스 정보가 기록되어 있는 JSON 파일을 확인하면 된다. 이 경로에서 전체 레이블 정보를 확인할 수 있다. 실제로 파이썬 프로그램상으로도 이 경로에서 JSON 파일을 받아와 사용하는 식으로 사용하곤 한다.

 

 

  ILSVRC 2012를 다운로드하는 방법은 다양하다. 대표적으로 토렌트(torrent)를 이용해서 받을 수 있다. 다음과 같이 학습 데이터셋과 검증(validation) 데이터셋을 다운로드할 수 있고, 이를 이용해 실험을 진행할 수 있다.

 

 

  예를 들어 Validation Set을 다운로드한다면, 다음과 같이 해당 링크로 접속한 뒤에 [Download] 버튼을 눌러서 토렌트(Torrent) 파일을 다운로드 하면 된다. 컴퓨터에 유토렌트(uTorrent)와 같은 프로그램이 설치되어 있다면, 곧바로 다운로드를 진행할 수 있다.

 

 

  실제로 필자는 adversarial attack 관련 연구를 진행하고 있어서 검증(validation) 데이터셋만 있으면 되는 상황이다. 이럴 때는 ILSVRC 2012 Validation Set을 다운로드받으면 된다. 실제로 토렌트를 이용해 받으면 대략 1MB/s ~ 8MB/s 사이의 속도로 다운로드가 진행된다. 데이터셋의 용량이 크기 때문에 넉넉히 기다리는 것이 좋다.

 

 

  필자는 윈도우 환경에서 다운로드를 진행했다. 검증(validation) 데이터셋을 다운로드한 뒤에는 압축 파일을 확인해 보자. 총 50,000개의 데이터가 존재하는 것을 확인할 수 있다. 확인해 보면 단순히 이미지 파일만 존재하는 것을 알 수 있다. 따라서 약간의 전처리가 필요하다.

 

 

  압축을 풀어보자. 그러면 다음과 같은 전체 검증용 사진을 확인할 수 있다.

 

 

  이미 다른 사람이 검증(validation)용 데이터를 정리하는 방법을 제안하고 있다. 이 경로에서 쉘 스크립트를 다운로드하자. 쉘 스크립트(.sh)를 실행하면 모든 이미지를 폴더별로 정리한다. 가장 먼저 압축 해제한 폴더에 스크립트 파일이 저장될 수 있도록 하자. 필자의 경우 script.sh 라는 이름으로 스크립트 파일을 만들었다. 참고로 윈도우(Windows) OS에서 쉘 스크립트를 실행하려면 bash 모드로 들어간 뒤에 리눅스 명령을 입력하면 된다. 다음과 같이 스크립트를 실행하자. 스크립트를 실행하면 모든 이미지가 처리될 때까지 최대 2시간까지의 시간이 소요될 수 있다.

 

 

  쉘 스크립트가 완전히 실행된 뒤에는 다음과 같이 50,000개의 검증용 데이터셋이 총 1,000개의 클래스(폴더)에 분리되어 저장된다. 폴더 번호가 낮은 것부터 차례대로 인덱스가 부여되는 것이다. 다만 폴더의 이름이 약간 어색하게 느껴질 수 있다. 폴더명에 따른 실제 클래스 이름은 다음의 경로에 기록되어 있다. 실제로 이 JSON 파일을 이용하여 구분할 수 있다. 예를 들어 19번째 폴더인 n01582220 폴더는 까치(magpie)를 의미한다.

 

 

  더불어 혹시나 n으로 시작하지 않는 폴더가 존재한다면 해당 폴더는 제거할 수 있도록 하자. 파이썬 상에서 실제로 학습 및 평가를 진행할 때에도 이러한 폴더 구조를 그대로 따르기 때문에, 규칙에 맞지 않는 폴더가 존재한다면 오류가 발생할 수 있다. 필자의 경우 script.sh 파일이 남아 있어서 이를 삭제했다.

 

 

  또한 참고로 필자의 경우 각 클래스(class)마다 5개의 validation 이미지가 필요했다. 따라서 다음과 같은 코드를 추가적으로 실행했다. 이러한 코드를 실행하면 각 클래스마다 이미지를 5개만 남기고, 폴더명을 차례대로 0부터 999까지 할당해준다.

 

import os
import json


def get_list(path):
    return os.listdir(path)


def rename_directory(root_path, directory, targets):
    source = os.path.join(root_path, directory)
    target = os.path.join(root_path, targets[directory])
    os.rename(source, target)


def remove_files(root_path, directory, n_remained):
    files = get_list(os.path.join(root_path, directory))
    files = files[n_remained:]
    for file_name in files:
        os.remove(os.path.join(root_path, directory, file_name))


# Run the program
root_path = './ILSVRC2012_img_val'
with open('./imagenet_class_index.json') as f:
    json_data = json.load(f)
targets = {}
for key in json_data.keys():
    targets[json_data[key][0]] = key

directories = get_list(root_path)
for directory in directories:
    remove_files(root_path, directory, 5)
for directory in directories:
    rename_directory(root_path, directory, targets)

 

  필자는 결과적으로 다음과 같은 데이터를 얻을 수 있었다.

 

728x90
반응형