1. Einführung
In diesem Codelab wird der Anwendungsfall des Speicherns und Analysierens von Bildern von Yoga-Posen in BigQuery und der Implementierung eines Klassifizierungsmodells mit BigQuery ML behandelt, um die Posen nur mit SQL-Konstrukten und ohne andere Codeformen zu kennzeichnen.
BigQuery und BQML
BigQuery ist ein serverloses Multi-Cloud-Data Warehouse, das von Byte bis Petabyte skaliert werden kann, ohne dass ein Betriebsaufwand entsteht. Daher ist es eine gute Wahl für das Speichern von ML-Trainingsdaten. Außerdem können Sie mit den integrierten BigQuery Machine Learning- (BQML) und Analysefunktionen Vorhersagen ohne Code nur mit SQL-Abfragen erstellen. Mit föderierten Abfragen können Sie auf Daten aus externen Quellen zugreifen, sodass keine komplizierten ETL-Pipelines erforderlich sind. Weitere Informationen zu BigQuery finden Sie auf der BigQuery- Seite.
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 alle Analysen und ML auch für unstrukturierte Daten auszuführen.
- Wir können SQL-Abfragen verwenden, um aussagekräftige Analysen, Analysen und ML für Bilder, Videos, Audio usw. in großem 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 der Klassifizierung von Yoga-Posen behandelt.
Klassifizierung von Bilddaten mit BigQuery ML
Die Möglichkeit, Bilder mit strukturierten Abfragen so zu verarbeiten und zu analysieren, als wären sie strukturierte Daten, ist einzigartig. Jetzt können wir mit BigQuery ML sogar Ergebnisse mit Klassifizierungsmodellen für maschinelles Lernen vorhersagen. Ich habe die Phasen zur besseren Verständlichkeit auf 5 Schritte reduziert:

Die oben genannten Schritte können kompliziert sein, wenn wir sie nur als Labels betrachten. Die Details der einzelnen Komponenten wie BigQuery-Dataset, BigLake-Verbindung, Cloud Storage-Buckets (Container), Objekttabelle (externe Datenquelle), BQML usw. sind alle im Implementierungsabschnitt definiert. Lassen Sie sich also nicht entmutigen, wenn Sie mit diesen Begriffen noch nicht vertraut sind.
Aufgaben
Sie erstellen ein Modell zur Klassifizierung von Bilddaten mit BQML, das Folgendes umfasst:
- Ein BigQuery-Dataset mit den Tabellen- und Modellkomponenten
- Google Cloud Storage-Bucket (GCS-Bucket) zum Speichern von Yoga-Bildern für das Modell
- Eine externe Tabelle für den Zugriff auf Cloud Storage-Bilder
- Eine BigLake-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
- Modell zur Klassifizierung von Bilddaten mit BQML erstellen
- Vorhersagen mit dem erstellten Modell mit BigQuery ML
- Bilder abfragen und mit strukturierten Daten mit BigQuery-SQL kombinieren
2. Voraussetzungen
3. Dataset und BigLake-Verbindung erstellen
Für unseren Anwendungsfall der Bilderkennung von 5 Yoga-Posen habe ich ein öffentlich verfügbares Dataset verwendet. Sie können über dieses Repository auf das Dataset zugreifen. Die Yoga-Posen, die wir identifizieren, sind auf „Herabschauender Hund“, „Göttin“, „Planke“, „Baum“ und „Krieger II“ beschränkt. Bevor Sie mit der Erstellung des BigQuery-Datasets beginnen, wählen Sie ein Google Cloud-Projekt aus oder erstellen Sie eines und prüfen Sie, 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 müssen 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 folgenden Befehl ein:
CREATE SCHEMA `<<project_id>>.yoga_set`;
b. Mit der BigLake-Verbindung 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 BigLake-Verbindung zu erstellen.
Klicken Sie im Explorer-Bereich 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 „BigLake und Remotefunktionen“ 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 erstellt wurde: <<SERVICE_ACCOUNT>>. In unserem Beispiel lautet die Verbindungs-ID „yoga-pose-conn“. Notieren Sie sich die Region.
4. Google Cloud Storage-Bucket erstellen und Berechtigungen erteilen
Wir verwenden einen Google Cloud Storage-Bucket, der die Bilddateien der Yoga-Posen enthält, für die wir das Modell erstellen möchten. Buckets sind Cloud Storage-Container, die die Bilder enthalten, die wir analysieren möchten.
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“.
Google Cloud Storage-Seite „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 Verbindung befindet, die in den obigen Schritten beschrieben wurden, und klicken Sie auf „Erstellen“.
Google Cloud Storage-Seite „Bucket erstellen“
Bevor Sie mit dem nächsten Schritt fortfahren, notieren Sie sich Ihr Dienstkonto, den Bucket-Namen und den Pfad.
c. Sobald der Bucket erstellt wurde, speichern Sie Ihre Bilder (über die Console, Cloud Shell-Befehle oder programmatisch) und erteilen Sie die erforderlichen Berechtigungen für das Dienstkonto der Verbindung (das wir zuvor gespeichert haben), um auf die Bilder zuzugreifen.
> export sa=<<"SERVICE_ACCOUNT">>
> gsutil iam ch serviceAccount:$sa:objectViewer "gs://<<bucket>>"
5. Objekttabelle erstellen
Erstellen Sie eine externe Objekttabelle aus BigQuery, um mit der erstellten Verbindung auf die unstrukturierten Daten im Bucket zuzugreifen. Führen Sie im BigQuery-Editor die folgende CREATE-SQL-Anweisung 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:

Fragen wir 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 so erstellen und bearbeiten, als wären sie strukturierte Daten:

Exportieren wir nun das Abfrageergebnis aus dem obigen Beispiel in ein kleines Python-Snippet, um das Ergebnis zu visualisieren:
Klicken Sie auf „ERGEBNISSE SPEICHERN“ und wählen Sie die Option „CSV-Datei (lokal)“ 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 folgende Ergebnis zu sehen:

Nachdem wir die externe Tabelle erstellt und nur mit SQL-Abfragen auf Bilder aus Cloud Storage zugegriffen haben, fahren wir mit dem nächsten Abschnitt fort, in dem das Klassifizierungsmodell erstellt wird.
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, prüfen Sie, ob alle erforderlichen Berechtigungen vorhanden sind. Führen Sie dann die folgenden Schritte aus:
- Laden Sie das Modell von diesem Speicherort herunter und speichern Sie es lokal.
- Es sollte in „saved_model.pb“ und einen Ordner „variables“ 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 den hochgeladenen ResNet-Modelldateien
Nach Abschluss dieses Schritts sollten sich die modelbezogenen Dateien im selben Bucket wie Ihre Bilder befinden, wie in der Abbildung oben zu sehen.
7. Modell in BQML laden und Inferenz ausführen
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>>/*');
Nach Abschluss der Ausführung (was je nach Dataset einige Zeit 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 „Schema“ der BigQuery-Modelldefinition
Im Abschnitt „Labels“ sehen Sie das Feld „activation_49“, das das Ausgabefeld darstellt. Im Abschnitt „Features“ 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. Yoga-Pose ableiten
Wir verwenden das gerade erstellte Modell, um unsere Testbilddaten zu klassifizieren. Achten Sie darauf, dass einige Testbilder (Yoga-Posen) aus Ihrem Cloud Storage-Bucket identifiziert wurden, die beim Erstellen der externen Tabelle in diese aufgenommen wurden. Wir fragen diese Testbilder selektiv in BigQuery ab, um die Inferenz mit dem gerade erstellten BQML-Modell auszufü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 einen bestimmten 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 sehen Sie das Ergebnis wie unten dargestellt:

Für diejenigen, die das ResNet-Modell genau kennen, sollte dies helfen, die Klassifizierung zu verstehen. Andernfalls können wir ein kleines Code-Snippet erstellen, um die Klassifizierung visuell zu verstehen.
d. Ergebnis vereinfachen
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. In der folgenden Abfrage wird das Ergebnis aus dem vorherigen Schritt vereinfacht. Wenn Sie die resultierende Klasse weiter textuell kennzeichnen möchten, können Sie die Logik anstelle des Platzhalters <<LABEL_LOGIC>> in der Abfrage einfügen (Kommentar entfernen, wenn verwendet).
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 zur Klassenbezeichnung sieht die Ausgabe der Abfrage so aus:

In meinem Fall habe ich jedoch eine Beispiel-Logik angewendet und das Ergebnis sieht so aus:

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

Die obige Bildausgabe bezieht sich auf die Yoga-Pose „Herabschauender Hund“. Das ist genau die gleiche Testeingabe, die wir in die ML.PREDICT-Abfrage zur Klassifizierung mit BQML übergeben haben.
8. Strukturierte und unstrukturierte Daten zusammenführen
Mein Lieblingsteil dieser Implementierung ist das Zusammenführen der Felder aus meiner strukturierten relationalen Tabelle mit diesen unstrukturierten Bilddaten. Ich habe im selben Dataset wie die externe Tabelle eine strukturierte BigQuery-Tabelle erstellt, die die Pose und ihre gesundheitsbezogenen Daten enthält.
Schema der strukturierten BigQuery-Tabelle „yoga_health“
Die Abbildung oben zeigt das Schema der strukturierten Datentabelle „yoga_health“. Die Felder sind „pose“, „focus“, „health_benefit“ und „breath“. Die folgende Abfrage verknüpft sowohl strukturierte als auch unstrukturierte Daten:
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)];
Hier ist das Ergebnis:

Hinweis: Alle in diesem Blog behandelten Abfragen können direkt über Ihr Python-Notebook mit den BigQuery-Magic-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 auf „Löschen“.
- Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf „Beenden“, um das Projekt zu löschen.
10. Glückwunsch
Glückwunsch! Sie haben erfolgreich unstrukturierte Daten in BigQuery gespeichert und abgefragt, ein Klassifizierungsmodell mit BQML erstellt und Test-Yoga-Posen mit dem Modell vorhergesagt. Wenn Sie dies implementieren möchten, beginnen Sie mit Ihrem Google Cloud-Projekt. Wenn Sie mehr über Datenbanken oder andere End-to-End-Anwendungsimplementierungen in Google Cloud erfahren möchten, lesen Sie meine Blogs.