Mengonversi set data klasifikasi gambar untuk digunakan dengan Cloud TPU


Tutorial ini menjelaskan cara menggunakan skrip contoh pengonversi data klasifikasi gambar untuk mengonversi set data klasifikasi gambar mentah ke format TFRecord yang digunakan untuk melatih model Cloud TPU.

TFRecord menjadikan pembacaan file besar dari Google Cloud Storage lebih efisien daripada membaca setiap gambar sebagai file individual. Anda dapat menggunakan TFRecord di mana pun Anda menggunakan pipeline tf.data.Dataset.

Lihat dokumen TensorFlow berikut untuk mengetahui informasi selengkapnya tentang penggunaan TFRecord:

Jika menggunakan framework PyTorch atau JAX, dan tidak menggunakan penyimpanan Google Cloud untuk penyimpanan set data, Anda mungkin tidak mendapatkan keuntungan yang sama dari TFRecords.

Ringkasan konversi

Folder klasifikasi gambar dalam repositori pengonversi data di GitHub berisi skrip converter, image_classification_data.py, dan contoh implementasi, simple_example.py, yang dapat Anda salin dan ubah untuk melakukan konversi data Anda sendiri.

Contoh pengonversi data klasifikasi gambar menentukan dua class, ImageClassificationConfig dan ImageClassificationBuilder. Class ini ditentukan dalam tpu/tools/data_converter/image_classification_data.py.

ImageClassificationConfig adalah class dasar abstrak. Anda membuat subclass ImageClassificationConfig untuk menentukan konfigurasi yang diperlukan guna membuat instance ImageClassificationBuilder.

ImageClassificationBuilder adalah builder set data TensorFlow untuk set data klasifikasi gambar. Ini adalah subclass dari tdfs.core.GeneratorBasedBuilder. Ini mengambil contoh data dari {i>dataset<i} Anda dan mengubahnya menjadi TFRecords. TFRecords ditulis ke jalur yang ditentukan oleh parameter data_dir ke metode __init__ dari ImageClassificationBuilder.

Dalam simple_example.py, SimpleDatasetConfig subclass ImageClassificationConfig, yang mengimplementasikan properti yang menentukan mode yang didukung, jumlah class gambar, dan generator contoh yang menghasilkan kamus yang berisi data gambar dan class gambar untuk setiap contoh dalam set data.

Fungsi main() membuat set data yang berisi data gambar yang dihasilkan secara acak dan membuat instance objek SimpleDatasetConfig yang menentukan jumlah class dan jalur ke set data di disk. Selanjutnya, main() akan membuat instance objek ImageClassificationBuilder, dengan meneruskan instance SimpleDatasetConfig. Terakhir, main() memanggil download_and_prepare(). Saat metode ini dipanggil, instance ImageClassificationBuilder akan menggunakan generator contoh data yang diimplementasikan oleh SimpleDatasetConfig untuk memuat setiap contoh dan menyimpannya ke serangkaian file TFRecord.

Untuk penjelasan yang lebih mendetail, lihat Notebook Konverter Klasifikasi.

Sebelum memulai

Memodifikasi sampel konversi data untuk memuat set data Anda

Untuk mengonversi set data ke dalam format TFRecord, buat subclass dari class ImageClassificationConfig yang menentukan properti berikut:

  • num_labels - mengembalikan jumlah kelas gambar
  • supported_modes - menampilkan daftar mode yang didukung oleh set data Anda (misalnya: menguji, melatih, dan memvalidasi)
  • text_label_map - menampilkan kamus yang memodelkan pemetaan antara label class teks dan label class bilangan bulat (SimpleDatasetConfig tidak menggunakan properti ini, karena tidak memerlukan pemetaan)
  • download_path - jalur tempat mendownload set data Anda (SimpleDatasetConfig tidak menggunakan properti ini, example_generator memuat data dari disk)

Mengimplementasikan fungsi generator example_generator. Metode ini harus menghasilkan kamus yang berisi data gambar dan nama class gambar untuk setiap contoh. ImageClassificationBuilder menggunakan fungsi example_generator() untuk mengambil setiap contoh dan menulisnya ke disk dalam format TFRecord.

Menjalankan sampel konversi data

  1. Buat bucket Cloud Storage menggunakan perintah berikut:

    gsutil mb -p ${PROJECT_ID} -c standard -l us-central1 gs://bucket-name
    
  2. Luncurkan VM Compute Engine menggunakan perintah gcloud.

    $ gcloud compute tpus execution-groups create \
     --vm-only \
     --zone=us-central1-b \
     --name=imageclassificationconverter \
     --tf-version=2.5.0
    
    gcloud compute ssh imageclassificationconverter --zone=us-central1-b 

    Mulai saat ini, awalan (vm)$ berarti Anda harus menjalankan perintah pada instance VM Compute Engine.

  3. Instal paket yang diperlukan.

    (vm)$ pip3 install opencv-python-headless pillow
    
  4. Buat variabel lingkungan berikut yang digunakan oleh skrip.

    (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. Ubah ke direktori data_converter.

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

Menjalankan konverter data pada {i>dataset<i} palsu

Skrip simple_example.py terletak di folder image_classification contoh pengonversi data. Menjalankan skrip dengan parameter berikut akan menghasilkan kumpulan gambar palsu dan mengonversinya menjadi 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

Menjalankan pengonversi data pada salah satu kumpulan data mentah

  1. Buat variabel lingkungan untuk lokasi data mentah.

    (vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
    
  2. Jalankan skrip simple_example.py.

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

Skrip simple_example.py menggunakan parameter berikut:

  • num_classes mengacu pada jumlah class dalam set data. Di sini kita menggunakan 1000 untuk mencocokkan format ImageNet.
  • generate menentukan apakah akan menghasilkan data mentah atau tidak.
  • data_path mengacu pada jalur tempat data dihasilkan jika generate=True atau jalur tempat data mentah disimpan jika generate=False.
  • num_examples_per_class_low dan num_examples_per_class_high menentukan jumlah contoh per class yang akan dibuat. Skrip ini menghasilkan sejumlah contoh acak dalam rentang ini.
  • save_dir merujuk pada tempat penyimpanan TFRecord yang disimpan. Untuk melatih model di Cloud TPU, data harus disimpan di Cloud Storage. Ini dapat terjadi di Cloud Storage atau di VM.

Mengganti nama dan memindahkan TFRecords ke Cloud Storage

Contoh berikut menggunakan data yang dikonversi dengan model ResNet.

  1. Ganti nama TFRecords ke format yang sama dengan TFRecords ImageNet:

    (vm)$ cd $CONVERTED_DIR/image_classification_builder/Simple/0.1.0/
    (vm)$ sudo apt install rename
    
    (vm)$ rename -v 's/image_classification_builder-(\w+)\.tfrecord/$1/g' *
  2. Salin TFRecords ke Cloud Storage:

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