Esegui l'inferenza sulle tabelle degli oggetti immagine

Questo documento descrive come utilizzare BigQuery ML per eseguire l'inferenza sulle tabelle di oggetti delle immagini.

Puoi eseguire l'inferenza sui dati delle immagini utilizzando una tabella di oggetti come input per la funzione ML.PREDICT.

Per farlo, devi prima scegliere un modello appropriato, caricarlo su Cloud Storage e importarlo in BigQuery eseguendo l'istruzione CREATE MODEL. Puoi creare il tuo modello o scaricarne uno da TensorFlow Hub.

Limitazioni

  • L'utilizzo di modelli importati di BigQuery ML con tabelle di oggetti è supportato solo se utilizzi i prezzi basati sulla capacità tramite le prenotazioni. I prezzi on demand non sono supportati.
  • I file immagine associati alla tabella degli oggetti devono soddisfare i seguenti requisiti:
    • Hanno una dimensione inferiore a 20 MB.
    • Avere un formato JPEG, PNG o BMP.
  • Le dimensioni combinate dei file immagine associati alla tabella degli oggetti devono essere inferiori a 1 TB.
  • Il modello deve essere uno dei seguenti:

  • Il modello deve soddisfare i requisiti e le limitazioni di input descritti nell'istruzione CREATE MODEL per l'importazione dei modelli TensorFlow.

  • Le dimensioni del modello serializzato devono essere inferiori a 450 MB.

  • Le dimensioni del modello deserializzato (in memoria) devono essere inferiori a 1000 MB.

  • Il tensore di input del modello deve soddisfare i seguenti criteri:

    • Avere un tipo di dati tf.float32 con valori in [0, 1) o avere un tipo di dati tf.uint8 con valori in [0, 255).
    • Avere la forma [batch_size, weight, height, 3], dove:
      • batch_size deve essere -1, None o 1.
      • width e height devono essere maggiori di 0.
  • Il modello deve essere addestrato con immagini in uno dei seguenti spazi di colore:

    • RGB
    • HSV
    • YIQ
    • YUV
    • GRAYSCALE

    Puoi utilizzare la funzione ML.CONVERT_COLOR_SPACE per convertire le immagini di input nello spazio di colore con cui è stato addestrato il modello.

Modelli di esempio

I seguenti modelli su TensorFlow Hub funzionano con BigQuery ML e le tabelle di oggetti immagine:

Autorizzazioni obbligatorie

  • Per caricare il modello su Cloud Storage, devi disporre delle autorizzazioni storage.objects.create e storage.objects.get.
  • Per caricare il modello in BigQuery ML, sono necessarie le seguenti autorizzazioni:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • Per eseguire l'inferenza, devi disporre delle seguenti autorizzazioni:

    • bigquery.tables.getData nella tabella degli oggetti
    • bigquery.models.getData sul modello
    • bigquery.jobs.create

Prima di iniziare

  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

Carica un modello su Cloud Storage

Per caricare un modello:

  1. Se hai creato un tuo modello, salvalo localmente. Se utilizzi un modello di TensorFlow Hub, scaricalo sulla tua macchina locale. Se utilizzi TensorFlow, dovresti ottenere un file saved_model.pb e una cartella variables per il modello.
  2. Se necessario, crea un bucket Cloud Storage.
  3. Carica gli elementi del modello nel bucket.

Carica il modello in BigQuery ML

Il caricamento di un modello che funziona con le tabelle di oggetti immagine è uguale al caricamento di un modello che funziona con i dati strutturati. Per caricare un modello in BigQuery ML:

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

Sostituisci quanto segue:

  • PROJECT_ID: il tuo ID progetto.
  • DATASET_ID: l'ID del set di dati che deve contenere il modello.
  • MODEL_NAME: il nome del modello.
  • MODEL_TYPE: utilizza uno dei seguenti valori:
    • TENSORFLOW per un modello TensorFlow
    • ONNX per un modello PyTorch in formato ONNX
  • BUCKET_PATH: il percorso del bucket Cloud Storage contenente il modello, nel formato [gs://bucket_name/[folder_name/]*].

L'esempio seguente utilizza il progetto predefinito e carica un modello TensorFlow in BigQuery ML come my_vision_model, utilizzando il file saved_model.pb e la cartella variables da 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/*');

Ispeziona il modello

Puoi esaminare il modello caricato per vedere quali sono i suoi campi di input e output. Devi fare riferimento a questi campi quando esegui l'inferenza sulla tabella degli oggetti.

Per ispezionare un modello:

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel riquadro Explorer, espandi il progetto, il set di dati che contiene il modello e il nodo Modelli.

  3. Fai clic sul modello.

  4. Nel riquadro del modello che si apre, fai clic sulla scheda Schema.

  5. Guarda la sezione Etichette. Identifica i campi generati dal modello.

  6. Consulta la sezione Funzionalità. Identifica i campi che devono essere inseriti nel modello. Devi fare riferimento a queste variabili nell'istruzione SELECT per la funzione ML.DECODE_IMAGE.

Per un'ispezione più dettagliata di un modello TensorFlow, ad esempio per determinare la forma dell'input del modello, installa TensorFlow e utilizza il comando saved_model_cli show.

Eseguire la pre-elaborazione delle immagini

Devi utilizzare la funzione ML.DECODE_IMAGE per convertire i byte dell'immagine in una rappresentazione ARRAY multi-dimensionale. Puoi utilizzare l'output di ML.DECODE_IMAGE direttamente in una funzione ML.PREDICT, oppure puoi scrivere i risultati di ML.DECODE_IMAGE in una colonna della tabella e fare riferimento a quella colonna quando chiami ML.PREDICT.

L'esempio seguente scrive l'output della funzione ML.DECODE_IMAGE in una tabella:

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

Utilizza le seguenti funzioni per elaborare ulteriormente le immagini in modo che funzionino con il tuo modello:

Puoi utilizzarli all'interno della funzione ML.PREDICT o eseguirli su una colonna della tabella contenente i dati immagine generati da ML.DECODE_IMAGE.

Esegui l'inferenza

Dopo aver caricato un modello appropriato e, facoltativamente, pre-elaborato i dati delle immagini, puoi eseguire l'inferenza sui dati delle immagini.

Per eseguire l'inferenza:

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)
);

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto che contiene la tabella del modello e degli oggetti.
  • DATASET_ID: l'ID del set di dati che contiene il modello e la tabella degli oggetti.
  • MODEL_NAME: il nome del modello.
  • IMAGE_DATA: i dati dell'immagine, rappresentati dall'output della funzione ML.DECODE_IMAGE o da una colonna della tabella contenente i dati dell'immagine generati da ML.DECODE_IMAGE o da altre funzioni di elaborazione delle immagini.
  • MODEL_INPUT: il nome di un campo di input per il modello.Puoi trovare queste informazioni ispezzionando il modello e controllando i nomi dei campi nella sezione Funzionalità.
  • TABLE_NAME: il nome della tabella degli oggetti.

Esempi

Esempio 1

L'esempio seguente utilizza la funzione ML.DECODE_IMAGE direttamente nella funzione ML.PREDICT. Restituisce i risultati dell'inferenza per tutte le immagini nella tabella degli oggetti, per un modello con un campo di input input e un campo di 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`)
);

Esempio 2

L'esempio seguente utilizza la funzione ML.DECODE_IMAGE direttamente nella funzione ML.PREDICT e la funzione ML.CONVERT_COLOR_SPACE nella funzione ML.PREDICT per convertire lo spazio colore dell'immagine da RBG a YIQ. Inoltre, mostra come utilizzare i campi della tabella degli oggetti per filtrare gli oggetti inclusi nell'inferenza. Restituisce i risultati dell'inferenza per tutte le immagini JPG nella tabella degli oggetti, per un modello con un campo di input input e un campo di 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')
  );

Esempio 3

L'esempio seguente utilizza i risultati di ML.DECODE_IMAGE che sono stati scritti in una colonna di una tabella, ma non sono stati ulteriormente elaborati. Utilizza ML.RESIZE_IMAGE e ML.CONVERT_IMAGE_TYPE nella funzione ML.PREDICT per elaborare i dati delle immagini. Restituisce i risultati dell'inferenza per tutte le immagini nella tabella delle immagini decodificate, per un modello con un campo di input input e un campo di output feature.

Crea la tabella delle immagini decodificate:

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

Esegui l'inferenza sulla tabella delle immagini decodificate:

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`)
);

Esempio 4

L'esempio seguente utilizza i risultati di ML.DECODE_IMAGE che sono stati scritti in una colonna di una tabella e pre-elaborati utilizzando ML.RESIZE_IMAGE. Restituisce i risultati dell'inferenza per tutte le immagini nella tabella delle immagini decodificate, per un modello con un campo di input input e un campo di output feature.

Crea la tabella:

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`);

Esegui l'inferenza sulla tabella delle immagini decodificate:

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

Esempio 5

L'esempio seguente utilizza la funzione ML.DECODE_IMAGE direttamente nella funzione ML.PREDICT. In questo esempio, il modello ha un campo di output di embeddings e due campi di input: uno che prevede un'immagine, f_img, e uno che prevede una stringa, f_txt. L'input di immagini proviene dalla tabella degli oggetti e l'input di stringhe proviene da una tabella BigQuery standard unita alla tabella degli oggetti utilizzando la colonna 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)
  );

Passaggi successivi