Bilddatenklassifizierung mit BigQuery ML

1. Einführung

In diesem Codelab werden wir den Anwendungsfall des Speicherns und Analysierens von Bildern von Yoga-Posen in BigQuery sowie die Implementierung eines Klassifizierungsmodells mit BigQuery ML besprechen, um die Posen nur mit SQL-Konstrukten und ohne anderer Codeform zu beschriften.

BigQuery und BQML

BigQuery ist ein serverloses Multi-Cloud-Data-Warehouse, das ohne operativen Aufwand von Byte auf Petabyte skaliert werden kann. Dies macht es zu einer guten Wahl zum Speichern von ML-Trainingsdaten. Darüber hinaus ermöglichen Ihnen die integrierten Funktionen von BigQuery Machine Learning ( BQML) und Analysefunktionen das Erstellen von No-Code-Vorhersagen nur mit SQL-Abfragen. Außerdem können Sie über föderierte Abfragen auf Daten aus externen Quellen zugreifen, sodass Sie keine komplizierten ETL-Pipelines benötigen. Auf der Seite „BigQuery“ finden Sie weitere Informationen zu den Funktionen von BigQuery.

Bisher kennen wir BigQuery als das vollständig verwaltete Cloud-Data-Warehouse, mit dem Nutzer strukturierte und semistrukturierte Daten analysieren können. Aber

  • BigQuery wurde erweitert, um auch alle Analysen und ML-Funktionen für unstrukturierte Daten auszuführen.
  • Wir können SQL-Abfragen verwenden, um aufschlussreiche Analysen, Analysen und ML für Bilder, Videos, Audio usw. durchzuführen, ohne zusätzlichen Code schreiben zu müssen.
  • Wir haben die Möglichkeit, strukturierte und unstrukturierte Daten so zu kombinieren, als wären sie alle zusammen in einer Tabelle vorhanden.

Diese werden wir im nächsten Abschnitt in unserem Anwendungsfall „Yoga-Pose-Klassifizierung“ besprechen.

Bilddatenklassifizierung mit BigQuery ML

Die Möglichkeit, Bilder mit strukturierten Abfragen so zu verarbeiten und zu analysieren, als wären es strukturierte Daten, ist das erste ihrer Art. Jetzt können wir mithilfe von Klassifizierungsmodellen für maschinelles Lernen und BigQuery ML sogar Ergebnisse vorhersagen. Ich habe die einzelnen Phasen zur besseren Verständlichkeit in fünf Schritte eingegrenzt:

fe97945bce996e1.jpeg

Die obigen Schritte könnten kompliziert sein, wenn wir sie nur als Beschriftungen betrachten. Die Details der einzelnen Komponenten wie BigQuery-Dataset, BigLake-Verbindung, Cloud Storage-Buckets (Container), Objekttabelle (externe Datenquelle), BQML usw. werden im Implementierungsbereich definiert. Lassen Sie sich also nicht entmutigen, wenn Sie mit diesen Begriffen noch nicht vertraut sind.

Aufgaben

Sie erstellen ein Modell zur Bilddatenklassifizierung mit BQML, das Folgendes 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
  • Eine externe Tabelle für den Zugriff auf Cloud Storage-Images
  • Eine BigLake-Verbindung für die externe Tabelle, um auf die Images in GCS zuzugreifen
  • ResNet-Modell in BigQuery ML
  • Inferenz mit dem erstellten Modell
  • BigQuery SQL zum Analysieren von Bilddaten
  • BigQuery SQL, um die strukturierten und unstrukturierten Daten zusammen abzufragen

Lerninhalte

  • Cloud Storage-Bucket erstellen und Bilder speichern
  • BigQuery-Dataset, -Tabelle und -Verbindung erstellen
  • Bilddatenklassifizierungsmodell mit BQML erstellen
  • Mit dem erstellten Modell und BigQuery ML Vorhersagen treffen
  • Mit BigQuery-SQL Bilder abfragen und mit strukturierten Daten kombinieren

2. Voraussetzungen

  • Ein Browser wie Chrome oder Firefox
  • Ein Google Cloud-Projekt mit aktivierter Abrechnung, das Ihre BigQuery-, Cloud Storage- und BigLake-Verbindungsdienste enthält
  • Der nächste Abschnitt enthält eine Liste der Schritte zum Erstellen der Anwendung zur Bilddatenklassifizierung.

3. Dataset und BigLake-Verbindung erstellen

Für unseren Anwendungsfall der Bilderkennung von fünf Yoga-Posen habe ich das öffentlich verfügbare Dataset verwendet. Sie können über dieses Repository auf das Dataset zugreifen. Die Yogastellungen, die wir identifizieren, sind auf Downdog, Göttin, Plank, Baum und Warrior2 beschränkt. 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. Beachten Sie, dass sich alle in dieser Implementierung verwendeten Dienste in derselben Region befinden müssen.

a. Dataset „yoga_set“ erstellen Gehen Sie dazu so vor:

Rufen Sie den BigQuery-Editor auf und geben Sie den folgenden Befehl ein:

CREATE SCHEMA `<<project_id>>.yoga_set`;

b. Mit BigLake Connection können wir die externe Datenquelle verbinden und dabei die detaillierte BigQuery-Zugriffssteuerung und Sicherheit beibehalten. In unserem Fall ist das der Cloud Storage für die Bilddaten. Über diese Verbindung werden Objekte aus Cloud Storage gelesen. Führen Sie die folgenden Schritte aus, um die BigLake-Verbindung zu erstellen.

Klicken Sie im Explorer-Bereich der BigQuery-Seite auf ADD DATA (DATEN HINZUFÜGEN):

4cb42b1245bb0ba6.pngBigQuery „Externe Daten hinzufügen“ Bildschirm

Klicken Sie auf Verbindungen zu externen Datenquellen und wählen Sie die Option „BigLake“ und „Remote-Funktionen“ aus:

9ffec2b2bfcc3cd5.pngExterne Datenquellenverbindung 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 <<SERVICE_ACCOUNT>> hergestellt ist. In unserem Beispiel lautet die Verbindungs-ID "yoga-pose-conn". Notieren Sie sich die Region.

4. Google Cloud Storage-Bucket erstellen und Berechtigungen gewähren

Wir verwenden den Google Cloud Storage-Bucket für die Bilddateien von Yoga-Posen, für die wir das Modell erstellen möchten. Buckets sind Cloud Storage-Container, die die Bilder enthalten, die wir analysieren.

a. Rufen Sie Google Cloud Storage auf, indem Sie in der Console danach suchen. Klicken Sie dann auf „Buckets“, um zur Buckets-Startseite zu gelangen. Klicken Sie dann auf ERSTELLEN.

a6f6b26cffb53ae0.pngGoogle Cloud Storage-Seite „Buckets“

b. Geben Sie auf der Seite „Bucket erstellen“ Ihre Bucket-Informationen (einmaliger Name) ein und fahren Sie fort. Achten Sie darauf, dass sie sich in derselben Region wie das Dataset und die in den obigen Schritten beschriebene Verbindung befinden, und klicken Sie auf „Erstellen“.

1280366a42b7bdf6.pngGoogle Cloud Storage-Seite zum Erstellen eines Buckets

Bevor Sie mit dem nächsten Schritt fortfahren, müssen Sie sich das Dienstkonto, den Bucket-Namen und den Pfad notieren.

c. Nachdem der Bucket erstellt wurde, speichern Sie Ihre Bilder (über Console- oder Cloud Shell-Befehle oder programmatisch) und gewähren Sie dem zuvor gespeicherten Dienstkonto der Verbindung die erforderlichen Berechtigungen, 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 über die erstellte Verbindung auf die unstrukturierten Daten im Bucket zuzugreifen. Führen Sie den folgenden CREATE SQL-Code aus dem 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 so erstellt:

bda48f566e0c292f.png

Fragen Sie schnell eine Position 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 folgenden Screenshot sehen, können Sie unstrukturierte Bilder so erstellen und bearbeiten, als wären es strukturierte Daten:

7d1784122b5013f.png

Jetzt exportieren wir das Abfrageergebnis von oben in ein kleines Python-Snippet, um das Ergebnis zu visualisieren:

Klicken Sie auf SAVE RESULTS (ERGEBNISSE SPEICHERN) und wählen Sie „CSV Localfile“ aus. um das Ergebnis zu exportieren. Öffnen Sie dann Ihr Colab-Notebook (oder erstellen Sie eines) und geben Sie den Code unten 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 „Ausführen“ aus, um das Ergebnis so zu sehen:

b8edd68cb281786a.png

Nachdem Sie nun die externe Tabelle erstellt und nur mithilfe von SQL-Abfragen auf Bilder aus Cloud Storage zugegriffen haben, machen wir mit dem nächsten Abschnitt weiter, 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 die gerade erstellte Objekttabelle zu Inferenzen zu generieren. Das ResNet 50-Modell analysiert Bilddateien und gibt einen Batch von Vektoren aus, die die Wahrscheinlichkeit darstellen, dass ein Bild zur entsprechenden Klasse (Logits) gehört.

Bevor Sie mit diesem Schritt fortfahren, müssen Sie prüfen, ob Sie alle erforderlichen Berechtigungen haben. Gehen Sie dann so vor:

  1. Laden Sie das Modell von diesem Speicherort herunter und speichern Sie es auf Ihrem lokalen Computer
  2. Es sollte in „Saved_model.pb“ und einen „Variablen“-Ordner entpackt werden.
  3. Laden Sie die Datei und den Ordner in den Bucket hoch, den Sie im vorherigen Abschnitt erstellt haben.

2629ff3eda214946.pngGoogle Cloud Storage-Bucket "yoga_images" mit den hochgeladenen ResNet-Modelldateien

Sobald dieser Schritt abgeschlossen ist, sollten sich die modellbezogenen Dateien wie in der Abbildung oben im selben Bucket wie Ihre Bilder befinden.

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 Abschnitt „Dataset“ in BigQuery aufgeführt.

435fa0919aeb57a6.pngBigQuery-Dataset, in dem das erstellte Modell aufgelistet ist

b. Prüfen Sie das Modell, um die Eingabe- und Ausgabefelder anzusehen.

Erweitern Sie das Dataset und klicken Sie auf das soeben erstellte Modell „yoga_poses_resnet“. Klicken Sie auf den Tab „Schema“:

e88928764f10f6ff.pngTab „Schema“ der BigQuery-Modelldefinition

Im Bereich „Labels“ sehen Sie „activation_49“. , das das Ausgabefeld darstellt. Im Bereich „Features“ (Funktionen) sehen Sie „input_1“. das das Feld darstellt, das in das Modell eingegeben werden soll. Sie verweisen auf "input_1". in der Inferenzabfrage (oder Vorhersageabfrage) als Feld für den Test Daten.

c. Leite deine Yoga-Stellung ab!

Wir verwenden das soeben erstellte Modell, um unsere Testbilddaten zu klassifizieren. Achten Sie darauf, dass in Ihrem Cloud Storage-Bucket einige Testbilder (Yogastellungen) identifiziert wurden, die bei der Erstellung in die externe Tabelle aufgenommen wurden. Wir werden diese Testbilder selektiv in BigQuery abfragen, um die Inferenz mit dem BQML-Modell, das wir gerade erstellt haben, 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 einen bestimmten URI-Wert (00000097.jpg) in der externen Tabelle enthält. Außerdem wird im SELECT-Teil das Konstrukt ML.DECODE_IMAGE als Feld "input_1" verwendet. damit die Funktion ML.PREDICT funktioniert.

Sobald die Ausführung abgeschlossen ist, wird das Ergebnis wie folgt angezeigt:

867018993845e943.png

Für diejenigen, die sich im Detail mit dem ResNet-Modell auskennen, sollte dies zum Verständnis der Klassifizierung beitragen. Oder codieren Sie ein kleines Snippet, um die Klassifizierung visuell zu verstehen.

d. Ergebnis vereinfachen

Eine Möglichkeit zur Visualisierung der obigen Ausgabe besteht darin, die Feldwerte „Activation_49“ mithilfe des UNNEST-Konstrukts von BigQuery SQL zu vereinfachen. Sehen Sie sich die folgende Abfrage an, um das Ergebnis aus dem vorherigen Schritt zu vereinfachen. Wenn Sie die resultierende Klasse weiter als Text beschriften möchten, können Sie die Logik anstelle des Platzhalters <<LABEL_LOGIC>> einführen. in die Abfrage ein. Entfernen Sie die Kommentarzeichen, wenn Sie die Abfrage 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 Klassen-Labeling-Logik sehen Sie die Ausgabe der Abfrage:

71f580f41f0811f3.png

In meinem Fall habe ich jedoch eine Beispiellogik angewendet und das Ergebnis lautet wie folgt:

1c6df6ecd14fba1.png

Sie können sich weiter über das Modell informieren und die Logik anwenden, die am besten mit Ihren Daten und der Modellausgabe funktioniert.

e. Inferenz visualisieren

Schließlich gibt es 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.

68756e7e4b8d7a29.png

Die obige Bildausgabe bezieht sich auf die Yoga-Stellung „Downward Dog“. Das ist genau die gleiche Testeingabe, die wir an die ML.PREDICT-Abfrage zur Klassifizierung mit BQML übergeben haben.

8. Strukturierte und unstrukturierte Daten vereinheitlichen

Am besten ist es an dieser Implementierung, die Felder aus meiner strukturierten relationalen Tabelle mit diesen unstrukturierten Bilddaten zu vereinheitlichen. Ich habe eine strukturierte BigQuery-Tabelle im selben Dataset wie die externe Tabelle erstellt, um die Pose und ihre gesundheitsbezogenen Daten zu speichern.

125bdf848c86fbe.pngBigQuery-Tabelle „yoga_health“ Schema

Das Bild oben stellt das Schema der Tabelle mit strukturierten Daten namens „yoga_health“ dar. und die Felder sind pose, konzentriert, Mit der folgenden Abfrage werden sowohl strukturierte als auch unstrukturierte Daten zusammengeführt:

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 das Ergebnis:

469bdfcffa9e19fd.png

Hinweis:Alle in diesem Blog behandelten Abfragen können mithilfe der Magic-Befehle von BigQuery direkt von Ihrem Python-Notebook ausgeführt werden.

9. Bereinigen

So vermeiden Sie, dass Ihrem Google Cloud-Konto die in diesem Beitrag verwendeten Ressourcen in Rechnung gestellt werden:

  1. Rufen Sie in der Google Cloud Console die Seite Ressourcen verwalten auf.
  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie auf „Löschen“.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie dann auf „Beenden“, um das Projekt zu löschen.

10. Glückwunsch

Glückwunsch! Sie haben erfolgreich unstrukturierte Daten in BigQuery gespeichert, abgefragt, mit BQML ein Klassifizierungsmodell erstellt und mit dem Modell Test-Yoga-Posen vorhergesagt. Wenn Sie dies implementieren möchten, beginnen Sie mit Ihrem Google Cloud-Projekt. Weitere Informationen zu Datenbanken und anderen Implementierungen von Anwendungen in Google Cloud finden Sie in meinen Blogs.