Menjalankan inferensi pada tabel objek gambar

Dokumen ini menjelaskan cara menggunakan BigQuery ML untuk menjalankan inferensi pada tabel objek gambar.

Anda dapat menjalankan inferensi pada data gambar dengan menggunakan tabel objek sebagai input pada fungsi ML.PREDICT.

Untuk melakukannya, Anda harus terlebih dahulu memilih model yang sesuai, menguploadnya ke Cloud Storage, lalu mengimpornya ke BigQuery dengan menjalankan pernyataan CREATE MODEL. Anda dapat membuat model sendiri, atau mendownload model dari TensorFlow Hub.

Batasan

  • Penggunaan model yang diimpor BigQuery ML dengan tabel objek hanya didukung jika Anda menggunakan harga berbasis kapasitas melalui reservasi; harga on-demand tidak didukung.
  • File gambar yang terkait dengan tabel objek harus memenuhi persyaratan berikut:
    • Berukuran kurang dari 20 MB.
    • Memiliki format JPEG, PNG, atau BMP.
  • Ukuran gabungan file gambar yang terkait dengan tabel objek harus kurang dari 1 TB.
  • Modelnya harus berupa salah satu dari berikut ini:

  • Model harus memenuhi persyaratan dan batasan input yang dijelaskan dalam pernyataan CREATE MODEL untuk mengimpor model TensorFlow.

  • Ukuran serialisasi model harus kurang dari 450 MB.

  • Ukuran model yang di-deserialisasi (dalam memori) harus kurang dari 1.000 MB.

  • Tensor input model harus memenuhi kriteria berikut:

    • Memiliki jenis data tf.float32 dengan nilai dalam [0, 1), atau memiliki jenis data tf.uint8 dengan nilai dalam [0, 255).
    • Memiliki bentuk [batch_size, weight, height, 3], dengan:
      • batch_size harus berupa -1, None, atau 1.
      • width dan height harus lebih besar dari 0.
  • Model harus dilatih dengan gambar di salah satu ruang warna berikut:

    • RGB
    • HSV
    • YIQ
    • YUV
    • GRAYSCALE

    Anda dapat menggunakan fungsi ML.CONVERT_COLOR_SPACE untuk mengonversi gambar input ke ruang warna yang digunakan untuk melatih model.

Contoh model

Model berikut di TensorFlow Hub berfungsi dengan BigQuery ML dan tabel objek gambar:

Izin yang diperlukan

  • Untuk mengupload model ke Cloud Storage, Anda memerlukan izin storage.objects.create dan storage.objects.get.
  • Untuk memuat model ke BigQuery ML, Anda memerlukan izin berikut:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • Untuk menjalankan inferensi, Anda memerlukan izin berikut:

    • bigquery.tables.getData pada tabel objek
    • bigquery.models.getData pada model
    • bigquery.jobs.create

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery and BigQuery Connection API APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery and BigQuery Connection API APIs.

    Enable the APIs

Mengupload model ke Cloud Storage

Ikuti langkah-langkah berikut untuk mengupload model:

  1. Jika Anda telah membuat model sendiri, simpan model tersebut secara lokal. Jika Anda menggunakan model dari TensorFlow Hub, download model tersebut ke mesin lokal Anda. Jika Anda menggunakan TensorFlow, Anda akan mendapatkan file saved_model.pb dan folder variables untuk model tersebut.
  2. Jika perlu, buat bucket Cloud Storage.
  3. Upload artefak model ke bucket.

Memuat model ke BigQuery ML

Memuat model yang berfungsi dengan tabel objek gambar sama dengan memuat model yang berfungsi dengan data terstruktur. Ikuti langkah-langkah berikut untuk memuat model ke BigQuery ML:

CREATE MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`
OPTIONS(
  model_type = 'MODEL_TYPE',
  model_path = 'BUCKET_PATH');

Ganti kode berikut:

  • PROJECT_ID: project ID Anda.
  • DATASET_ID: ID set data yang akan berisi model.
  • MODEL_NAME: nama model.
  • MODEL_TYPE: gunakan salah satu nilai berikut:
    • TENSORFLOW untuk model TensorFlow
    • ONNX untuk model PyTorch dalam format ONNX
  • BUCKET_PATH: jalur ke bucket Cloud Storage yang berisi model, dalam format [gs://bucket_name/[folder_name/]*].

Contoh berikut menggunakan project default dan memuat model TensorFlow ke BigQuery ML sebagai my_vision_model, menggunakan file saved_model.pb dan folder variables dari gs://my_bucket/my_model_folder:

CREATE MODEL `my_dataset.my_vision_model`
OPTIONS(
  model_type = 'TENSORFLOW',
  model_path = 'gs://my_bucket/my_model_folder/*');

Memeriksa model

Anda dapat memeriksa model yang diupload untuk melihat kolom input dan output-nya. Anda perlu mereferensikan kolom ini saat menjalankan inferensi pada tabel objek.

Ikuti langkah-langkah berikut untuk memeriksa model:

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Explorer, luaskan project Anda, luaskan set data yang berisi model, lalu luaskan node Models.

  3. Klik model.

  4. Di panel model yang terbuka, klik tab Schema.

  5. Lihat bagian Label. Bagian ini mengidentifikasi kolom yang merupakan output oleh model.

  6. Lihat bagian Features. Bagian ini mengidentifikasi kolom yang harus dimasukkan ke dalam model. Anda mereferensikannya dalam pernyataan SELECT untuk fungsi ML.DECODE_IMAGE.

Untuk pemeriksaan model TensorFlow yang lebih mendetail, misalnya untuk menentukan bentuk input model, instal TensorFlow dan menggunakan saved_model_cli show perintah.

Melakukan prapemrosesan gambar

Anda harus menggunakan fungsi ML.DECODE_IMAGE untuk mengonversi byte gambar menjadi representasi ARRAY multi-dimensi. Anda dapat menggunakan output ML.DECODE_IMAGE langsung dalam fungsi ML.PREDICT, atau menulis hasil dari ML.DECODE_IMAGE ke kolom tabel dan mereferensikan kolom tersebut saat memanggil ML.PREDICT.

Contoh berikut menulis output fungsi ML.DECODE_IMAGE ke tabel:

CREATE OR REPLACE TABLE mydataset.mytable AS (
  SELECT ML.DECODE_IMAGE(data) AS decoded_image FROM mydataset.object_table
  );

Gunakan fungsi berikut untuk memproses gambar lebih lanjut agar kompatibel dengan model Anda:

Anda dapat menggunakan fungsi ini sebagai bagian dari fungsi ML.PREDICT, atau menjalankannya di kolom tabel yang berisi data gambar yang merupakan output dengan ML.DECODE_IMAGE.

Menjalankan inferensi

Setelah model yang sesuai dimuat, dan secara opsional melakukan pra-pemrosesan data gambar, Anda dapat menjalankan inferensi pada data gambar.

Untuk menjalankan inferensi:

SELECT *
FROM ML.PREDICT(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  (SELECT [other columns from the object table,] IMAGE_DATA AS MODEL_INPUT
  FROM PROJECT_ID.DATASET_ID.TABLE_NAME)
);

Ganti kode berikut:

  • PROJECT_ID: project ID untuk project yang berisi tabel objek dan model.
  • DATASET_ID: ID set data yang berisi tabel objek dan model.
  • MODEL_NAME: nama model.
  • IMAGE_DATA: data gambar, yang direpresentasikan oleh output fungsi ML.DECODE_IMAGE, atau oleh kolom tabel yang berisi output data gambar oleh ML.DECODE_IMAGE atau fungsi pemrosesan gambar lainnya.
  • MODEL_INPUT: nama kolom input untuk model. Anda dapat menemukan informasi ini dengan memeriksa model dan melihat nama kolom di Features.
  • TABLE_NAME: nama tabel objek.

Contoh

Contoh 1

Contoh berikut menggunakan fungsi ML.DECODE_IMAGE langsung dalam fungsi ML.PREDICT. Metode ini menampilkan hasil inferensi untuk semua gambar dalam tabel objek, untuk model dengan kolom input input dan kolom output feature:

SELECT * FROM
ML.PREDICT(
  MODEL `my_dataset.vision_model`,
  (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 480, 480, FALSE) AS input
  FROM `my_dataset.object_table`)
);

Contoh 2

Contoh berikut menggunakan fungsi ML.DECODE_IMAGE langsung dalam fungsi ML.PREDICT, dan menggunakan fungsi ML.CONVERT_COLOR_SPACE dalam fungsi ML.PREDICT untuk mengonversi ruang warna gambar dari RBG hingga YIQ. Bagian ini juga menunjukkan cara menggunakan kolom tabel objek untuk memfilter objek yang disertakan dalam inferensi. Metode ini menampilkan hasil inferensi untuk semua gambar JPG dalam tabel objek, untuk model dengan kolom input input dan kolom output feature:

SELECT * FROM
  ML.PREDICT(
    MODEL `my_dataset.vision_model`,
    (SELECT uri, ML.CONVERT_COLOR_SPACE(ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 224, 280, TRUE), 'YIQ') AS input
    FROM `my_dataset.object_table`
    WHERE content_type = 'image/jpeg')
  );

Contoh 3

Contoh berikut menggunakan hasil dari ML.DECODE_IMAGE yang telah ditulis ke kolom tabel, tetapi tidak diproses lebih lanjut. Fungsi ini menggunakan ML.RESIZE_IMAGE dan ML.CONVERT_IMAGE_TYPE dalam fungsi ML.PREDICT untuk memproses data gambar. Metode ini menampilkan hasil inferensi untuk semua gambar dalam tabel gambar yang di-dekode, untuk model dengan kolom input input dan kolom output feature.

Buat tabel gambar yang di-dekode:

CREATE OR REPLACE TABLE `my_dataset.decoded_images`
  AS (SELECT ML.DECODE_IMAGE(data) AS decoded_image
  FROM `my_dataset.object_table`);

Jalankan inferensi pada tabel gambar yang di-dekode:

SELECT * FROM
ML.PREDICT(
  MODEL`my_dataset.vision_model`,
  (SELECT uri, ML.CONVERT_IMAGE_TYPE(ML.RESIZE_IMAGE(decoded_image, 480, 480, FALSE)) AS input
  FROM `my_dataset.decoded_images`)
);

Contoh 4

Contoh berikut menggunakan hasil dari ML.DECODE_IMAGE yang telah ditulis ke kolom tabel dan diproses sebelumnya menggunakan ML.RESIZE_IMAGE. Metode ini menampilkan hasil inferensi untuk semua gambar dalam tabel gambar yang di-dekode, untuk model dengan kolom input input dan kolom output feature.

Buat tabel:

CREATE OR REPLACE TABLE `my_dataset.decoded_images`
  AS (SELECT ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data) 480, 480, FALSE) AS decoded_image
  FROM `my_dataset.object_table`);

Jalankan inferensi pada tabel gambar yang di-dekode:

SELECT * FROM
ML.PREDICT(
  MODEL `my_dataset.vision_model`,
  (SELECT uri, decoded_image AS input
  FROM `my_dataset.decoded_images`)
);

Contoh 5

Contoh berikut menggunakan fungsi ML.DECODE_IMAGE langsung dalam fungsi ML.PREDICT. Dalam contoh ini, model memiliki kolom output berupa embeddings dan dua kolom input: satu yang mengharapkan gambar, f_img, dan satu lagi yang mengharapkan string, f_txt. Input gambar berasal dari tabel objek dan input string berasal dari tabel BigQuery standar yang digabungkan dengan tabel objek menggunakan kolom uri.

SELECT * FROM
  ML.PREDICT(
    MODEL `my_dataset.mixed_model`,
    (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(my_dataset.my_object_table.data), 224, 224, FALSE) AS f_img,
      my_dataset.image_description.description AS f_txt
    FROM `my_dataset.object_table`
    JOIN `my_dataset.image_description`
    ON object_table.uri = image_description.uri)
  );

Langkah berikutnya