1. Introduzione
In questo codelab, esamineremo il caso d'uso dell'archiviazione e dell'analisi di immagini di pose di yoga in BigQuery e dell'implementazione di un modello di classificazione con BigQuery ML per etichettare le pose utilizzando solo costrutti SQL e nessun altro tipo di codice.
BigQuery e BQML
BigQuery è un data warehouse multi-cloud serverless in grado di scalare da byte a petabyte senza sovraccarico operativo. Ciò lo rende un'ottima scelta per l'archiviazione dei dati di addestramento ML. Inoltre, le funzionalità di analisi e BigQuery Machine Learning ( BQML) integrate ti consentono di creare previsioni no-code utilizzando solo query SQL. Inoltre, puoi accedere ai dati da fonti esterne con query federate, eliminando la necessità di pipeline ETL complesse. Puoi scoprire di più su tutto ciò che BigQuery ha da offrire nella pagina di BigQuery.
Finora, BigQuery è noto come data warehouse su cloud completamente gestito che aiuta gli utenti ad analizzare dati strutturati e semistrutturati. Ma
- BigQuery è stato ampliato per eseguire tutte le analisi e il machine learning anche su dati non strutturati
- Possiamo utilizzare query SQL per eseguire analisi approfondite, analisi e ML su immagini, video, audio e così via su larga scala senza dover scrivere codice aggiuntivo
- Abbiamo la possibilità di combinare dati strutturati e non strutturati come se esistessero tutti insieme in una tabella
Ne parleremo nel caso d'uso della classificazione delle pose di yoga trattato nella prossima sezione.
Classificazione dei dati delle immagini con BigQuery ML
La possibilità di elaborare e analizzare le immagini utilizzando query strutturate come se fossero dati strutturati è la prima nel suo genere. Ora possiamo persino prevedere i risultati utilizzando modelli di classificazione di machine learning con BigQuery ML. Per semplificare la comprensione, ho ridotto le fasi coinvolte a 5 passaggi:

I passaggi precedenti potrebbero essere complicati se li consideriamo solo come etichette. I dettagli di ciascuno dei componenti coinvolti, come il set di dati BigQuery, la connessione BigLake, i bucket Cloud Storage (container), la tabella degli oggetti (origine dati esterna), BQML e così via, sono tutti definiti nella sezione di implementazione. Quindi non scoraggiarti se non hai ancora familiarità con questi termini.
Cosa creerai
Creerai un modello di classificazione dei dati delle immagini con BQML che copre quanto segue:
- Un set di dati BigQuery che contenga i componenti della tabella e del modello
- Bucket Google Cloud Storage (GCS) per archiviare le immagini di yoga per il modello
- Una tabella esterna per accedere alle immagini di Cloud Storage
- Una connessione BigLake per la tabella esterna per accedere alle immagini in GCS
- Modello ResNet in BigQuery ML
- Inferenza utilizzando il modello creato
- BigQuery SQL per l'analisi dei dati delle immagini
- BigQuery SQL per eseguire query sui dati strutturati e non strutturati insieme
Obiettivi didattici
- Come creare un bucket Cloud Storage e archiviare le immagini
- Come creare set di dati, tabella e connessione BigQuery
- Come creare un modello di classificazione dei dati delle immagini utilizzando BQML
- Come eseguire previsioni con il modello creato utilizzando BigQuery ML
- Come eseguire query sulle immagini e combinarle con dati strutturati utilizzando BigQuery SQL
2. Requisiti
3. Crea un set di dati e una connessione BigLake
Per il nostro caso d'uso del rilevamento di immagini di 5 pose di yoga, ho utilizzato un set di dati disponibile pubblicamente e puoi accedervi da questo repository. Le pose di yoga che identifichiamo sono limitate a cane a testa in giù, dea, tavola, albero e guerriero II. Prima di iniziare a creare il set di dati BigQuery, assicurati di selezionare o creare un progetto Google Cloud e verifica che la fatturazione sia abilitata nel progetto. Abilita l'API BigQuery e l'API BigQuery Connection. Tieni presente che tutti i servizi utilizzati in questa implementazione devono trovarsi nella stessa regione scelta.
a. Crea il set di dati "yoga_set" seguendo i passaggi riportati di seguito:
Vai all'editor BigQuery e digita il comando:
CREATE SCHEMA `<<project_id>>.yoga_set`;
b. BigLake Connection ci consente di connettere l'origine dati esterna mantenendo la sicurezza e il controllo dell'accesso granulare di BigQuery, che nel nostro caso è Cloud Storage per i dati delle immagini. Utilizzeremo questa connessione per leggere gli oggetti da Cloud Storage. Segui i passaggi riportati di seguito per creare la connessione BigLake.
Fai clic su AGGIUNGI DATI nel riquadro Explorer della pagina BigQuery:
Schermata "Aggiungi dati esterni" di BigQuery
Fai clic su Connessioni a origini dati esterne e seleziona l'opzione BigLake e funzioni remote:
Configurare la connessione dell'origine dati esterna
Fornisci l'ID connessione e crea la connessione. Ricordati di annotare l'ID del service account che verrà visualizzato sullo schermo una volta creata la connessione <<SERVICE_ACCOUNT>>. Nel nostro esempio, l'ID connessione è "yoga-pose-conn". Ricorda di annotare la regione.
4. Crea un bucket Cloud Storage e concedi le autorizzazioni
Utilizzeremo il bucket Cloud Storage per contenere i file immagine delle pose di yoga su cui vogliamo creare il modello. I bucket sono i container Cloud Storage in cui inserire le immagini che analizzeremo.
a. Vai a Google Cloud Storage cercandolo nella console, quindi fai clic su Bucket per visualizzare la home page di Bucket e fai clic su CREA.
Pagina dei bucket Google Cloud Storage
b. Nella pagina Crea un bucket, inserisci le informazioni del bucket (un nome univoco) e continua. Assicurati che si trovi nella stessa regione del set di dati e della connessione descritti nei passaggi precedenti e fai clic su Crea.
Pagina Crea un bucket di Google Cloud Storage
Prima di passare al passaggio successivo, assicurati di aver annotato il service account, il nome del bucket e il percorso.
c. Una volta creato il bucket, memorizza le immagini (tramite la console o i comandi Cloud Shell o in modo programmatico) e concedi le autorizzazioni necessarie al service account della connessione (che abbiamo salvato in precedenza) per accedere alle immagini.
> export sa=<<"SERVICE_ACCOUNT">>
> gsutil iam ch serviceAccount:$sa:objectViewer "gs://<<bucket>>"
5. Creare una tabella degli oggetti
Crea una tabella di oggetti esterni da BigQuery per accedere ai dati non strutturati nel bucket utilizzando la connessione che abbiamo creato. Esegui il comando CREATE SQL riportato di seguito dall'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"]);
La tabella esterna viene creata come mostrato di seguito:

Eseguiamo rapidamente una query su una posa dalla tabella esterna appena creata:
SELECT data , uri
FROM `yoga_set.yoga_poses`
WHERE REGEXP_CONTAINS(uri, 'gs://yoga_images/Downdog')
Limit 1;
Come puoi vedere nello screenshot di seguito, puoi creare e utilizzare immagini non strutturate come se fossero dati strutturati:

Ora esportiamo il risultato della query precedente in un piccolo snippet Python per visualizzarlo:
Fai clic su SALVA RISULTATI e seleziona l'opzione "CSV Localfile" per esportare il risultato. Poi apri il notebook Colab (o creane uno) e digita il codice riportato di seguito.
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)
Esegui per visualizzare il risultato come di seguito:

Ora che abbiamo creato la tabella esterna e abbiamo eseguito l'accesso alle immagini da Cloud Storage utilizzando solo query SQL, passiamo alla sezione successiva, ovvero la creazione del modello di classificazione.
6. Crea il modello e caricalo su Google Cloud Storage
Per questa implementazione, utilizzeremo il modello ResNet 50 preaddestrato per eseguire l'inferenza sulla tabella degli oggetti che abbiamo appena creato. Il modello ResNet 50 analizza i file immagine e restituisce un batch di vettori che rappresentano la probabilità che un'immagine appartenga alla classe corrispondente (logits).
Prima di procedere con questo passaggio, assicurati di disporre di tutte le autorizzazioni necessarie. Poi segui i passaggi riportati di seguito:
- Scarica il modello da questa posizione e salvalo nella tua
- Deve essere decompresso in saved_model.pb e in una cartella delle variabili
- Carica questi due elementi (il file e la cartella) nel bucket creato nella sezione precedente.
Bucket Cloud Storage Google Cloud Storage "yoga_images" con i file del modello ResNet caricati
Una volta completato questo passaggio, i file correlati al modello dovrebbero essere presenti nello stesso bucket delle immagini, come mostrato nell'immagine sopra.
7. Carica il modello in BQML e deduci
In questo passaggio, caricheremo il modello nello stesso set di dati BigQuery della tabella esterna che abbiamo creato in precedenza e lo applicheremo alle immagini che abbiamo archiviato in Cloud Storage.
a. Dall'editor di BigQuery, esegui la seguente istruzione SQL
CREATE MODEL `<<Dataset>>.<<Model_Name>>`
OPTIONS(
model_type = 'TENSORFLOW',
model_path = 'gs://<<Bucket>>/*');
Una volta completata l'esecuzione (che potrebbe richiedere un po' di tempo a seconda del set di dati), vedrai il modello elencato nella sezione Set di dati di BigQuery.
Elenco dei set di dati BigQuery che mostra il modello creato
b. Esamina il modello per visualizzare i campi di input e output.
Espandi il set di dati e fai clic sul modello appena creato "yoga_poses_resnet". Fai clic sulla scheda Schema:
Scheda Schema di definizione del modello BigQuery
Nella sezione Etichette, vedrai il campo "activation_49" che rappresenta il campo di output. Nella sezione Funzionalità, puoi vedere "input_1", che rappresenta il campo che dovrebbe essere inserito nel modello. Nella query di inferenza (o di previsione), farai riferimento a "input_1" come campo che stai trasmettendo per i dati di "test".
c. Indovina la tua posa yoga.
Utilizziamo il modello appena creato per classificare i dati delle immagini di test. Assicurati di avere alcune immagini di test (pose di yoga) identificate dal tuo bucket Cloud Storage che sono state inserite nella tabella esterna quando l'abbiamo creata. Eseguiremo una query selettiva per queste immagini di test in BigQuery per eseguire l'inferenza utilizzando il modello BQML appena creato. Utilizza la query riportata di seguito per attivare il test.
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')));
Nella query precedente, selezioniamo un'immagine di test identificata per contenere un valore URI specifico (00000097.jpg) nella tabella esterna. Inoltre, la parte SELECT utilizza il costrutto ML.DECODE_IMAGE come campo "input_1" affinché la funzione ML.PREDICT funzioni.
Una volta completata l'esecuzione, vedrai il risultato come mostrato di seguito:

Per chi conosce a fondo il modello ResNet, questo dovrebbe aiutare a comprendere la classificazione. In caso contrario, codifichiamo un piccolo snippet per comprendere visivamente la classificazione.
d. Appiattimento del risultato
Un modo per visualizzare l'output precedente è appiattire i valori del campo activation_49 utilizzando il costrutto UNNEST di BigQuery SQL. Fai riferimento alla query riportata di seguito per appiattire il risultato del passaggio precedente. Se vuoi etichettare ulteriormente la classe risultante, puoi introdurre la logica al posto del segnaposto <<LABEL_LOGIC>> nella query (decommenta quando lo utilizzi).
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;
Senza la logica di etichettatura delle classi, di seguito è riportato l'output della query:

Tuttavia, nel mio caso ho applicato una logica di esempio e di seguito è riportato il risultato:

Puoi leggere ulteriori informazioni sul modello e applicare la logica più adatta ai tuoi dati e all'output del modello.
e. Visualizzare l'inferenza
Infine, un rapido snippet Python per visualizzare il risultato della classificazione. Esporta il risultato della query precedente in un file CSV e fai riferimento a questo file nel codice Python.

L'output dell'immagine precedente si riferisce alla posizione di yoga "Cane a testa in giù", che è esattamente lo stesso input di test che abbiamo passato alla query ML.PREDICT per la classificazione utilizzando BQML.
8. Unificazione di dati strutturati e non strutturati
Infine, la mia parte preferita di questa implementazione è unificare i campi della mia tabella relazionale strutturata con questi dati immagine non strutturati. Ho creato una tabella BigQuery strutturata nello stesso set di dati della tabella esterna per contenere la posa e i relativi dati sanitari.
Schema della tabella strutturata BigQuery "yoga_health"
L'immagine sopra rappresenta lo schema della tabella di dati strutturati denominata "yoga_health" e i campi sono pose, focus, health_benefit e breath. La query riportata di seguito unisce dati strutturati e non strutturati:
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 seguito è riportato il risultato:

Nota:tutte le query trattate in questo blog possono essere eseguite direttamente dal notebook Python utilizzando i comandi BigQuery Magic.
9. Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo post, segui questi passaggi.
- Nella console Google Cloud, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID progetto, quindi fai clic su Chiudi per eliminare il progetto.
10. Complimenti
Complimenti! Hai archiviato ed eseguito query sui dati non strutturati in BigQuery, creato un modello di classificazione utilizzando BQML e previsto le pose di yoga di test con il modello. Se vuoi implementare questa funzionalità, inizia con il tuo progetto Google Cloud. Inoltre, se vuoi saperne di più sui database o su altre implementazioni di applicazioni end-to-end in Google Cloud, visita i miei blog.