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 membuat pembacaan file besar dari 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 cara menggunakan TFRecord:

Jika Anda 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 penerapan, simple_example.py, yang dapat Anda salin dan ubah untuk melakukan konversi data Anda sendiri.

Contoh konverter 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 untuk membuat instance ImageClassificationBuilder.

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

Di simple_example.py, SimpleDatasetConfig membuat 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 dari data gambar yang dibuat secara acak dan membuat instance objek SimpleDatasetConfig yang menentukan jumlah kelas 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 Pengonversi 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: test, train, dan validate)
  • text_label_map: menampilkan kamus yang memodelkan pemetaan antara label kelas teks dan label kelas 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 menuliskannya 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=your-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.17.1-pjrt

    Deskripsi tanda 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 Anda akan berubah dari username@projectname menjadi username@vm-name.

  4. Instal paket yang diperlukan.

    (vm)$ pip3 install opencv-python-headless pillow
    (vm)$ pip3 install tensorflow-datasets
  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. Download repositori TensorFlow TPU.

    (vm)$ cd /usr/share/
    (vm)$ git clone https://github.com/tensorflow/tpu.git
    (vm)$ cd tpu/tools/data_converter

Menjalankan konverter data pada set data palsu

Skrip simple_example.py terletak di folder image_classification contoh konverter data. Menjalankan skrip dengan parameter berikut akan menghasilkan sekumpulan 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 set data mentah kami

  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 kelas dalam set data. Kita menggunakan 1000 di sini untuk mencocokkan format ImageNet.
  • generate menentukan apakah data mentah akan dibuat atau tidak.
  • data_path mengacu pada jalur tempat data dibuat 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 kelas yang akan dibuat. Skrip menghasilkan angka acak contoh dalam rentang ini.
  • save_dir mengacu pada tempat TFRecord yang disimpan. 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 update
    (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 koneksi dari Cloud TPU, jika Anda belum melakukannya:

    (vm)$ exit

    Sekarang perintah Anda akan menjadi user@projectname, yang menunjukkan 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