Inferenz für Bildobjekttabellen ausführen
In diesem Dokument wird beschrieben, wie Sie mit BigQuery ML Inferenz für Bild-Objekttabellen ausführen.
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:
- Ein TensorFlow- oder TensorFlow Lite-Modell im SavedModel-Format.
- Ein PyTorch-Modell im ONNX-Format
Das Modell muss den unter Unterstützte Eingaben beschriebenen Anforderungen und Einschränkungen entsprechen.
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 Datentyptf.uint8
mit Werten in[0, 255)
haben. - Er muss die Form
[batch_size, weight, height, 3]
haben, wobei gilt:batch_size
muss-1
,None
oder1
sein.width
undheight
müssen größer als 0 sein.
- Er muss den Datentyp
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:
- ResNet 50. Informationen zur Verwendung dieses Modells finden Sie unter Anleitung: Inferenz für eine Objekttabelle mithilfe eines Klassifizierungsmodells ausführen.
- MobileNet V3: Informationen zur Verwendung dieses Modells finden Sie in der Anleitung: Inferenz für eine Objekttabelle mithilfe eines Featurevektormodells ausführen.
Erforderliche Berechtigungen
- Zum Hochladen des Modells in Cloud Storage benötigen Sie die Berechtigungen
storage.objects.create
undstorage.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 Objekttabellebigquery.models.getData
für das Modellbigquery.jobs.create
Hinweis
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery and BigQuery Connection API APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery and BigQuery Connection API APIs.
Modell in Cloud Storage hochladen
So laden Sie ein Modell hoch:
- 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 einenvariables
-Ordner für das Modell erhalten. - Erstellen Sie bei Bedarf einen Cloud Storage-Bucket.
- 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
: 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-ModellONNX
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:
Rufen Sie die Seite BigQuery auf.
Maximieren Sie im Bereich Explorer Ihr Projekt, maximieren Sie das Dataset, das das Modell enthält, und maximieren Sie dann den Knoten Modelle.
Klicken Sie auf das Modell .
Klicken Sie im angezeigten Modellbereich auf den Tab Schema.
Sehen Sie sich den Abschnitt Labels an. Dieser gibt die Felder an, die vom Modell ausgegeben werden.
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 FunktionML.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:
- Die
ML.CONVERT_COLOR_SPACE
-Funktion konvertiert Bilder mit einemRGB
-Farbraum in einen anderen Farbraum. - Die
ML.CONVERT_IMAGE_TYPE
-Funktion konvertiert die von derML.DECODE_IMAGE
-Funktion ausgegebenen Pixelwerte von Gleitkommazahlen in Ganzzahlen mit einem Bereich. von[0, 255)
. - Die
ML.RESIZE_IMAGE
-Funktion passt die Größe von Bildern an.
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 derML.DECODE_IMAGE
-Funktion oder durch eine Tabellenspalte mit Bilddaten, die vonML.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
- Objekttabellen mithilfe von Remotefunktionen analysieren
- Inferenz für eine Objekttabelle mithilfe eines Featurevektormodells ausführen
- Inferenz für eine Objekttabelle mithilfe eines Klassifizierungsmodells ausführen
- Analyse einer Objekttabelle mithilfe einer Remotefunktion
- Probieren Sie aus, ein Bild mit der Funktion
ML.ANNOTATE_IMAGE
zu annotieren.