Klasifikasi Data Gambar dengan BigQuery ML

1. Pengantar

Dalam codelab ini, kita akan membahas kasus penggunaan penyimpanan dan analisis gambar Pose Yoga di BigQuery, serta penerapan model klasifikasi dengan BigQuery ML untuk memberi label pada pose dengan hanya menggunakan konstruksi SQL dan bukan bentuk kode lainnya.

BigQuery dan BQML

BigQuery adalah multi-cloud data warehouse serverless (tanpa server) yang dapat diskalakan dari byte hingga petabyte tanpa overhead operasional. Ini menjadikannya pilihan tepat untuk menyimpan data pelatihan ML. Selain itu, BigQuery Machine Learning ( BQML) bawaan dan kemampuan analitiknya dapat Anda manfaatkan untuk membuat prediksi tanpa kode hanya dengan menggunakan kueri SQL. Anda juga dapat mengakses data dari sumber eksternal dengan kueri gabungan, sehingga menghilangkan kebutuhan akan pipeline ETL yang rumit. Anda dapat membaca informasi selengkapnya tentang semua hal yang ditawarkan BigQuery di halaman BigQuery.

Sejauh ini, kita mengenal BigQuery sebagai cloud data warehouse (CDW) terkelola sepenuhnya yang membantu pengguna menganalisis data terstruktur dan semi-terstruktur. Namun demikian,

  • BigQuery telah berkembang sehingga dapat melakukan semua analisis dan ML pada data yang tidak terstruktur juga.
  • Kita dapat menggunakan kueri SQL untuk melakukan analisis mendalam, proses analitis, dan ML pada gambar, video, audio, dll. dalam skala besar tanpa harus menulis kode tambahan
  • Kita memiliki kemampuan untuk menggabungkan data terstruktur dan tidak terstruktur seolah-olah semuanya berada dalam sebuah tabel

Hal ini akan dibahas dalam kasus penggunaan Klasifikasi Pose Yoga di bagian berikutnya.

Klasifikasi Data Gambar dengan BigQuery ML

Memiliki kemampuan untuk memproses dan menganalisis gambar menggunakan kueri terstruktur seolah-olah merupakan data terstruktur adalah hal yang benar-benar baru. Sekarang kita bahkan dapat memprediksi hasil dengan memanfaatkan model klasifikasi machine learning menggunakan BigQuery ML. Saya telah mempersempit tahapannya menjadi 5 langkah untuk memudahkan pemahaman:

fe97945bce996e1.jpeg

Langkah-langkah di atas bisa menjadi rumit jika kita hanya melihatnya sebagai label. Detail setiap komponen yang terlibat seperti Set Data BigQuery, koneksi BigLake, Bucket Cloud Storage (Container), Object Table (sumber data eksternal), BQML, dll. semuanya ditentukan di bagian implementasi. Jadi jangan berkecil hati jika Anda belum terbiasa dengan istilah-istilah ini.

Yang akan Anda bangun

Anda akan membuat model Klasifikasi Data Gambar dengan BQML yang mencakup hal-hal di bawah ini:

  • Set Data BigQuery untuk menampung tabel dan komponen model
  • Bucket Google Cloud Storage (GCS) untuk menyimpan Gambar Yoga untuk model
  • Tabel Eksternal untuk mengakses Gambar Cloud Storage
  • Koneksi BigLake untuk tabel eksternal guna mengakses gambar di GCS
  • Model ResNet di BigQuery ML
  • Inferensi menggunakan model yang dibuat
  • BigQuery SQL untuk menganalisis data gambar
  • BigQuery SQL untuk mengkueri data terstruktur dan tidak terstruktur secara bersamaan

Yang akan Anda pelajari

  • Cara membuat Bucket Cloud Storage dan menyimpan gambar
  • Cara membuat set data, tabel, dan koneksi BigQuery
  • Cara membuat model klasifikasi data gambar menggunakan BQML
  • Cara memprediksi dengan model yang dibuat menggunakan BigQuery ML
  • Cara membuat kueri gambar dan menggabungkannya dengan data terstruktur menggunakan BigQuery SQL

2. Persyaratan

  • Browser, seperti Chrome atau Firefox
  • Project Google Cloud dengan penagihan diaktifkan yang berisi layanan BigQuery, Cloud Storage, dan Koneksi BigLake Anda
  • Bagian selanjutnya berisi daftar langkah-langkah untuk membuat aplikasi klasifikasi data gambar

3. Membuat Set Data dan koneksi BigLake

Untuk kasus penggunaan deteksi gambar 5 pose Yoga, saya telah menggunakan set data yang tersedia untuk publik dan Anda dapat mengakses kumpulan data dari repo ini. Pose Yoga yang akan kita identifikasi terbatas pada Downdog, Goddess, Plank, Tree, dan Warrior2. Sebelum Anda memulai pembuatan Set Data BigQuery, pastikan untuk memilih atau membuat Project Google Cloud dan periksa apakah penagihan diaktifkan pada project tersebut atau tidak. Aktifkan BigQuery API dan BigQuery Connection API. Perlu diperhatikan bahwa semua layanan yang digunakan dalam implementasi ini harus berada di region pilihan yang sama.

a. Buat set data "yoga_set" menggunakan langkah-langkah di bawah ini:

Buka Editor BigQuery dan ketik perintah:

CREATE SCHEMA `<<project_id>>.yoga_set`;

b. Koneksi BigLake dapat digunakan untuk menghubungkan sumber data eksternal sambil mempertahankan kontrol akses dan keamanan BigQuery yang mendetail, yang dalam kasus ini adalah Cloud Storage untuk data gambar. Kita akan menggunakan koneksi ini untuk membaca objek dari Cloud Storage. Ikuti langkah-langkah di bawah ini untuk membuat Koneksi BigLake.

Klik ADD DATA pada panel Explorer di halaman BigQuery:

4cb42b1245bb0ba6.pngLayar "Add External Data" BigQuery

Klik Connections to external data sources lalu pilih opsi BigLake dan fungsi Remote:

9ffec2b2bfcc3cd5.pngMengonfigurasi Koneksi Sumber Data Eksternal

Berikan ID Koneksi dan buat koneksi. Ingatlah untuk mencatat ID Akun Layanan yang akan ditampilkan di layar setelah koneksi dibuat <<SERVICE_ACCOUNT>>. Dalam contoh ini, ID koneksinya adalah "yoga-pose-conn". Ingatlah untuk mencatat region-nya.

4. Membuat Bucket Google Cloud Storage dan Memberi Izin

Kita akan menggunakan bucket Google Cloud Storage untuk menampung file gambar pose Yoga yang menjadi dasar pembuatan model. Bucket adalah container Cloud Storage untuk menampung gambar yang akan kita analisis.

a. Buka Google Cloud Storage dengan mencarinya di konsol lalu klik Buckets untuk masuk ke beranda Buckets dan klik CREATE

a6f6b26cffb53ae0.pngHalaman Bucket Google Cloud Storage

b. Pada halaman Create a bucket, masukkan informasi bucket Anda (nama unik) dan lanjutkan. Pastikan informasi ini berada di region yang sama dengan set data dan koneksi yang dibahas pada langkah di atas, lalu klik create

1280366a42b7bdf6.pngHalaman Create a Bucket di Google Cloud Storage

Sebelum berlanjut ke langkah selanjutnya, pastikan Anda telah mencatat akun layanan, nama bucket, dan jalur Anda.

c. Setelah bucket dibuat, simpan gambar Anda (melalui perintah konsol atau Cloud Shell atau secara terprogram) dan berikan izin yang diperlukan untuk akun layanan koneksi (yang telah kita simpan sebelumnya) untuk mengakses gambar

> export sa=<<"SERVICE_ACCOUNT">>
> gsutil iam ch serviceAccount:$sa:objectViewer "gs://<<bucket>>"

5. Membuat Tabel Objek

Buat tabel objek eksternal dari BigQuery untuk mengakses data tidak terstruktur di bucket menggunakan koneksi yang kita buat. Jalankan CREATE SQL di bawah dari editor BigQuery:

CREATE OR REPLACE EXTERNAL TABLE `<<dataset>>.<<table_name>>`
WITH CONNECTION `us.<<connection-name>>`
OPTIONS(
object_metadata="SIMPLE", uris=["gs://<<bucket>>/<<folder_if_exists>>/*.jpg"]);

Tabel Eksternal dibuat seperti yang ditunjukkan di bawah ini:

bda48f566e0c292f.png

Mari kita buat kueri cepat atas sebuah pose dari tabel eksternal yang baru dibuat:

SELECT data , uri
FROM `yoga_set.yoga_poses`
WHERE REGEXP_CONTAINS(uri, 'gs://yoga_images/Downdog')
Limit 1;

Seperti yang terlihat pada screenshot di bawah, Anda dapat membuat dan mengoperasikan gambar tidak terstruktur seolah-olah merupakan data terstruktur:

7d1784122b5013f.png

Sekarang mari kita ekspor hasil kueri dari atas ke dalam cuplikan Python kecil untuk memvisualisasikan hasilnya:

Klik SAVE RESULTS dan pilih opsi "CSV Localfile" untuk mengekspor hasilnya. Kemudian buka Notebook Colab Anda (atau buat notebook sendiri) dan ketikkan kodenya di bawah ini

from IPython.display import display
from PIL import Image
import io
import pandas as pd
import base64
df = pd.read_csv('/content/sample_data/<<your_csv>>')
imgdata = base64.b64decode(str(df.data[0]))
image = Image.open(io.BytesIO(imgdata))
display(image)

Jalankan untuk melihat hasilnya seperti di bawah ini:

b8edd68cb281786a.png

Kita telah membuat tabel eksternal dan mengakses gambar dari Cloud Storage hanya menggunakan kueri SQL. Sekarang mari kita lanjutkan ke bagian berikutnya, yaitu membuat Model Klasifikasi.

6. Membuat Model dan Menguploadnya ke Google Cloud Storage

Untuk implementasi ini, kita akan menggunakan Model ResNet 50 yang telah dilatih sebelumnya untuk menjalankan inferensi pada tabel objek yang baru saja kita buat. Model ResNet 50 menganalisis file gambar dan menampilkan sejumlah vektor yang mewakili kemungkinan bahwa suatu gambar termasuk dalam class yang sesuai (logits).

Sebelum melanjutkan ke langkah ini, pastikan Anda memiliki semua izin yang diperlukan. Kemudian ikuti langkah-langkah di bawah ini:

  1. Download model dari lokasi ini dan simpan di lokasi lokal Anda
  2. Paketnya akan terbuka menjadi stored_model.pb dan folder variabel
  3. Upload keduanya (file dan folder) ke bucket yang kita buat di bagian sebelumnya

2629ff3eda214946.pngBucket Google Cloud Storage "yoga_images" dengan file Model ResNet yang diupload

Setelah langkah ini selesai, file terkait model Anda akan ada di bucket yang sama dengan gambar Anda seperti yang terlihat pada gambar di atas.

7. Memuat Model ke BQML dan melakukan Inferensi

Pada langkah ini, kita akan memuat model ke dalam Set Data BigQuery yang sama dengan tabel eksternal yang telah kita buat sebelumnya, dan menerapkannya untuk gambar yang telah kita simpan di Cloud Storage.

a. Dari Editor BigQuery, jalankan pernyataan SQL berikut

CREATE MODEL `<<Dataset>>.<<Model_Name>>`
OPTIONS(
model_type = 'TENSORFLOW',
model_path = 'gs://<<Bucket>>/*');

Setelah eksekusi selesai (yang dapat memakan waktu cukup lama bergantung pada set data Anda), Anda akan melihat model tersebut tercantum di bagian Set Data di BigQuery.

435fa0919aeb57a6.pngSet Data BigQuery mencantumkan model yang dibuat

b. Periksa model untuk melihat kolom input dan output-nya.

Perluas set data dan klik model yang baru saja kita buat "yoga_poses_resnet". Klik tab Schema:

e88928764f10f6ff.pngTab Skema Definisi Model BigQuery

Di bagian Labels, terlihat kolom "activation_49" yang mewakili kolom output. Di bagian Fitur, Anda dapat melihat "input_1" yang mewakili kolom yang diharapkan menjadi input ke model. Anda akan merujuk "input_1" dalam kueri inferensi Anda (atau kueri prediksi) sebagai kolom yang Anda berikan untuk data "uji" Anda.

c. Menginferensikan Pose Yoga Anda.

Mari kita gunakan model yang baru saja kita buat untuk mengklasifikasikan data gambar uji kita. Pastikan Anda memiliki beberapa gambar uji (pose Yoga) yang teridentifikasi dari Bucket Cloud Storage Anda yang berhasil masuk ke Tabel Eksternal saat kita membuatnya. Kita akan melakukan kueri secara selektif untuk gambar pengujian tersebut di BigQuery untuk melakukan inferensi menggunakan model BQML yang baru saja kita buat. Gunakan kueri di bawah ini untuk memicu pengujian.

SELECT *
FROM ML.PREDICT(
MODEL yoga_set.yoga_poses_resnet,
(SELECT uri, ML.DECODE_IMAGE(data) AS input_1
FROM yoga_set.yoga_poses where REGEXP_CONTAINS(uri,
'gs://yoga_images/Downdog/00000097.jpg')));

Dalam kueri di atas, kita memilih satu gambar uji yang teridentifikasi berisi nilai URI tertentu (00000097.jpg) di tabel eksternal. Selain itu, bagian SELECT menggunakan konstruksi ML.DECODE_IMAGE sebagai kolom "input_1" agar fungsi ML.PREDICT bekerja.

Setelah eksekusi selesai, Anda akan melihat hasilnya seperti yang ditunjukkan di bawah ini:

867018993845e943.png

Bagi mereka yang mengenal model ResNet secara mendalam, hal ini akan membantu dalam memahami klasifikasinya. Jika tidak, mari kita buat kode cuplikan kecil untuk memahami klasifikasi secara visual.

d. Meratakan hasilnya

Salah satu cara memvisualisasikan output di atas adalah dengan meratakan nilai kolom activation_49 menggunakan konstruksi UNNEST BigQuery SQL. Lihat kueri di bawah ini untuk meratakan hasil dari langkah sebelumnya. Jika Anda ingin memberi label lebih lanjut secara tekstual pada class yang dihasilkan, Anda dapat memasukkan logika sebagai pengganti placeholder <<LABEL_LOGIC>> dalam kueri (hapus tanda komentar saat menggunakannya).

with predictions as (
SELECT
Uri, data, SPLIT(uri, "/")[OFFSET(ARRAY_LENGTH(SPLIT(uri, "/")) - 1)] as img,
i as label_i,
<<LABEL_LOGIC>> label,
Score
FROM ML.PREDICT(
MODEL yoga_set.yoga_poses_resnet,
(SELECT data, uri, ML.DECODE_IMAGE(data) AS input_1
FROM yoga_set.yoga_poses
WHERE
REGEXP_CONTAINS(uri,'gs://yoga_images/Goddess/00000007.jpg'))),
UNNEST(activation_49) as score WITH OFFSET i)
SELECT * FROM predictions
ORDER BY score DESC
LIMIT  5;

Tanpa logika pelabelan class, di bawah ini adalah output atas kueri tersebut:

71f580f41f0811f3.png

Namun dalam kasus saya, saya menerapkan logika sampel dan di bawah ini hasilnya:

1c6df6ecd14fba1.png

Anda dapat membaca lebih lanjut tentang model dan menerapkan logika yang paling sesuai dengan data dan output model Anda.

e. Memvisualisasikan inferensi

Terakhir, sebuah cuplikan cepat Python untuk memvisualisasikan hasil dari klasifikasi. Ekspor hasil kueri di atas ke file CSV dan referensikan dalam kode Python.

68756e7e4b8d7a29.png

Output gambar di atas mengacu pada Pose Yoga "Downward Dog" yang persis sama dengan input pengujian yang kita berikan ke kueri ML.PREDICT untuk klasifikasi menggunakan BQML.

8. Menyatukan Data Terstruktur dan Tidak Terstruktur

Terakhir, bagian favorit saya dari implementasi ini adalah menyatukan kolom-kolom dari tabel relasional terstruktur saya dengan data gambar tidak terstruktur ini. Saya membuat tabel BigQuery terstruktur dalam set data yang sama dengan tabel eksternal untuk menyimpan data terkait pose dan keaktifannya.

125bdf848c86fbe.pngSkema "yoga_health" Tabel Terstruktur BigQuery

Gambar di atas mewakili skema tabel data terstruktur bernama "yoga_health" dan kolom-kolomnya adalah pose, fokus, manfaat_kesehatan, serta napas. Kueri di bawah menggabungkan data Terstruktur dan Tidak Terstruktur:

SELECT SPLIT(uri, "/")[OFFSET(ARRAY_LENGTH(SPLIT(uri, "/")) - 2)] as pose,
a.health_benefit, breath, focus, data
FROM `abis-345004.yoga_set.yoga_health` a, yoga_set.yoga_poses b
WHERE a.pose = SPLIT(uri, "/")[OFFSET(ARRAY_LENGTH(SPLIT(uri, "/")) - 2)];

Di bawah ini adalah hasilnya:

469bdfcffa9e19fd.png

Catatan: Semua kueri yang telah dibahas di blog ini dapat dijalankan langsung dari Notebook Python Anda menggunakan perintah BigQuery Magic.

9. Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam posting ini, ikuti langkah-langkah berikut.

  1. Di konsol Google Cloud, buka halaman Manage resources
  2. Dalam daftar project, pilih project yang ingin Anda hapus, lalu klik Delete
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project

10. Selamat

Selamat! Anda telah berhasil menyimpan, membuat kueri data tidak terstruktur di BigQuery, membuat Model Klasifikasi menggunakan BQML, dan memprediksi pose yoga uji dengan model tersebut. Jika Anda ingin menerapkan ini, mulailah membuat project Google Cloud Anda. Selain itu, jika Anda ingin mempelajari lebih lanjut database atau implementasi aplikasi menyeluruh lainnya di Google Cloud, kunjungi blog saya.