Mengonversi set data klasifikasi gambar untuk digunakan dengan Cloud TPU

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

TFRecord membuat pembacaan file besar dari Cloud Storage lebih efisien daripada membaca setiap gambar sebagai file terpisah. 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 Cloud Storage 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 di tpu/tools/data_converter/image_classification_data.py.

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

ImageClassificationBuilder adalah pembuat set data TensorFlow untuk set data klasifikasi gambar. Ini adalah subclass dari tdfs.core.GeneratorBasedBuilder. Fungsi ini mengambil contoh data dari set data Anda dan mengonversinya menjadi TFRecords. TFRecords ditulis ke jalur yang ditentukan oleh parameter data_dir ke metode __init__ dari ImageClassificationBuilder.

Di simple_example.py, SimpleDatasetConfig subclass ImageClassificationConfig, menerapkan 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 data gambar yang dihasilkan secara acak dan membuat instance objek SimpleDatasetConfig yang menentukan jumlah class dan jalur ke set data di disk. Selanjutnya, main() membuat instance objek ImageClassificationBuilder, dengan meneruskan instance SimpleDatasetConfig. Terakhir, main() memanggil download_and_prepare(). Saat metode ini dipanggil, instance ImageClassificationBuilder menggunakan generator contoh data yang diterapkan oleh SimpleDatasetConfig untuk memuat setiap contoh dan menyimpannya ke serangkaian file TFRecord.

Untuk penjelasan yang lebih mendetail, lihat Notebook Konverter Klasifikasi.

Mengubah contoh konversi data untuk memuat set data Anda

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

  • num_labels: menampilkan jumlah class gambar
  • supported_modes: menampilkan daftar mode yang didukung oleh set data Anda (misalnya: pengujian, pelatihan, dan validasi)
  • text_label_map: menampilkan kamus yang membuat model 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)

Implementasikan 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 contoh konversi data

  1. Buat bucket Cloud Storage menggunakan perintah berikut:

    gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=us-central2
  2. Luncurkan Cloud TPU menggunakan perintah gcloud.

    $ gcloud compute tpus tpu-vm create tpu-name \
        --zone=us-central2-b \
        --accelerator-type=v4-8 \
        --version=tpu-vm-tf-2.18.0-pjrt

    Deskripsi flag perintah

    zone
    Zona tempat Anda berencana membuat Cloud TPU.
    accelerator-type
    Jenis akselerator menentukan versi dan ukuran Cloud TPU yang ingin Anda buat. Untuk mengetahui informasi selengkapnya tentang jenis akselerator yang didukung untuk setiap versi TPU, lihat versi TPU.
    version
    Versi software Cloud TPU.
  3. Hubungkan ke TPU menggunakan SSH:

    $ gcloud compute tpus tpu-vm ssh tpu-name --zone=us-central2-b

    Saat Anda terhubung ke TPU, perintah shell akan berubah dari username@projectname menjadi username@vm-name.

  4. Instal paket yang diperlukan.

    (vm)$ pip3 install opencv-python-headless pillow
  5. 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"
  6. Ubah ke direktori data_converter.

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

Menjalankan pengonversi data pada set data palsu

Skrip simple_example.py terletak di folder image_classification sampel 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 di salah satu set 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. Kita menggunakan 1000 di sini untuk mencocokkan format ImageNet.
  • generate menentukan apakah akan membuat 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 dihasilkan. Skrip menghasilkan sejumlah contoh secara acak dalam rentang ini.
  • save_dir mengacu pada tempat TFRecords tersimpan. Untuk melatih model di Cloud TPU, data harus disimpan di Cloud Storage. File ini dapat berada 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)$ gcloud storage cp train* $GCS_CONVERTED
    (vm)$ gcloud storage cp validation* $GCS_CONVERTED

Pembersihan

  1. Putuskan sambungan dari Cloud TPU, jika Anda belum melakukannya:

    (vm)$ exit

    Perintah Anda sekarang akan menjadi user@projectname, yang menunjukkan bahwa Anda berada di Cloud Shell.

  2. Di Cloud Shell, jalankan gcloud untuk menghapus resource VM.

    $ gcloud compute tpus tpu-vm delete tpu-name \
      --zone=us-central2-b
  3. Verifikasi bahwa VM telah dihapus dengan menjalankan gcloud compute tpus tpu-vm list. Penghapusan mungkin memerlukan waktu beberapa menit. Respons seperti berikut menunjukkan bahwa instance Anda telah berhasil dihapus.

    $ gcloud compute tpus tpu-vm list --zone=us-central2-b
    Listed 0 items.
    
  4. Jalankan gcloud CLI seperti yang ditampilkan, yang mengganti bucket-name dengan nama bucket Cloud Storage yang Anda buat untuk tutorial ini:

    $ gcloud storage rm gs://bucket-name --recursive