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 penggunaan 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 ke TFRecord. TFRecord ditulis ke jalur yang ditentukan oleh parameter data_dir ke metode __init__ dari ImageClassificationBuilder.

Di simple_example.py, SimpleDatasetConfig membuat subclass ImageClassificationConfig, yang 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.

Ubah sampel 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.

Jalankan contoh konversi data

  1. Buat bucket Cloud Storage menggunakan perintah berikut:

    gcloud storage buckets create gs://BUCKET_NAME --project=PROJECT_ID --location=LOCATION

    Ganti kode berikut:

    • BUCKET_NAME: Nama untuk bucket.
    • PROJECT_ID: Project ID Anda.
    • LOCATION: Lokasi tempat bucket Anda akan dibuat. Misalnya, US-CENTRAL1.
  2. Buat Cloud TPU menggunakan perintah gcloud compute instances create.

    $ gcloud compute instances create TPU_NAME \
        --machine-type=MACHINE_TYPE \
        --zone=ZONE \
        --image-family=IMAGE_FAMILY \
        --image-project=IMAGE_PROJECT \
        --maintenance-policy=TERMINATE

    Ganti kode berikut:

    • TPU_NAME: Nama untuk TPU.
    • MACHINE_TYPE: Jenis mesin yang akan digunakan untuk VM TPU. Untuk mengetahui informasi selengkapnya, lihat Jenis mesin TPU.
    • ZONE: Zona tempat TPU akan dibuat.
    • IMAGE_FAMILY: Kelompok image dari image OS yang ingin Anda gunakan. Image terbaru yang masih berlaku dan terkait dengan kelompok tersebut akan digunakan. Untuk menentukan image tertentu, ganti tanda --image-family dengan tanda --image dan tetapkan nilainya ke image OS yang didukung. Untuk daftar sistem operasi yang didukung, lihat Image OS TPU.
    • IMAGE_PROJECT: Project ID image OS. Untuk mengetahui daftar ID project yang terkait dengan setiap image publik, lihat Image OS TPU.
  3. Hubungkan ke TPU menggunakan SSH:

    $ gcloud compute ssh TPU_NAME --zone=ZONE

    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

Jalankan pengonversi 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

Jalankan 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. Di sini kita menggunakan 1000 agar sesuai dengan 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.

Ganti nama dan pindahkan 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 perintah gcloud compute instances delete untuk menghapus VM TPU.

    $ gcloud compute instances delete TPU_NAME \
        --zone=ZONE
  3. Pastikan VM telah dihapus dengan menjalankan perintah gcloud compute instances list. Penghapusan mungkin memerlukan waktu beberapa menit.

    $ gcloud compute instances list --zone=ZONE
  4. Hapus bucket dengan menjalankan perintah berikut, dengan mengganti BUCKET_NAME dengan nama bucket yang Anda buat untuk tutorial ini:

    $ gcloud storage rm gs://BUCKET_NAME --recursive