Cloud TPU와 함께 사용할 이미지 분류 데이터세트 변환

이 가이드에서는 이미지 분류 데이터 변환기 샘플 스크립트를 사용하여 이미지 분류를 위한 원시 데이터 세트를 Cloud TPU Tensorflow 모델에서 사용하는 TFRecord 형식으로 변환하는 방법을 설명합니다. GitHub의 이미지 분류 저장소에는 converter 스크립트, image_classification_data.py, 샘플 구현 simple_example.py가 포함되어 있어, 복사하고 수정하여 자체 데이터 변환을 수행할 수 있습니다.

이미지 분류 데이터 변환기 샘플은 두 개의 클래스 ImageClassificationConfigImageClassificationBuilder를 정의합니다. 이들 클래스는 tpu/tools/data_converter/image_classification_data.py에 정의됩니다.

ImageClassificationConfig는 추상 기본 클래스입니다. ImageClassificationConfig를 서브클래스로 만들어서 ImageClassificationBuilder를 인스턴스화하는데 필요한 구성을 정의합니다.

ImageClassificationBuilder는 이미지 분류 데이터세트의 TensorFlow 데이터세트 빌더입니다. tdfs.core.GeneratorBasedBuilder의 서브클래스입니다. 데이터세트에서 데이터 예시를 검색하여 TFRecord로 변환합니다. TFRecord는 data_dir 매개변수로 지정한 경로에 ImageClassificationBuilder__init__ 메서드에 기록됩니다.

simple_example.py에서 SimpleDatasetConfigImageClassificationConfig의 서브클래스를 만들고 지원 모드, 이미지 클래스 수, 데이터세트의 각 예시에 대한 이미지 데이터와 이미지 클래스를 포함하는 사전을 생성하는 생성기 예시를 정의하는 속성을 구현합니다.

main() 함수는 무작위로 생성된 이미지 데이터의 데이터세트를 만들고 클래스 수와 디스크의 데이터세트 경로를 지정하는 SimpleDatasetConfig 객체를 인스턴스화합니다. 다음으로, main()SimpleDatasetConfig 인스턴스를 전달하며 ImageClassificationBuilder 객체를 인스턴스화합니다. 마지막으로 main()download_and_prepare()를 호출합니다. 이 메서드가 호출되면 ImageClassificationBuilder 인스턴스는 SimpleDatasetConfig에서 구현한 데이터 예시 생성기를 사용하여 각 예시를 로드하고 일련의 TFRecord 파일에 저장합니다.

자세한 내용은 분류 변환기 메모장을 참조하세요.

데이터세트를 로드하도록 데이터 변환 샘플 수정

데이터세트를 TFRecord 형식으로 변환하려면 다음 속성을 정의하는 ImageClassificationConfig 클래스의 서브클래스를 만듭니다.

  • num_labels - 이미지 클래스 수를 반환합니다.
  • supported_modes - 데이터세트에서 지원하는 모드 목록을 반환합니다(예: 테스트, 학습, 검증).
  • text_label_map - 텍스트 클래스 라벨과 정수 클래스 라벨 간의 매핑을 모델링하는 사전을 반환합니다. 매핑이 필요하지 않으므로 SimpleDatasetConfig는 이 속성을 사용하지 않습니다.
  • download_path - 데이터세트를 다운로드할 경로이며 SimpleDatasetConfig는 이 속성을 사용하지 않고 example_generator는 디스크에서 데이터를 로드합니다.

example_generator 생성기 함수를 구현합니다. 이 메서드는 각 예시에 대해 이미지 데이터와 이미지 클래스 이름이 포함된 사전을 생성해야 합니다. ImageClassificationBuilderexample_generator() 함수를 사용하여 각 예시를 검색하고 이를 TFRecord 형식으로 디스크에 씁니다.

데이터 변환 샘플 실행

  1. 다음 명령어를 사용하여 Cloud Storage 버킷을 만듭니다.

    gsutil mb -p ${PROJECT_ID} -c standard -l us-central1 -b on gs://bucket-name
    
  2. ctpu 명령어를 사용하여 VM을 만듭니다.

    ctpu up --vm-only \
      --zone=us-central1-b \
      --name=img-class-converter \
      --tf-version=2.2
    
    gcloud compute ssh img-class-converter --zone=us-central1-b 

    여기에서 (vm)$ 프리픽스는 Compute Engine VM 인스턴스에서 명령어를 실행해야 한다는 의미입니다.

  3. 필수 패키지 설치

    (vm)$ pip3 install opencv-python-headless pillow
    
  4. 스크립트에 사용되는 다음 환경변수를 만듭니다.

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
    (vm)$ export CONVERTED_DIR=$HOME/tfrecords
    (vm)$ export GENERATED_DATA=$HOME/data
    (vm)$ export GCS_CONVERTED=$STORAGE_BUCKET/data_converter/image_classification/tfrecords
    (vm)$ export GCS_RAW=$STORAGE_BUCKET/image_classification/raw
    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    
  5. data_converter 디렉터리로 변경합니다.

    (vm)$ cd /usr/share/tpu/tools/data_converter
    

모의 데이터세트에서 데이터 변환기 실행

simple_example.py 스크립트는 데이터 변환기 샘플의 image_classification 폴더에 위치합니다. 다음 매개변수로 스크립트를 실행하면 가짜 이미지 모음이 생성되어 TFRecords로 변환됩니다.

(vm)$ python3 image_classification/simple_example.py \
  --num_classes=1000 \
  --data_path=$GENERATED_DATA \
  --generate=True \
  --num_examples_per_class_low=10 \
  --num_examples_per_class_high=11 \
  --save_dir=$CONVERTED_DIR

원시 데이터세트 중 하나에서 데이터 변환기 실행

  1. 원시 데이터의 위치를 위한 환경 변수를 만듭니다.

    (vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
    
  2. simple_example.py 스크립트를 실행합니다.

    (vm)$ python3 image_classification/simple_example.py \
    --num_classes=1000 \
    --data_path=$GCS_RAW \
    --generate=False \
    --save_dir=$CONVERTED_DIR
    

simple_example.py 스크립트는 다음 매개변수를 사용합니다.

  • num_classes는 데이터 세트의 클래스 수를 나타냅니다. ImageNet 형식과 일치하도록 여기에서는 1000을 사용합니다.
  • generate는 원시 데이터를 생성할지 여부를 결정합니다.
  • data_pathgenerate=True인 경우 데이터를 생성해야 하는 경로, 또는 generate=False인 경우 원시 데이터가 저장되는 경로를 나타냅니다.
  • num_examples_per_class_lownum_examples_per_class_high 클래스당 생성할 예제의 수를 결정합니다. 스크립트는 이 범위에서 임의의 수의 예제를 생성합니다.
  • save_dir은 저장된 TFRecord를 저장할 위치를 나타냅니다. Cloud TPU에서 모델을 학습시키려면 데이터를 Cloud Storage에 저장해야 합니다. Cloud Storage 또는 VM에 저장할 수 있습니다.

TFRecord 이름 변경 및 Cloud Storage로 이동

다음 예에서는 TF 1.x ResNet 모델과 함께 변환된 데이터를 사용합니다.

  1. TFRecords 이름을 ImageNet TFRecords와 동일한 형식으로 바꿉니다.

    (vm)$ cd $CONVERTED_DIR/image_classification_builder/Simple/0.1.0/
    (vm)$ rename -v 's/image_classification_builder-(\w+)\.tfrecord/$1/g' *
  2. TFRecords를 Cloud Storage에 복사합니다.

    (vm)$ gsutil -m cp train* $GCS_CONVERTED
    (vm)$ gsutil -m cp validation* $GCS_CONVERTED

생성된 데이터 세트에서 ResNet 실행

  1. TPU를 만듭니다.

    (vm)$ export TPU_NAME=imageclassificationconverter
    (vm)$ ctpu up --zone=us-central1-b 
    --tpu-only
    --tpu-size=v2-8
    --name=${TPU_NAME}

  2. 모델이 포함된 스토리지 버킷 디렉토리의 환경 변수를 만듭니다.

    (vm)$ export MODEL_BUCKET=${STORAGE_BUCKET}/image_classification_converter
    
  3. 모델 실행

    (vm)$ cd /usr/share/tpu/models/official/resnet
    (vm)$ python3 resnet_main.py --tpu=${TPU_NAME} 
    --data_dir=${GCS_CONVERTED}
    --config_file=configs/cloud/v3-8.yaml
    --model_dir=${MODEL_BUCKET}
    --num_train_images=10000
    --num_eval_images=10000