Inferenz für Bildobjekttabellen ausführen

In diesem Dokument wird beschrieben, wie Sie mit BigQuery ML Inferenz für Bild-Objekttabellen ausführen.

Überblick

Sie können die Inferenz für Bilddaten ausführen, indem Sie eine Objekttabelle als Eingabe für die ML.PREDICT-Funktion verwenden.

Dazu müssen Sie zuerst ein geeignetes Modell auswählen, es in Cloud Storage hochladen und es durch Ausführen der Anweisung CREATE MODEL in BigQuery importieren. Sie können entweder ein eigenes Modell erstellen oder ein Modell von TensorFlow Hub herunterladen.

Beschränkungen

  • Die Verwendung von importierten BigQuery ML-Modellen mit Objekttabellen wird nur unterstützt, wenn Sie kapazitätsbasierte Preise über Reservierungen verwenden. On-Demand-Preise werden nicht unterstützt.
  • Die mit der Objekttabelle verknüpften Image-Dateien müssen die folgenden Anforderungen erfüllen:
    • Sie sind kleiner als 20 MB.
    • Sie haben die Formate JPEG, PNG oder BMP.
  • Die Gesamtgröße der Bilddateien, die der Objekttabelle zugeordnet sind, muss kleiner als 1 TB sein.
  • Das Modell muss eines der folgenden sein:

  • Das Modell muss die unter Unterstützte Eingaben beschriebenen Eingabeanforderungen und -einschränkungen erfüllen.

  • Die serialisierte Größe des Modells muss kleiner als 450 MB sein.

  • Die deserialisierte Größe (im Arbeitsspeicher) des Modells muss kleiner als 1.000 MB sein.

  • Der Modelleingabetensor muss die folgenden Kriterien erfüllen:

    • Er muss den Datentyp tf.float32 mit Werten in [0, 1) oder den Datentyp tf.uint8 mit Werten in [0, 255) haben.
    • Er muss die Form [batch_size, weight, height, 3] haben, wobei gilt:
      • batch_size muss -1, None oder 1 sein.
      • width und height müssen größer als 0 sein.
  • Das Modell muss mit Bildern in einem der folgenden Farbräume trainiert werden:

    • RGB
    • HSV
    • YIQ
    • YUV
    • GRAYSCALE

    Mit der Funktion ML.CONVERT_COLOR_SPACE können Sie Eingabebilder in den Farbraum konvertieren, mit dem das Modell trainiert wurde.

Beispielmodelle

Die folgenden Modelle in TensorFlow Hub funktionieren mit BigQuery ML und Bildobjekttabellen:

Erforderliche Berechtigungen

  • Zum Hochladen des Modells in Cloud Storage benötigen Sie die Berechtigungen storage.objects.create und storage.objects.get.
  • Zum Laden des Modells in BigQuery ML benötigen Sie die folgenden Berechtigungen:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • Zum Ausführen von Inferenzen benötigen Sie die folgenden Berechtigungen:

    • bigquery.tables.getData für die Objekttabelle
    • bigquery.models.getData für das Modell
    • bigquery.jobs.create

Hinweis

  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. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  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. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  7. Enable the BigQuery and BigQuery Connection API APIs.

    Enable the APIs

Modell in Cloud Storage hochladen

So laden Sie ein Modell hoch:

  1. Wenn Sie ein eigenes Modell erstellt haben, speichern Sie es lokal. Wenn Sie ein Modell von TensorFlow Hub verwenden, laden Sie es auf Ihren lokalen Computer herunter. Wenn Sie TensorFlow verwenden, sollten Sie eine saved_model.pb-Datei und einen variables-Ordner für das Modell erhalten.
  2. Erstellen Sie bei Bedarf einen Cloud Storage-Bucket.
  3. Laden Sie die Modellartefakte in den Bucket hoch:

Modell in BigQuery ML laden

Das Laden eines Modells, das mit Bildobjekttabellen funktioniert, entspricht dem Laden eines Modells, das mit strukturierten Daten funktioniert. So laden Sie ein Modell in BigQuery ML:

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

Dabei gilt:

  • PROJECT_ID ist Ihre Projekt-ID.
  • DATASET_ID ist die ID des Datasets, das das Modell enthalten soll.
  • MODEL_NAME ist der Name des Modells.
  • MODEL_TYPE: Verwenden Sie einen der folgenden Werte:
    • TENSORFLOW für ein TensorFlow-Modell
    • ONNX für ein PyTorch-Modell im ONNX-Format
  • BUCKET_PATH ist der Pfad zum Cloud Storage-Bucket, der das Modell im Format [gs://bucket_name/[folder_name/]*] enthält.

Im folgenden Beispiel wird das Standardprojekt verwendet und ein TensorFlow-Modell wird als my_vision_model unter Verwendung der Datei saved_model.pb und des Ordners variables aus gs://my_bucket/my_model_folder in BigQuery ML geladen:

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

Modell prüfen

Sie können das hochgeladene Modell prüfen, um zu sehen, welches seine Eingabe- und Ausgabefelder sind. Sie müssen auf diese Felder verweisen, wenn Sie Inferenz für die Objekttabelle ausführen.

So prüfen Sie ein Modell:

  1. Rufen Sie die Seite BigQuery auf.

    BigQuery aufrufen

  2. Maximieren Sie im Bereich Explorer Ihr Projekt, maximieren Sie das Dataset, das das Modell enthält, und maximieren Sie dann den Knoten Modelle.

  3. Klicken Sie auf das Modell .

  4. Klicken Sie im angezeigten Modellbereich auf den Tab Schema.

  5. Sehen Sie sich den Abschnitt Labels an. Dieser gibt die Felder an, die vom Modell ausgegeben werden.

  6. Sehen Sie sich den Abschnitt Features an. Dieser gibt die Felder an, die in das Modell eingegeben werden müssen. Sie verweisen in der SELECT-Anweisung für die Funktion ML.DECODE_IMAGE.

Für eine detailliertere Prüfung eines TensorFlow-Modells, z. B. um die Form der Modelleingabe zu bestimmen, installieren Sie TensorFlow und verwenden den saved_model_cli show-Befehl.

Bilder vorverarbeiten

Mit der Funktion ML.DECODE_IMAGE müssen Sie Bildbyte in eine mehrdimensionale ARRAY-Darstellung konvertieren. Sie können eine ML.DECODE_IMAGE-Ausgabe direkt in einer ML.PREDICT-Funktion verwenden oder Sie schreiben die Ergebnisse von ML.DECODE_IMAGE in eine Tabellenspalte und verweisen auf diese Spalte, wenn Sie ML.PREDICT aufrufen.

Im folgenden Beispiel wird die Ausgabe der ML.DECODE_IMAGE-Funktion in eine Tabelle geschrieben:

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

Verwenden Sie die folgenden Funktionen, um Bilder weiter zu verarbeiten, damit sie mit Ihrem Modell funktionieren:

Sie können diese als Teil der ML.PREDICT-Funktion verwenden oder sie in einer Tabellenspalte ausführen, die von ML.DECODE_IMAGE ausgegebene Bilddaten enthält.

Inferenz ausführen

Sobald Sie ein geeignetes Modell geladen und optional die Bilddaten vorverarbeitet haben, können Sie die Inferenz für die Bilddaten ausführen.

So führen Sie die Inferenz aus:

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

Dabei gilt:

  • PROJECT_ID ist die Projekt-ID des Projekts, das die Modell- und Objekttabelle enthält.
  • DATASET_ID ist die ID des Datasets, das die Modell- und Objekttabelle enthält.
  • MODEL_NAME ist der Name des Modells.
  • IMAGE_DATA: die Bilddaten, dargestellt entweder durch die Ausgabe der ML.DECODE_IMAGE-Funktion oder durch eine Tabellenspalte mit Bilddaten, die von ML.DECODE_IMAGE oder anderen Bildverarbeitungsfunktionen ausgegeben wurden.
  • MODEL_INPUT: der Name eines Eingabefelds für das Modell. Sie finden diese Informationen, indem Sie das Modell prüfen und sich die Feldnamen im Abschnitt Features ansehen.
  • TABLE_NAME ist der Name der Objekttabelle

Beispiele

Beispiel 1

Im folgenden Beispiel wird die ML.DECODE_IMAGE-Funktion direkt in der ML.PREDICT-Funktion verwendet. Es gibt die Inferenzergebnisse für alle Bilder in der Objekttabelle für ein Modell mit dem Eingabefeld input und einem Ausgabefeld feature zurück:

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

Beispiel 2

Im folgenden Beispiel wird die ML.DECODE_IMAGE-Funktion direkt in der ML.PREDICT-Funktion verwendet und die ML.CONVERT_COLOR_SPACE-Funktion in der ML.PREDICT-Funktion, um den Bildfarbraum von RBG zu YIQ zu konvertieren. Es wird darin auch gezeigt, wie mit Objekttabellenfeldern die in der Inferenz enthaltenen Objekte gefiltert werden können. Es gibt die Inferenzergebnisse für alle JPG-Bilder in der Objekttabelle für ein Modell mit dem Eingabefeld input und einem Ausgabefeld feature zurück:

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

Beispiel 3:

Im folgenden Beispiel werden Ergebnisse von ML.DECODE_IMAGE verwendet, die in eine Tabellenspalte geschrieben, aber nicht weiter verarbeitet wurden. Es verwendet ML.RESIZE_IMAGE und ML.CONVERT_IMAGE_TYPE in der ML.PREDICT-Funktion, um die Bilddaten zu verarbeiten. Es gibt die Inferenzergebnisse für alle Bilder in der decodierten Bildtabelle für ein Modell mit dem Eingabefeld input und einem Ausgabefeld feature zurück:

Erstellen Sie die decodierte Bildtabelle:

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

Führen Sie die Inferenz für die decodierte Bildtabelle aus:

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

Beispiel 4

Im folgenden Beispiel werden Ergebnisse von ML.DECODE_IMAGE verwendet, die in eine Tabellenspalte geschrieben und mit ML.RESIZE_IMAGE vorverarbeitet wurden. Es gibt die Inferenzergebnisse für alle Bilder in der decodierten Bildtabelle für ein Modell mit dem Eingabefeld input und einem Ausgabefeld feature zurück:

Erstellen Sie die Tabelle:

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

Führen Sie die Inferenz für die decodierte Bildtabelle aus:

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

Beispiel 5

Im folgenden Beispiel wird die ML.DECODE_IMAGE-Funktion direkt in der ML.PREDICT-Funktion verwendet. In diesem Beispiel hat das Modell ein Ausgabefeld embeddings und zwei Eingabefelder: eines, das ein Bild f_img erwartet, und eines, das einen String f_txt erwartet. Die Bildeingabe stammt aus der Objekttabelle und die Stringeingabe stammt aus einer standardmäßigen BigQuery-Tabelle, die über die Spalte uri mit der Objekttabelle verknüpft wird.

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

Nächste Schritte