Classificazione dei dati di immagine con BigQuery ML

1. Introduzione

In questo codelab, discuteremo il caso d'uso di archiviare e analizzare immagini di posizioni yoga in BigQuery e implementare un modello di classificazione con BigQuery ML per etichettare le pose utilizzando solo costrutti SQL e nessun'altra forma di codice.

BigQuery e BQML

BigQuery è un data warehouse multi-cloud serverless in grado di scalare da byte a petabyte senza alcun overhead operativo. Questo lo rende un'ottima scelta per l'archiviazione dei dati di addestramento ML. Inoltre, le funzionalità integrate di BigQuery Machine Learning ( BQML) e analisi 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 complicate pipeline ETL. Per saperne di più su tutto ciò che BigQuery ha da offrire, consulta la pagina BigQuery.

Finora conosciamo BigQuery come questo data warehouse su cloud completamente gestito che aiuta gli utenti ad analizzare dati strutturati e semistrutturati. Ma

  • BigQuery si è 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 machine learning su immagini, video, audio ecc. su larga scala senza dover scrivere codice aggiuntivo
  • Abbiamo la capacità di combinare dati strutturati e non strutturati come se esistessero tutti insieme in una tabella

Ne discuteremo nel caso d'uso relativo alla classificazione delle posizioni yoga trattato nella prossima sezione.

Classificazione dei dati di immagine con BigQuery ML

La capacità di elaborare e analizzare le immagini utilizzando query strutturate come se fossero dati strutturati è la prima nel suo genere. Ora possiamo anche prevedere i risultati utilizzando modelli di classificazione del machine learning utilizzando BigQuery ML. Per una facile comprensione, ho ristretto le fasi coinvolte in 5 passaggi:

fe97945bce996e1.jpeg

I passaggi precedenti potrebbero essere complicati se li consideriamo semplicemente 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 relativa all'implementazione. Ti invitiamo quindi a non scoraggiarti se non conosci ancora questi termini.

Cosa creerai

Creerai un modello di classificazione dei dati di immagine con BQML che copre quanto segue:

  • Un set di dati BigQuery per contenere i componenti della tabella e del modello
  • Bucket Google Cloud Storage (GCS) in cui archiviare le immagini di yoga per il modello
  • Una tabella esterna per accedere alle immagini di Cloud Storage
  • Una connessione BigLake per consentire alla tabella esterna di accedere alle immagini in GCS
  • Modello ResNet in BigQuery ML
  • Inferenza mediante il modello creato
  • BigQuery SQL per l'analisi dei dati immagine
  • SQL di BigQuery per eseguire query sui dati strutturati e non strutturati insieme

Obiettivi didattici

  • Creare un bucket Cloud Storage e archiviare le immagini
  • Come creare un set di dati, una tabella e una connessione BigQuery
  • Creare un modello di classificazione dei dati immagine utilizzando BQML
  • Come fare previsioni con il modello creato utilizzando BigQuery ML
  • Come eseguire query sulle immagini e combinarle con dati strutturati utilizzando SQL di BigQuery

2. Requisiti

  • Un browser, ad esempio Chrome o Firefox
  • Un progetto Google Cloud con fatturazione abilitata che contiene i tuoi servizi BigQuery, Cloud Storage e BigLake Connection
  • La sezione successiva contiene l'elenco dei passaggi per creare l'applicazione di classificazione dei dati delle immagini

3. crea un set di dati e una connessione BigLake

Per il nostro caso d'uso del rilevamento di immagini di 5 posizioni di yoga, ho utilizzato un set di dati disponibile pubblicamente e puoi accedere al set di dati da questo repository. Le posizioni di yoga che identifichiamo sono limitate a Downdog, Dea, Plank, Albero e Guerriero2. Prima di iniziare la creazione del set di dati BigQuery, assicurati di selezionare o creare un progetto Google Cloud e verifica che la fatturazione sia abilitata per il 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 sotto:

Vai all'editor di BigQuery e digita il comando:

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

b. BigLake Connection ci consente di connettere l'origine dati esterna mantenendo un controllo dell'accesso e una sicurezza granulari di BigQuery, che nel nostro caso è Cloud Storage per i dati immagine. Utilizzeremo questa connessione per leggere oggetti da Cloud Storage. Segui questi passaggi per creare la connessione BigLake.

Fai clic su AGGIUNGI DATI nel riquadro Explorer della pagina BigQuery:

4cb42b1245bb0ba6.png"Aggiungi dati esterni" di BigQuery schermata

Fai clic su Connessioni a origini dati esterne e seleziona l'opzione BigLake e Funzioni remote:

9ffec2b2bfcc3cd5.pngConfigura la connessione dell'origine dati esterna

Fornisci l'ID connessione e crea la connessione. Annota l'ID dell'account di servizio che verrà visualizzato sullo schermo una volta creata la connessione <<SERVICE_ACCOUNT>>. Nel nostro esempio, l'ID connessione è "yoga-pose-conn". Ricordati di annotare la regione.

4. Crea un bucket Google Cloud Storage e concedi le autorizzazioni

Utilizzeremo il bucket Google Cloud Storage per contenere i file immagine delle posizioni yoga su cui vogliamo creare il modello. I bucket sono container di Cloud Storage che contengono le immagini che analizzeremo.

a. Vai a Google Cloud Storage cercandolo nella console, quindi fai clic su Bucket per accedere alla home page Bucket, quindi fai clic su CREA

a6f6b26cffb53ae0.pngPagina dei bucket Google Cloud Storage

b. Nella pagina Crea un bucket, inserisci le informazioni sul bucket (un nome univoco) e continua, assicurati che si trovi nella stessa regione del set di dati e della connessione discussa nei passaggi precedenti, quindi fai clic su Crea

1280366a42b7bdf6.pngCrea una pagina bucket di Google Cloud Storage

Prima di andare al passaggio successivo, assicurati di aver preso nota dell'account di servizio, del nome del bucket e del percorso.

c. Una volta creato il bucket, archivia le immagini (tramite i comandi della console o Cloud Shell o in modo programmatico) e concedi le autorizzazioni necessarie all'account di servizio della connessione (che abbiamo salvato in precedenza) per accedere alle immagini

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

5. Crea una tabella oggetto

Creando una tabella di oggetti esterni da BigQuery per accedere ai dati non strutturati nel bucket usando la connessione che abbiamo creato. Esegui il comando CREA SQL dall'editor BigQuery di seguito:

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:

bda48f566e0c292f.png

Eseguiamo rapidamente una query sulla 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 operare su immagini non strutturate come se fossero dati strutturati:

7d1784122b5013f.png

Ora esportiamo il risultato della query riportato sopra in un piccolo snippet Python per visualizzare il risultato:

Fai clic su SALVA RISULTATI e seleziona "CSV Localfile" per esportare il risultato. Quindi apri il blocco note di Colab (o creane uno) e digita il codice qui sotto

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 vedere il risultato come segue:

b8edd68cb281786a.png

Ora che abbiamo creato la tabella esterna e abbiamo eseguito l'accesso alle immagini da Cloud Storage solo utilizzando query SQL, passiamo alla prossima sezione, 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 (logit).

Prima di procedere con questo passaggio, assicurati di disporre di tutte le autorizzazioni necessarie. Quindi, segui questi passaggi:

  1. Scarica il modello da questa località e salvalo nella tua località
  2. Dovrebbe decomprimere il file in saved_model.pb e nella cartella variables.
  3. Carica questi due elementi (il file e la cartella) nel bucket creato nella sezione precedente.

2629ff3eda214946.pngBucket 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 qui sopra.

7. carica il modello in BQML e deduci

In questo passaggio caricheremo il modello nello stesso set di dati BigQuery della tabella esterna creata in precedenza e lo applichiamo alle immagini archiviate in Cloud Storage.

a. Dall'Editor BigQuery, esegui la seguente istruzione SQL

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

Al termine dell'esecuzione (che potrebbe richiedere del tempo a seconda del set di dati), il modello verrà elencato nella sezione Set di dati di BigQuery.

435fa0919aeb57a6.pngSet di dati BigQuery che elenca il modello creato

b. Esamina il modello per visualizzarne i campi di input e output.

Espandi il set di dati e fai clic sul modello "yoga_poses_resnet" che abbiamo appena creato. Fai clic sulla scheda Schema:

e88928764f10f6ff.pngScheda dello schema di definizione del modello BigQuery

Nella sezione Etichette, vedrai "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. Farai riferimento a "input_1" nella query di inferenza (o nella query di previsione) come campo che stai passando per il "test" e i dati di Google Cloud.

c. Deduci la tua posizione yoga!

Utilizziamo il modello appena creato per classificare i dati dell'immagine di test. Assicurati di avere identificato alcune immagini di test (pose yoga) dal tuo bucket Cloud Storage che sono state inserite nella tabella esterna al momento della creazione. Eseguiremo query selettive per le immagini di test in BigQuery per eseguire l'inferenza utilizzando il modello BQML che abbiamo 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, viene selezionata un'immagine di test che contiene un valore URI specifico (00000097.jpg) nella tabella esterna. Inoltre, la parte SELECT utilizza il costrutto ML.DECODE_IMAGE come campo "input_1" per far funzionare la funzione ML.PREDICT.

Una volta completata l'esecuzione, vedrai il risultato come mostrato di seguito:

867018993845e943.png

Chi conosce in dettaglio il modello ResNet dovrebbe aiutare a capire la classificazione. Altrimenti, codifichiamo un piccolo snippet per comprendere visivamente la classificazione.

d. Appiattimento del risultato

Un modo per visualizzare l'output riportato sopra è unire i valori del campo activation_49 utilizzando il costrutto UNNEST di BigQuery SQL. Fai riferimento alla query di seguito per suddividere il risultato del passaggio precedente. Se desideri applicare ulteriori etichette testuali alla classe risultante, puoi introdurre la logica al posto del segnaposto <<LABEL_LOGIC>> nella query (rimuovi il commento 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 per la query:

71f580f41f0811f3.png

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

1c6df6ecd14fba1.png

Puoi approfondire l'argomento del modello e applicare la logica più adatta ai tuoi dati e all'output del modello.

e. Visualizzazione dell'inferenza

Infine, un breve snippet Python per visualizzare il risultato della classificazione. Esporta il risultato della query precedente in un file CSV e fai riferimento a quest'ultimo nel codice Python.

68756e7e4b8d7a29.png

L'output dell'immagine sopra si riferisce alla posizione yoga "downward Dog" che è esattamente lo stesso input di test che abbiamo passato alla query ML.PREDICT per la classificazione utilizzando BQML.

8. Unificazione dei dati strutturati e non strutturati

Infine, la parte che preferisco di questa implementazione è unificare i campi della tabella relazionale strutturata con questi dati immagine non strutturati. Ho creato una tabella BigQuery strutturata nello stesso set di dati della tabella esterna per conservare la posa e i relativi dati relativi all'integrità.

125bdf848c86fbe.pngTabella strutturata BigQuery "yoga_health" Schema

L'immagine sopra rappresenta lo schema della tabella di dati strutturati denominata "yoga_health" e i campi sono posa, concentrazione, beneficio della salute e respiro. La seguente query unisce i 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:

469bdfcffa9e19fd.png

Nota: tutte le query che abbiamo trattato in questo blog possono essere eseguite direttamente dal tuo blocco note 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.

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse
  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID progetto, quindi fai clic su Arresta per eliminare il progetto

10. Complimenti

Complimenti! Hai archiviato ed eseguito query su dati non strutturati in BigQuery, hai creato un modello di classificazione utilizzando BQML e hai previsto le posizioni di yoga di prova con il modello. Se vuoi implementarla, inizia a utilizzare il tuo progetto Google Cloud. Inoltre, se vuoi saperne di più sui database o su altre implementazioni end-to-end di applicazioni in Google Cloud, visita i miei blog.