ImageNet 데이터 세트 다운로드, 사전 처리, 업로드

이 항목에서는 Cloud TPU에서 사용할 ImageNet 데이터 세트를 다운로드, 사전 처리, 업로드하는 방법을 설명합니다. ImageNet 데이터 세트를 사용하는 머신러닝 모델은 다음과 같습니다.

  • ResNet
  • AmoebaNet
  • EfficientNet
  • MNASNet
ImageNet은 이미지 데이터베이스입니다. 이 데이터베이스의 이미지는 계층 구조로 구성되며, 계층 구조의 각 노드는 수백 또는 수천 개의 이미지로 표현됩니다.

ImageNet 데이터베이스의 크기는 모델을 학습시키는 데 상당한 시간이 걸릴 수 있음을 의미합니다. 대안은 fake_imagenet이라는 데이터세트의 데모 버전을 사용하는 것입니다. 이 데모 버전을 사용하면 일반적으로 전체 ImageNet 데이터베이스 사용과 관련된 스토리지 및 시간 요구사항을 줄여서 모델을 테스트할 수 있습니다.

전체 ImageNet 데이터 세트 사전 처리

ImageNet 데이터 세트는 학습 데이터, 검증 데이터, 이미지 라벨의 세 부분으로 구성됩니다.

학습 데이터에는 쉽게 다운로드할 수 있도록 패키징된 1,000개의 카테고리와 120만 개의 이미지가 포함됩니다. 검증 및 테스트 데이터는 ImageNet 학습 데이터에 포함되지 않습니다(중복은 제거했음).

검증 및 테스트 데이터는 Flicker 및 기타 검색엔진에서 수집한 150,000개의 사진으로 구성되며, 1,000개 카테고리의 존재 또는 부재로 라벨이 지정되어 있습니다. 1,000개의 객체 카테고리에는 ImageNet의 내부 노드와 리프 노드가 모두 포함되지만 서로 겹치지 않습니다. 라벨이 있는 이미지 중 50,000개의 임의 하위 집합이 1,000개의 카테고리 목록과 함께 검증 데이터로 공개되었습니다. 나머지 이미지는 평가에 사용되며 라벨 없이 공개되었습니다.

전체 ImageNet 데이터 세트 사전 처리 단계

머신러닝 모델에서 사용할 전체 ImageNet 데이터 세트를 준비하는 5가지 단계가 있습니다.

  1. 다운로드 대상에 공간이 있는지 확인합니다.
  2. 대상 디렉터리를 설정합니다.
  3. ImageNet 사이트에 등록하고 다운로드 권한을 요청합니다.
  4. 데이터 세트를 로컬 디스크 또는 Compute Engine VM에 다운로드합니다.

  5. 사전 처리 및 업로드 스크립트를 실행합니다.

공간 요구사항 확인

데이터 세트를 로컬 머신으로 다운로드하든 Compute Engine VM으로 다운로드하든 다운로드 대상에 약 300GB의 여유 공간이 필요합니다. VM에서 df -ha 명령어를 사용하여 사용 가능한 저장 공간을 확인할 수 있습니다.

다음 방법 중 하나를 사용하여 VM 디스크의 크기를 늘릴 수 있습니다.

  • ctpu up 명령줄에서 할당할 크기(GB 단위)와 함께 --disk-size-gb 플래그를 지정합니다.
  • Compute Engine 가이드를 따라 VM에 디스크를 추가합니다.
    • 인스턴스 삭제 시디스크 삭제로 설정하여 VM 삭제 시 디스크가 삭제되도록 합니다.
    • 새로운 디스크 경로를 기록합니다. 예를 들면 /mnt/disks/mnt-dir입니다.

대상 디렉터리 설정

로컬 머신 또는 Compute Engine VM에 다운로드된 데이터를 저장하도록 디렉터리 구조를 설정합니다.

  • ImageNet 데이터 세트의 홈 디렉터리를 만들고 내보냅니다.

    로컬 머신 또는 VM의 홈 디렉터리 아래에 imagenet과 같은 디렉터리를 만듭니다. 이 디렉터리에서 두 하위 디렉터리(trainvalidation)를 만듭니다. 홈 디렉터리를 IMAGENET_HOME으로 내보냅니다.

    export IMAGENET_HOME=~/imagenet
    

등록 및 데이터 세트 다운로드 권한 요청

  • Imagenet 웹사이트에 등록합니다. ImageNet에서 등록을 확인하고 확인 이메일을 보내기 전에는 데이터 세트를 다운로드할 수 없습니다. 며칠 이내에 확인 이메일을 받지 못하면 ImageNet 지원에 문의하여 등록이 확인되지 않은 이유를 확인하세요. 등록이 확인되면 다운로드 사이트로 이동합니다.

ImageNet 데이터 세트 다운로드

  1. 다운로드 사이트에서 페이지의 이미지 섹션으로 이동하고 '학습 이미지(작업 1 및 2)'를 마우스 오른쪽 버튼으로 클릭합니다. 그러면 학습 세트에서 가장 큰 부분을 다운로드하는 데 필요한 URL이 제공됩니다. URL을 저장합니다.

    '학습 이미지(작업 3)'를 마우스 오른쪽 버튼으로 클릭하여 두 번째 학습 세트의 URL을 가져옵니다. URL을 저장합니다.

    '검증 이미지(모든 작업)'를 마우스 오른쪽 버튼으로 클릭하여 검증 데이터 세트의 URL을 확인합니다. URL을 저장합니다.

    ImageNet 파일을 로컬 머신에 다운로드하는 경우 다운로드가 완료되면 로컬 머신의 디렉터리를 Compute Engine VM의 해당 $IMAGENET_HOME 디렉터리에 복사해야 합니다. ImageNet 데이터 세트를 로컬 호스트에서 VM으로 복사하는 데는 약 13시간이 걸립니다.

    예를 들어 다음 명령어는 로컬 머신의 $IMAGENET_HOME 아래에 있는 모든 파일을 셸 프롬프트에 username@vm-name이라고 표시된 VM에 복사합니다.

    gcloud compute scp --recurse $IMAGENET_HOME username@vm-name:~/imagenet
    
  2. $IMAGENET_HOME에서 wget을 사용하여 저장된 URL로 학습 및 검증 파일을 다운로드합니다.

    '학습 이미지(작업 1 및 2)' 파일은 큰 학습 세트입니다. 용량은 138GB이며, Cloud Shell을 사용하여 Compute Engine VM으로 다운로드하는 경우 예상 다운로드 시간은 약 40시간입니다. 이 대용량 파일의 경우에는 명령어 앞에 nohup를 추가하거나 screen을 사용하여 Cloud Shell의 연결이 끊겨도 다운로드가 종료되지 않도록 할 수 있습니다.

    cd $IMAGENET_HOME \
    nohup wget http://image-net.org/challenges/LSVRC/2012/dd31405981ef5f776aa17412e1f0c112/ILSVRC2012_img_train.tar
    

    그러면 ILSVRC2012_img_train.tar라는 대용량 파일이 다운로드됩니다.

    VM의 $IMAGENET_HOME에서 다음 명령어를 사용하여 개별 학습 디렉터리를 $IMAGENET_HOME/train 디렉터리로 추출합니다. 추출에는 1~3시간이 걸립니다.

    tar xf ILSVRC2012_img_train.tar
    

    '학습 이미지(작업 3)' 파일은 728MB이며 다운로드하는 데 몇 분밖에 걸리지 않으므로 Cloud Shell 연결이 끊기지 않도록 예방 조치를 취할 필요가 없습니다.

    이 파일을 다운로드하면 개별 학습 디렉터리가 기존 $IMAGENET_HOME/train 디렉터리로 추출됩니다.

    wget http://www.image-net.org/challenges/LSVRC/2012/dd31405981ef5f776aa17412e1f0c112/ILSVRC2012_img_train_t3.tar
    

    '검증 이미지(모든 작업)' 파일은 6GB이므로 Cloud Shell의 연결이 끊겨도 다운로드가 종료되지 않도록 nohup 또는 screen을 사용해 보는 것도 좋겠습니다.

    wget http://www.image-net.org/challenges/LSVRC/2012/dd31405981ef5f776aa17412e1f0c112/ILSVRC2012_img_val.tar
    

    이 다운로드에 약 30분 걸립니다. 이 파일을 다운로드하면 개별 검증 디렉터리를 $IMAGENET_HOME/validation 디렉터리로 추출합니다.

    로컬 머신에 검증 파일을 다운로드한 경우 로컬 머신의 $IMAGENET_HOME/validation 디렉터리를 Compute Engine VM의 $IMAGENET_HOME/validation 디렉터리에 복사해야 합니다. 이 복사 작업은 약 30분 걸립니다.

    라벨 파일을 다운로드합니다. 이 작업은 몇 초 정도 걸립니다.

    wget -O $IMAGENET_HOME/synset_labels.txt \
    https://raw.githubusercontent.com/tensorflow/models/master/research/inception/inception/data/imagenet_2012_validation_synset_labels.txt
    

    로컬 머신에 라벨 파일을 다운로드한 경우 로컬 머신의 $IMAGENET_HOME 디렉터리를 Compute Engine VM의 $IMAGENET_HOME 디렉터리에 복사해야 합니다. 이 복사 작업은 몇 초 정도 걸립니다.

    학습 하위 디렉터리 이름(예: n03062245)은 'WordNet ID'(wnid)입니다. ImageNet API는 WordNet ID와 synset_labels.txt 파일의 관련된 검증 라벨 간의 매핑을 보여줍니다. 여기서 synset은 시각적으로 유사한 이미지 그룹입니다.

Imagenet 데이터 세트를 처리하고, 원하는 경우 Cloud Storage에 업로드

  1. GitHub에서 imagenet_to_gcs.py 스크립트를 다운로드합니다.

    wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/imagenet_to_gcs.py
    
  2. 데이터 세트를 Cloud Storage에 업로드하는 경우 ImageNet 데이터 세트를 업로드할 스토리지 버킷 위치를 지정합니다.

    export STORAGE_BUCKET=gs://bucket-name
    
  3. 데이터 세트를 Cloud Storage에 업로드하는 경우 데이터 세트를 저장할 스토리지 버킷 데이터 디렉터리를 지정합니다.

    (vm)$ export DATA_DIR=$STORAGE_BUCKET/dataset-directory
    
  4. 스크립트를 실행하여 원시 데이터 세트를 TFRecord로 사전 처리하고 다음 명령어를 사용하여 Cloud Storage에 업로드합니다.

     python3 imagenet_to_gcs.py \
      --project=$PROJECT \
      --gcs_output_path=$DATA_DIR  \
      --raw_data_dir=$IMAGENET_HOME \
      --local_scratch_dir=$IMAGENET_HOME/tf_records
    

다음과 같은 형식으로 일련의 디렉터리(학습 및 검증용)가 생성됩니다

${DATA_DIR}/train-00000-of-01024
${DATA_DIR}/train-00001-of-01024
 ...
${DATA_DIR}/train-01023-of-01024

${DATA_DIR}/validation-00000-of-00128
S{DATA_DIR}/validation-00001-of-00128
 ...
${DATA_DIR}/validation-00127-of-00128

데이터가 Cloud 버킷에 업로드되었으면 모델을 실행하고 --data_dir=${DATA_DIR}을 설정합니다.