1. Einführung
In diesem Codelab wird der Anwendungsfall des Speicherns und Analysierens von Bildern von Yoga-Posen in BigQuery behandelt. Außerdem wird ein Klassifizierungsmodell mit BigQuery ML implementiert, um die Posen nur mit SQL-Konstrukten und ohne andere Codeform zu labeln.
BigQuery und BQML
BigQuery ist ein serverloses Multi-Cloud-Data Warehouse, das ohne operativen Aufwand von Byte auf Petabyte skaliert werden kann. Daher ist es eine gute Wahl zum Speichern von ML-Trainingsdaten. Außerdem können Sie mit den integrierten Funktionen für BigQuery Machine Learning ( BQML) und Analysen Vorhersagen ohne Code erstellen, indem Sie nur SQL-Abfragen verwenden. Außerdem können Sie mit föderierten Abfragen auf Daten aus externen Quellen zugreifen, sodass keine komplizierten ETL-Pipelines erforderlich sind. Weitere Informationen zu BigQuery
Bisher kennen wir BigQuery als vollständig verwaltetes Cloud-Data-Warehouse, mit dem Nutzer strukturierte und semistrukturierte Daten analysieren können. Aber
- BigQuery wurde erweitert, um auch Analysen und ML für unstrukturierte Daten durchzuführen.
- Wir können SQL-Abfragen verwenden, um aussagekräftige Analysen, Analytics und ML für Bilder, Videos, Audio usw. im großen Maßstab durchzuführen, ohne zusätzlichen Code schreiben zu müssen.
- Wir können strukturierte und unstrukturierte Daten so kombinieren, als wären sie alle in einer Tabelle vorhanden.
Diese werden im nächsten Abschnitt im Anwendungsfall zur Klassifizierung von Yoga-Posen behandelt.
Klassifizierung von Bilddaten mit BigQuery ML
Die Möglichkeit, Bilder mithilfe strukturierter Abfragen so zu verarbeiten und zu analysieren, als wären sie strukturierte Daten, ist einzigartig. Mit BigQuery ML können wir jetzt sogar Ergebnisse mit Machine-Learning-Klassifizierungsmodellen vorhersagen. Ich habe die einzelnen Phasen in fünf Schritte unterteilt, um sie besser verständlich zu machen:

Die oben genannten Schritte können kompliziert sein, wenn wir sie nur als Labels betrachten. Die Details der einzelnen Komponenten wie BigQuery-Dataset, Lakehouse for Apache Iceberg-Verbindung, Cloud Storage-Buckets (Container), Objekttabelle (externe Datenquelle) und BQML werden alle im Implementierungsabschnitt definiert. Lassen Sie sich also nicht entmutigen, wenn Sie mit diesen Begriffen noch nicht vertraut sind.
Aufgaben
Sie erstellen mit BQML ein Modell zur Klassifizierung von Bilddaten, das die folgenden Aspekte abdeckt:
- Ein BigQuery-Dataset, das die Tabellen- und Modellkomponenten enthält
- Google Cloud Storage-Bucket (GCS) zum Speichern von Yoga-Bildern für das Modell
- Externe Tabelle für den Zugriff auf Cloud Storage-Bilder
- Eine Lakehouse-Verbindung für die externe Tabelle, um auf die Bilder in GCS zuzugreifen
- ResNet-Modell in BigQuery ML
- Inferenz mit dem erstellten Modell
- BigQuery SQL zum Analysieren von Bilddaten
- BigQuery-SQL zum gemeinsamen Abfragen der strukturierten und unstrukturierten Daten
Lerninhalte
- Cloud Storage-Bucket erstellen und Bilder speichern
- BigQuery-Dataset, ‑Tabelle und ‑Verbindung erstellen
- Klassifizierungsmodell für Bilddaten mit BQML erstellen
- Vorhersagen mit dem erstellten Modell mit BigQuery ML treffen
- Bilder abfragen und mit strukturierten Daten kombinieren – BigQuery-SQL
2. Voraussetzungen
3. Dataset und Lakehouse-Verbindung erstellen
Für unseren Anwendungsfall der Bilderkennung von fünf Yoga-Posen habe ich ein öffentlich verfügbares Dataset verwendet, auf das Sie über dieses Repository zugreifen können. Die Yoga-Posen, die wir erkennen, sind auf den herabschauenden Hund, die Göttin, das Brett, den Baum und den Krieger 2 begrenzt. Bevor Sie mit dem Erstellen des BigQuery-Datasets beginnen, müssen Sie ein Google Cloud-Projekt auswählen oder erstellen und prüfen, ob die Abrechnung für das Projekt aktiviert ist. Aktivieren Sie die BigQuery API und die BigQuery Connection API. Alle in dieser Implementierung verwendeten Dienste sollten sich in derselben Region befinden.
a. Erstellen Sie das Dataset „yoga_set“ mit den folgenden Schritten:
Rufen Sie den BigQuery-Editor auf und geben Sie den Befehl ein:
CREATE SCHEMA `<<project_id>>.yoga_set`;
b. Mit Lakehouse-Verbindungen können wir die externe Datenquelle verbinden und gleichzeitig eine detaillierte BigQuery-Zugriffssteuerung und Sicherheit beibehalten. In unserem Fall ist das Cloud Storage für die Bilddaten. Wir verwenden diese Verbindung, um Objekte aus Cloud Storage zu lesen. Führen Sie die folgenden Schritte aus, um die Lakehouse-Verbindung zu erstellen.
Klicken Sie im Bereich „Explorer“ auf der BigQuery-Seite auf „DATEN HINZUFÜGEN“:
BigQuery-Bildschirm „Externe Daten hinzufügen“
Klicken Sie auf Verbindungen zu externen Datenquellen und wählen Sie die Option „Lakehouse und Remote-Funktionen“ aus:
Verbindung zur externen Datenquelle konfigurieren
Geben Sie die Verbindungs-ID an und erstellen Sie die Verbindung. Notieren Sie sich die Dienstkonto-ID, die auf dem Bildschirm angezeigt wird, sobald die Verbindung hergestellt wurde: <<SERVICE_ACCOUNT>>. In unserem Beispiel lautet die Verbindungs-ID „yoga-pose-conn“. Denken Sie daran, die Region anzugeben.
4. Google Cloud Storage-Bucket erstellen und Berechtigungen erteilen
Wir verwenden einen Google Cloud Storage-Bucket, um die Bilddateien der Yogaposen zu speichern, für die wir das Modell erstellen möchten. Buckets sind Cloud Storage-Container, in denen die zu analysierenden Bilder gespeichert werden.
a. Rufen Sie Google Cloud Storage auf, indem Sie in der Console danach suchen. Klicken Sie dann auf „Buckets“, um zur Startseite „Buckets“ zu gelangen, und klicken Sie auf „ERSTELLEN“.
Seite „Google Cloud Storage-Buckets“
b. Geben Sie auf der Seite „Bucket erstellen“ die Bucket-Informationen (einen eindeutigen Namen) ein und fahren Sie fort. Achten Sie darauf, dass sich der Bucket in derselben Region wie das Dataset und die in den obigen Schritten beschriebene Verbindung befindet, und klicken Sie auf „Erstellen“.
Google Cloud Storage-Seite zum Erstellen eines Buckets
Bevor Sie mit dem nächsten Schritt fortfahren, notieren Sie sich Ihr Dienstkonto, den Bucket-Namen und den Pfad.
c. Nachdem Sie den Bucket erstellt haben, speichern Sie Ihre Bilder (über die Console, Cloud Shell-Befehle oder programmatisch) und erteilen Sie dem Dienstkonto der Verbindung (das wir zuvor gespeichert haben) die erforderlichen Berechtigungen für den Zugriff auf die Bilder.
> export sa=<<"SERVICE_ACCOUNT">>
> gsutil iam ch serviceAccount:$sa:objectViewer "gs://<<bucket>>"
5. Objekttabelle erstellen
Erstellen Sie eine externe Objekttabelle in BigQuery, um über die von uns erstellte Verbindung auf die unstrukturierten Daten im Bucket zuzugreifen. Führen Sie den folgenden CREATE-SQL-Code im BigQuery-Editor aus:
CREATE OR REPLACE EXTERNAL TABLE `<<dataset>>.<<table_name>>`
WITH CONNECTION `us.<<connection-name>>`
OPTIONS(
object_metadata="SIMPLE", uris=["gs://<<bucket>>/<<folder_if_exists>>/*.jpg"]);
Die externe Tabelle wird wie unten dargestellt erstellt:

Wir fragen schnell eine Pose aus der neu erstellten externen Tabelle ab:
SELECT data , uri
FROM `yoga_set.yoga_poses`
WHERE REGEXP_CONTAINS(uri, 'gs://yoga_images/Downdog')
Limit 1;
Wie Sie im Screenshot unten sehen, können Sie unstrukturierte Bilder erstellen und bearbeiten, als wären sie strukturierte Daten:

Jetzt exportieren wir das Abfrageergebnis aus dem vorherigen Beispiel in ein kleines Python-Snippet, um das Ergebnis zu visualisieren:
Klicken Sie auf „ERGEBNISSE SPEICHERN“ und wählen Sie die Option „CSV Localfile“ aus, um das Ergebnis zu exportieren. Öffnen Sie dann Ihr Colab-Notebook (oder erstellen Sie eines) und geben Sie den folgenden Code ein.
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)
Führen Sie den Code aus, um das Ergebnis wie unten zu sehen:

Nachdem wir die externe Tabelle erstellt und über SQL-Abfragen auf Bilder in Cloud Storage zugegriffen haben, fahren wir mit dem nächsten Abschnitt fort, in dem wir das Klassifizierungsmodell erstellen.
6. Modell erstellen und in Google Cloud Storage hochladen
Für diese Implementierung verwenden wir das vortrainierte ResNet 50-Modell, um eine Inferenz für die gerade erstellte Objekttabelle auszuführen. Das ResNet 50-Modell analysiert Bilddateien und gibt einen Batch von Vektoren aus, die die Wahrscheinlichkeit darstellen, dass ein Bild zur entsprechenden Klasse gehört (Logits).
Bevor Sie mit diesem Schritt fortfahren, müssen Sie sicherstellen, dass Sie alle erforderlichen Berechtigungen haben. Führen Sie dann die folgenden Schritte aus:
- Laden Sie das Modell von diesem Speicherort herunter und speichern Sie es in Ihrem lokalen
- Es sollte in „saved_model.pb“ und einen Variablenordner entpackt werden.
- Laden Sie diese beiden Elemente (die Datei und den Ordner) in den Bucket hoch, den wir im vorherigen Abschnitt erstellt haben.
Google Cloud Storage-Bucket „yoga_images“ mit hochgeladenen ResNet-Modelldateien
Nach Abschluss dieses Schritts sollten sich die Dateien Ihres Modells im selben Bucket wie Ihre Bilder befinden (siehe Abbildung oben).
7. Modell in BQML laden und ableiten
In diesem Schritt laden wir das Modell in dasselbe BigQuery-Dataset wie die zuvor erstellte externe Tabelle und wenden es auf die in Cloud Storage gespeicherten Bilder an.
a. Führen Sie im BigQuery-Editor die folgende SQL-Anweisung aus:
CREATE MODEL `<<Dataset>>.<<Model_Name>>`
OPTIONS(
model_type = 'TENSORFLOW',
model_path = 'gs://<<Bucket>>/*');
Sobald die Ausführung abgeschlossen ist (was je nach Dataset eine Weile dauern kann), wird das Modell im Bereich „Dataset“ in BigQuery aufgeführt.
BigQuery-Dataset mit dem erstellten Modell
b. Prüfen Sie das Modell, um seine Eingabe- und Ausgabefelder zu ermitteln.
Maximieren Sie das Dataset und klicken Sie auf das gerade erstellte Modell „yoga_poses_resnet“. Klicken Sie auf den Tab „Schema“:
Tab „BigQuery Model Definition Schema“ (BigQuery-Modelldefinitionsschema)
Im Bereich „Labels“ sehen Sie das Feld „activation_49“, das das Ausgabefeld darstellt. Im Bereich „Merkmale“ sehen Sie „input_1“, das das Feld darstellt, das als Eingabe für das Modell erwartet wird. Sie verweisen in Ihrer Inferenzabfrage (oder Vorhersageabfrage) auf „input_1“ als das Feld, das Sie für Ihre Testdaten übergeben.
c. Yogapose ableiten
Wir verwenden das gerade erstellte Modell, um unsere Testbilddaten zu klassifizieren. Achten Sie darauf, dass Sie einige Testbilder (Yogaposen) aus Ihrem Cloud Storage-Bucket haben, die beim Erstellen der externen Tabelle darin enthalten waren. Wir fragen diese Testbilder selektiv in BigQuery ab, um die Inferenz mit dem gerade erstellten BQML-Modell durchzuführen. Verwenden Sie die folgende Abfrage, um den Test auszulösen.
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')));
In der obigen Abfrage wählen wir ein Testbild aus, das in der externen Tabelle den URI-Wert 00000097.jpg enthält. Außerdem wird im SELECT-Teil das Konstrukt ML.DECODE_IMAGE als Feld „input_1“ verwendet, damit die Funktion ML.PREDICT funktioniert.
Nach Abschluss der Ausführung wird das Ergebnis wie unten dargestellt angezeigt:

Für diejenigen, die das ResNet-Modell genau kennen, sollte dies helfen, die Klassifizierung zu verstehen. Andernfalls können wir ein kleines Snippet codieren, um die Klassifizierung visuell zu veranschaulichen.
d. Ergebnis zusammenfassen
Eine Möglichkeit, die obige Ausgabe zu visualisieren, besteht darin, die Werte des Felds „activation_49“ mit dem UNNEST-Konstrukt von BigQuery SQL zu vereinfachen. Die Abfrage zum Reduzieren des Ergebnisses aus dem vorherigen Schritt finden Sie unten. Wenn Sie die resultierende Klasse weiter textuell kennzeichnen möchten, können Sie die Logik anstelle des Platzhalters <<LABEL_LOGIC>> in die Abfrage einfügen (entfernen Sie die Auskommentierung, wenn Sie sie verwenden).
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;
Ohne die Logik für die Klassenlabeling sieht die Ausgabe der Abfrage so aus:

In meinem Fall habe ich jedoch eine Beispiel-Logik angewendet. Das Ergebnis sehen Sie unten:

Weitere Informationen zum Modell und zur Anwendung der Logik, die am besten zu Ihren Daten und der Modellausgabe passt, finden Sie unten.
e. Inferenz visualisieren
Zum Schluss noch ein kurzes Python-Snippet, um das Ergebnis der Klassifizierung zu visualisieren. Exportieren Sie das obige Abfrageergebnis in eine CSV-Datei und verweisen Sie im Python-Code darauf.

Die obige Bildausgabe bezieht sich auf die Yoga-Pose „Herabschauender Hund“, die genau der Testeingabe entspricht, die wir in die ML.PREDICT-Abfrage zur Klassifizierung mit BQML eingegeben haben.
8. Strukturierte und unstrukturierte Daten zusammenführen
Zu guter Letzt habe ich die Felder aus meiner strukturierten relationalen Tabelle mit diesen unstrukturierten Bilddaten zusammengeführt. Dazu habe ich im selben Dataset wie die externe Tabelle eine strukturierte BigQuery-Tabelle erstellt, in der die Pose und die zugehörigen Gesundheitsdaten gespeichert werden.
BigQuery-Schema für strukturierte Tabelle „yoga_health“
Das Bild oben zeigt das Schema der Tabelle mit strukturierten Daten mit dem Namen „yoga_health“. Die Felder sind „pose“, „focus“, „health_benefit“ und „breath“. In der folgenden Abfrage werden sowohl strukturierte als auch unstrukturierte Daten verknüpft:
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)];
Das Ergebnis lautet:

Hinweis:Alle Abfragen, die wir in diesem Blog behandelt haben, können direkt über Ihr Python-Notebook mit den magischen BigQuery-Befehlen ausgeführt werden.
9. Bereinigen
Mit den folgenden Schritten vermeiden Sie, dass Ihrem Google Cloud-Konto die in diesem Beitrag verwendeten Ressourcen in Rechnung gestellt werden:
- Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.
- Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf „Löschen“.
- Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf „Herunterfahren“, um das Projekt zu löschen.
10. Glückwunsch
Glückwunsch! Sie haben erfolgreich unstrukturierte Daten in BigQuery gespeichert und abgefragt, ein Klassifikationsmodell mit BQML erstellt und Test-Yoga-Posen mit dem Modell vorhergesagt. Wenn Sie diese Funktion implementieren möchten, können Sie mit Ihrem Google Cloud-Projekt beginnen. Wenn Sie mehr über Datenbanken oder andere End-to-End-Anwendungsimplementierungen in Google Cloud erfahren möchten, besuchen Sie meinen Blog.