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

이 문서에서는 Cloud TPU VM 아키텍처에서 사용할 ImageNet 데이터 세트를 다운로드, 사전 처리, 업로드하는 방법을 설명합니다.

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

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

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

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

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

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

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

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

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

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

공간 요구사항 확인

데이터 세트를 로컬 머신으로 다운로드하든 VM 인스턴스로 다운로드하든, 다운로드 대상에 약 300GB의 여유 공간이 필요합니다.

TPU VM의 기본 디스크 할당은 100GB입니다. TPU VM으로 다운로드하려면 300GB가 필요하므로, TPU VM 인스턴스로 다운로드하는 경우 200GB의 추가 공간이 있는 영구 디스크를 추가해야 다운로드를 완료할 수 있습니다. TPU VM에서 df -ha 명령어를 사용하여 사용 가능한 저장 공간을 확인할 수 있습니다.

영구 디스크를 추가할 때는 다음을 확인하세요.

  • 인스턴스 삭제 시디스크 삭제로 설정하여 VM을 삭제할 때 디스크가 삭제되도록 합니다.
  • 새로운 디스크 경로를 기록합니다. 예를 들면 /mnt/disks/mnt-dir입니다.

대상 디렉터리 설정

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

  1. 다운로드 대상(로컬 머신 또는 TPU VM)의 홈 디렉터리 아래에 imagenet과 같은 디렉터리를 만듭니다.

    mkdir imagenet
    
  2. 이 디렉터리에서 두 하위 디렉터리(trainvalidation)를 만듭니다.

    mkdir imagenet/train
    mkdir imagenet/validation
    
  3. imagenet 디렉터리를 IMAGENET_HOME으로 내보냅니다.

    export IMAGENET_HOME=~/imagenet
    

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

Imagenet 웹사이트에 등록합니다. ImageNet에서 등록이 확인되고 확인 이메일이 전송될 때까지 데이터 세트를 다운로드할 수 없습니다. 며칠 내 확인 이메일을 받지 못한 경우 ImageNet 지원팀에 연락하여 등록이 확인되지 않은 이유를 확인합니다. 등록이 확인되면 데이터 세트를 다운로드할 수 있습니다. ImageNet 데이터 세트를 사용하는 Cloud TPU 튜토리얼은 ImageNet Large Scale Visual Recognition Challenge 2012(ILSVRC2012)의 이미지를 사용합니다.

ImageNet 데이터 세트 다운로드

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

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

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

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

    ImageNet 데이터 세트를 TPU VM에 복사하기 전에 TPU VM 인스턴스의 이름을 식별해야 합니다. 이렇게 하려면 SSH를 사용하여 TPU VM에 연결합니다. VM 인스턴스 이름은 @ 기호 다음에 오는 명령 프롬프트에 표시됩니다.

    다음 명령어를 사용하여 로컬 머신의 ~/imagenet 아래에 있는 파일을 VM의 $IMAGENET_HOME에 복사합니다.

    gcloud compute scp --recurse $IMAGENET_HOME username@vm-instance-name:~/imagenet
    
  2. $IMAGENET_HOME에서 저장된 URL을 사용하여 '학습 이미지(작업 1 및 2)' 파일을 다운로드합니다.

    '학습 이미지(작업 1 및 2)' 파일은 큰 학습 세트입니다. 용량은 138GB이며, Cloud Shell을 사용하여 TPU VM으로 다운로드하는 경우 다운로드 시간은 약 40시간입니다. Cloud Shell에서 VM 연결이 해제되면 nohup을 명령어에 추가하거나 screen을 사용할 수 있습니다.

    cd $IMAGENET_HOME \
    nohup wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train.tar
    

    URL이 변경되었을 수 있으므로 '학습 이미지(작업 1 및 2)'에 대해 이전에 저장한 URL로 URL을 바꿉니다.

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

    tar xf $IMAGENET_HOME/ILSVRC2012_img_train.tar -C $IMAGENET_HOME/train
    

    다음 스크립트에 표시된 것처럼 $IMAGENET_HOME/train 디렉터리에 있는 개별 학습 tar 파일을 추출합니다.

    cd `$IMAGENET_HOME/train`
    
    for f in *.tar; do
     d=`basename $f .tar`
     mkdir $d
     tar xf $f -C $d
    done
    

    tar 파일을 추출한 후에 삭제하여 디스크 공간을 확보합니다.

  4. $IMAGENET_HOME에서 저장된 URL을 사용하여 '학습 이미지(작업 3)' 파일을 다운로드합니다.

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

    wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train_t3.tar
    

    URL이 변경되었을 수 있으므로 '학습 이미지(작업 3)'에 대해 이전에 저장한 URL로 URL을 바꿉니다.

  5. 다음 명령어를 사용하여 개별 학습 디렉터리를 $IMAGENET_HOME/train 디렉터리로 추출합니다.

    tar xf $IMAGENET_HOME/ILSVRC2012_img_train_t3.tar -C $IMAGENET_HOME/train
    

    다음 스크립트에 표시된 것처럼 $IMAGENET_HOME/train 디렉터리에 있는 개별 학습 tar 파일을 추출합니다.

    cd `$IMAGENET_HOME/train`
    
    for f in *.tar; do
     d=`basename $f .tar`
     mkdir $d
     tar xf $f -C $d
    done
    

    tar 파일을 추출한 후에 삭제하여 디스크 공간을 확보합니다.

  6. $IMAGENET_HOME에서 저장된 URL을 사용하여 '검증 이미지(모든 작업)' 파일을 다운로드합니다.

    '검증 이미지(모든 태스크)' 파일을 다운로드할 때는 Cloud Shell 연결이 해제될 수 있습니다. nohup 또는 화면을 사용하여 Cloud Shell 연결이 해제되지 않도록 방지할 수 있습니다.

    wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_val.tar
    

    URL이 변경되었을 수 있으므로 '검증 이미지(모든 작업)'에 대해 이전에 저장한 URL로 URL을 바꿉니다.

    이 다운로드에 약 30분 걸립니다.

  7. 다음 명령어를 사용하여 개별 검증 파일을 $IMAGENET_HOME/validation 디렉터리에 추출합니다.

    tar xf $IMAGENET_HOME/ILSVRC2012_img_val.tar -C $IMAGENET_HOME/validation
    

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

  8. 라벨 파일을 다운로드합니다.

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

    로컬 머신에 라벨 파일을 다운로드한 경우 로컬 머신의 $IMAGENET_HOME 디렉터리를 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. 로컬 머신 또는 VM에 데이터 세트를 업로드하는 경우 데이터 세트를 저장할 데이터 디렉터리를 지정합니다.

    (vm)$ export DATA_DIR=$IMAGENET_HOME/dataset-directory
    
  4. 머신 또는 가상 환경에 다음 라이브러리를 설치합니다.

    pip3 install google-cloud-storage
    pip3 install tensorflow
    
  5. 스크립트를 실행하여 원시 데이터 세트를 TFRecord로 사전 처리하고 다음 명령어를 사용하여 Cloud Storage에 업로드합니다.

     python3 imagenet_to_gcs.py \
      --project=$PROJECT \
      --gcs_output_path=$STORAGE_BUCKET  \
      --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
${DATA_DIR}/validation-00001-of-00128
...
${DATA_DIR}/validation-00127-of-00128

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