In diesem Bereitstellungsdokument wird beschrieben, wie Sie eine Dataflow-Pipeline bereitstellen, um Bilddateien im großen Umfang mit der Cloud Vision API zu verarbeiten. In dieser Pipeline werden die Ergebnisse der verarbeiteten Dateien in BigQuery gespeichert. Sie können die Dateien zu Analysezwecken oder zum Trainieren von BigQuery ML-Modellen verwenden.
Die Dataflow-Pipeline, die Sie bei dieser Bereitstellung erstellen, kann Millionen von Bildern pro Tag verarbeiten. Die einzige Einschränkung ist Ihr Vision API-Kontingent. Sie können Ihr Vision API-Kontingent basierend auf Ihren Skalierungsanforderungen erhöhen.
Diese Anleitung richtet sich an Data Engineers und Data Scientists. In diesem Dokument wird davon ausgegangen, dass Sie Grundkenntnisse in der Erstellung von Dataflow-Pipelines mit dem Java SDK von Apache Beam, GoogleSQL für BigQuery und grundlegenden Shell-Scripts haben. Außerdem wird davon ausgegangen, dass Sie mit der Vision API vertraut sind.
Architektur
Das folgende Diagramm veranschaulicht den Systemablauf beim Erstellen einer Lösung für die ML-gestützte Bildanalyse.
Im vorherigen Diagramm fließen Informationen so durch die Architektur:
- Ein Client lädt Bilddateien in einen Cloud Storage-Bucket hoch.
- Cloud Storage sendet eine Nachricht über den Datenupload an Pub/Sub.
- Pub/Sub benachrichtigt Dataflow über den Upload.
- Die Dataflow-Pipeline sendet die Bilder an die Vision API.
- Die Vision API verarbeitet die Bilder und gibt dann die Anmerkungen zurück.
- Die Pipeline sendet die annotierten Dateien zur Analyse an BigQuery.
Lernziele
- Erstellen Sie eine Apache Beam-Pipeline für die Bildanalyse der in Cloud Storage geladenen Bilder.
- Verwenden Sie Dataflow Runner v2, um die Apache Beam-Pipeline im Streamingmodus auszuführen, um die Bilder direkt nach dem Hochladen zu analysieren.
- Mit der Vision API Bilder für eine Reihe von Feature-Typen analysieren
- Anmerkungen mit BigQuery analysieren
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Nach Abschluss des Erstellens der Beispielanwendung können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.
Hinweise
- 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.
-
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.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
- Klonen Sie das GitHub-Repository, das den Quellcode der Dataflow-Pipeline enthält:
git clone https://github.com/GoogleCloudPlatform/dataflow-vision-analytics.git
- Wechseln Sie zum Stammverzeichnis des Repositorys:
cd dataflow-vision-analytics
- Folgen Sie der Anleitung im Abschnitt Einstieg des dataflow-vision-analytics-Repositorys auf GitHub, um die folgenden Aufgaben auszuführen:
- Mehrere APIs aktivieren
- Cloud Storage-Bucket erstellen
- Pub/Sub-Thema und -Abo erstellen.
- BigQuery-Dataset erstellen
- Richten Sie mehrere Umgebungsvariablen für diese Bereitstellung ein.
Dataflow-Pipeline für alle implementierten Vision API-Features ausführen
Die Dataflow-Pipeline fordert eine bestimmte Reihe von Vision API-Features und ‑Attributen in den annotierten Dateien an und verarbeitet sie.
Die in der folgenden Tabelle aufgeführten Parameter gelten nur für die Dataflow-Pipeline in dieser Bereitstellung. Eine vollständige Liste der standardmäßigen Dataflow-Ausführungsparameter finden Sie unter Dataflow-Pipelineoptionen festlegen.
Parametername | Beschreibung |
---|---|
|
Die Anzahl der Bilder, die in einer Anfrage an die Vision API enthalten sein sollen. Der Standardwert ist 1. Sie können ihn auf maximal 16 erhöhen. |
|
Der Name des BigQuery-Ausgabe-Datasets. |
|
Eine Liste von Features zur Bildverarbeitung. Die Pipeline unterstützt die Funktionen „Label“, „Sehenswürdigkeit“, „Logo“, „Gesicht“, „Zuschnittshinweis“ und „Bildeigenschaften“. |
|
Der Parameter, der die maximale Anzahl paralleler Aufrufe der Vision API definiert. Der Standardwert ist 1. |
|
Stringparameter mit Tabellennamen für verschiedene Annotationen. Die Standardwerte werden für jede Tabelle angegeben, z. B. label_annotation . |
|
Die Zeit, die gewartet werden soll, bevor Bilder verarbeitet werden, wenn ein unvollständiger Bildersatz vorhanden ist. Der Standardwert ist 30 Sekunden. |
|
Die ID des Pub/Sub-Abos, das Cloud Storage-Eingabebenachrichtigungen empfängt. |
|
Die Projekt-ID, die für die Vision API verwendet werden soll. |
Führen Sie in Cloud Shell den folgenden Befehl aus, um Bilder für alle von der Dataflow-Pipeline unterstützten Featuretypen zu verarbeiten:
./gradlew run --args=" \ --jobName=test-vision-analytics \ --streaming \ --runner=DataflowRunner \ --enableStreamingEngine \ --diskSizeGb=30 \ --project=${PROJECT} \ --datasetName=${BIGQUERY_DATASET} \ --subscriberId=projects/${PROJECT}/subscriptions/${GCS_NOTIFICATION_SUBSCRIPTION} \ --visionApiProjectId=${PROJECT} \ --features=IMAGE_PROPERTIES,LABEL_DETECTION,LANDMARK_DETECTION,LOGO_DETECTION,CROP_HINTS,FACE_DETECTION"
Das spezielle Dienstkonto muss Lesezugriff auf den Bucket haben, der die Bilder enthält. Mit anderen Worten: Dem Konto muss die Rolle
roles/storage.objectViewer
für diesen Bucket zugewiesen sein.Weitere Informationen zur Verwendung eines speziellen Dienstkontos finden Sie unter Sicherheit und Berechtigungen in Dataflow.
Öffnen Sie die angezeigte URL in einem neuen Browsertab oder rufen Sie die Seite Dataflow-Jobs auf und wählen Sie die Pipeline test-vision-analytics aus.
Nach einigen Sekunden wird die Grafik für den Dataflow-Job angezeigt:
Die Dataflow-Pipeline wird jetzt ausgeführt und wartet darauf, Eingabebenachrichtigungen vom Pub/Sub-Abo zu erhalten.
Lösen Sie die Dataflow-Bildverarbeitung aus, indem Sie die sechs Beispieldateien in den Eingabe-Bucket hochladen:
gcloud storage cp data-sample/* gs://${IMAGE_BUCKET}
Suchen Sie in der Google Cloud Console den Bereich „Benutzerdefinierte Zähler“ und prüfen Sie die benutzerdefinierten Zähler in Dataflow. Prüfen Sie auch, ob alle sechs Bilder in Dataflow verarbeitet wurden. Mit der Filterfunktion des Steuerfelds können Sie die gewünschten Messwerte aufrufen. Wenn Sie nur die Zähler anzeigen lassen möchten, die mit dem Präfix
numberOf
beginnen, geben SienumberOf
in den Filter ein.Prüfen Sie in Cloud Shell, ob die Tabellen automatisch erstellt wurden:
bq query --nouse_legacy_sql "SELECT table_name FROM ${BIGQUERY_DATASET}.INFORMATION_SCHEMA.TABLES ORDER BY table_name"
Die Ausgabe sieht so aus:
+----------------------+ | table_name | +----------------------+ | crop_hint_annotation | | face_annotation | | image_properties | | label_annotation | | landmark_annotation | | logo_annotation | +----------------------+
Sehen Sie sich das Schema für die Tabelle
landmark_annotation
an. DasLANDMARK_DETECTION
-Feature erfasst die vom API-Aufruf zurückgegebenen Attribute.bq show --schema --format=prettyjson ${BIGQUERY_DATASET}.landmark_annotation
Die Ausgabe sieht so aus:
[ { "name":"gcs_uri", "type":"STRING" }, { "name":"feature_type", "type":"STRING" }, { "name":"transaction_timestamp", "type":"STRING" }, { "name":"mid", "type":"STRING" }, { "name":"description", "type":"STRING" }, { "name":"score", "type":"FLOAT" }, { "fields":[ { "fields":[ { "name":"x", "type":"INTEGER" }, { "name":"y", "type":"INTEGER" } ], "mode":"REPEATED", "name":"vertices", "type":"RECORD" } ], "name":"boundingPoly", "type":"RECORD" }, { "fields":[ { "fields":[ { "name":"latitude", "type":"FLOAT" }, { "name":"longitude", "type":"FLOAT" } ], "name":"latLon", "type":"RECORD" } ], "mode":"REPEATED", "name":"locations", "type":"RECORD" } ]
Führen Sie die folgenden
bq query
-Befehle aus, um die von der API erstellten Anmerkungsdaten aufzurufen. Sie sehen dann alle in diesen sechs Bildern gefundenen Markierungen, sortiert nach der Wahrscheinlichkeitsbewertung:bq query --nouse_legacy_sql "SELECT SPLIT(gcs_uri, '/')[OFFSET(3)] file_name, description, score, locations FROM ${BIGQUERY_DATASET}.landmark_annotation ORDER BY score DESC"
Die Ausgabe sieht in etwa so aus:
+------------------+-------------------+------------+---------------------------------+ | file_name | description | score | locations | +------------------+-------------------+------------+---------------------------------+ | eiffel_tower.jpg | Eiffel Tower | 0.7251996 | ["POINT(2.2944813 48.8583701)"] | | eiffel_tower.jpg | Trocadéro Gardens | 0.69601923 | ["POINT(2.2892823 48.8615963)"] | | eiffel_tower.jpg | Champ De Mars | 0.6800974 | ["POINT(2.2986304 48.8556475)"] | +------------------+-------------------+------------+---------------------------------+
Ausführliche Beschreibungen aller Spalten, die speziell für Anmerkungen gelten, finden Sie unter
AnnotateImageResponse
.Führen Sie den folgenden Befehl aus, um die Streaming-Pipeline zu beenden. Die Pipeline wird weiter ausgeführt, auch wenn keine weiteren Pub/Sub-Benachrichtigungen zur Verarbeitung vorhanden sind.
gcloud dataflow jobs cancel --region ${REGION} $(gcloud dataflow jobs list --region ${REGION} --filter="NAME:test-vision-analytics AND STATE:Running" --format="get(JOB_ID)")
Im folgenden Abschnitt finden Sie weitere Beispielabfragen, mit denen verschiedene Bildmerkmale der Bilder analysiert werden.
Flickr30K-Dataset analysieren
In diesem Abschnitt erkennen Sie Labels und Sehenswürdigkeiten im öffentlichen Flickr30k-Bilddatensatz, der auf Kaggle gehostet wird.
Ändern Sie in Cloud Shell die Parameter der Dataflow-Pipeline, damit sie für ein großes Dataset optimiert ist. Erhöhen Sie auch die Werte für
batchSize
undkeyRange
, um einen höheren Durchsatz zu ermöglichen. Dataflow skaliert die Anzahl der Worker nach Bedarf:./gradlew run --args=" \ --runner=DataflowRunner \ --jobName=vision-analytics-flickr \ --streaming \ --enableStreamingEngine \ --diskSizeGb=30 \ --autoscalingAlgorithm=THROUGHPUT_BASED \ --maxNumWorkers=5 \ --project=${PROJECT} \ --region=${REGION} \ --subscriberId=projects/${PROJECT}/subscriptions/${GCS_NOTIFICATION_SUBSCRIPTION} \ --visionApiProjectId=${PROJECT} \ --features=LABEL_DETECTION,LANDMARK_DETECTION \ --datasetName=${BIGQUERY_DATASET} \ --batchSize=16 \ --keyRange=5"
Da der Datensatz groß ist, können Sie die Bilder nicht mit Cloud Shell von Kaggle abrufen und an den Cloud Storage-Bucket senden. Dazu müssen Sie eine VM mit einer größeren Laufwerkgröße verwenden.
Wenn Sie Kaggle-basierte Bilder abrufen und an den Cloud Storage-Bucket senden möchten, folgen Sie der Anleitung im Abschnitt Hochladen von Bildern in den Storage-Bucket simulieren im GitHub-Repository.
Wenn Sie den Fortschritt des Kopiervorgangs anhand der benutzerdefinierten Messwerte in der Dataflow-Benutzeroberfläche beobachten möchten, rufen Sie die Seite Dataflow-Jobs auf und wählen Sie die Pipeline
vision-analytics-flickr
aus. Die Kundenzähler sollten sich regelmäßig ändern, bis die Dataflow-Pipeline alle Dateien verarbeitet hat.Die Ausgabe ähnelt dem folgenden Screenshot des Bereichs „Benutzerdefinierte Zähler“. Eine der Dateien im Datensatz hat den falschen Typ. Das wird durch den Zähler
rejectedFiles
angezeigt. Diese Zählerwerte sind ungefähre Angaben. Möglicherweise sind die Werte höher. Außerdem ändert sich die Anzahl der Anmerkungen aufgrund der höheren Genauigkeit der Verarbeitung durch die Vision API höchstwahrscheinlich.Auf der Seite mit den Kontingenten für die Vision API sehen Sie, ob Sie die verfügbaren Ressourcen erreichen oder überschreiten.
In unserem Beispiel hat die Dataflow-Pipeline nur etwa 50% ihres Kontingents genutzt. Je nachdem, wie viel Prozent des Kontingents Sie nutzen, können Sie die Parallelität der Pipeline erhöhen, indem Sie den Wert des Parameters
keyRange
erhöhen.Beenden Sie die Pipeline:
gcloud dataflow jobs list --region $REGION --filter="NAME:vision-analytics-flickr AND STATE:Running" --format="get(JOB_ID)"
Anmerkungen in BigQuery analysieren
Bei dieser Bereitstellung haben Sie mehr als 30.000 Bilder für die Anmerkung von Labels und Sehenswürdigkeiten verarbeitet. In diesem Abschnitt erfassen Sie Statistiken zu diesen Dateien. Sie können diese Abfragen im GoogleSQL for BigQuery-Arbeitsbereich oder mit dem bq-Befehlszeilentool ausführen.
Die angezeigten Zahlen können von den Beispielabfrageergebnissen in dieser Bereitstellung abweichen. Die Vision API verbessert kontinuierlich die Genauigkeit ihrer Analyse. Sie kann bessere Ergebnisse liefern, wenn Sie dasselbe Bild nach dem ersten Test der Lösung analysieren.
Rufen Sie in der Google Cloud Console die Seite BigQuery-Abfrageeditor auf und führen Sie den folgenden Befehl aus, um die 20 wichtigsten Labels im Datensatz aufzurufen:
SELECT description, count(*)ascount \ FROM vision_analytics.label_annotation GROUP BY description ORDER BY count DESC LIMIT 20
Die Ausgabe sieht in etwa so aus:
+------------------+-------+ | description | count | +------------------+-------+ | Leisure | 7663 | | Plant | 6858 | | Event | 6044 | | Sky | 6016 | | Tree | 5610 | | Fun | 5008 | | Grass | 4279 | | Recreation | 4176 | | Shorts | 3765 | | Happy | 3494 | | Wheel | 3372 | | Tire | 3371 | | Water | 3344 | | Vehicle | 3068 | | People in nature | 2962 | | Gesture | 2909 | | Sports equipment | 2861 | | Building | 2824 | | T-shirt | 2728 | | Wood | 2606 | +------------------+-------+
Sie können ermitteln, welche anderen Labels in einem Bild mit einem bestimmten Label vorhanden sind, sortiert nach Häufigkeit:
DECLARE label STRING DEFAULT 'Plucked string instruments'; WITH other_labels AS ( SELECT description, COUNT(*) count FROM vision_analytics.label_annotation WHERE gcs_uri IN ( SELECT gcs_uri FROM vision_analytics.label_annotation WHERE description = label ) AND description != label GROUP BY description) SELECT description, count, RANK() OVER (ORDER BY count DESC) rank FROM other_labels ORDER BY rank LIMIT 20;
Die Ausgabe sieht so aus: Für das im vorherigen Befehl verwendete Label Zupfinstrumente sollte Folgendes angezeigt werden:
+------------------------------+-------+------+ | description | count | rank | +------------------------------+-------+------+ | String instrument | 397 | 1 | | Musical instrument | 236 | 2 | | Musician | 207 | 3 | | Guitar | 168 | 4 | | Guitar accessory | 135 | 5 | | String instrument accessory | 99 | 6 | | Music | 88 | 7 | | Musical instrument accessory | 72 | 8 | | Guitarist | 72 | 8 | | Microphone | 52 | 10 | | Folk instrument | 44 | 11 | | Violin family | 28 | 12 | | Hat | 23 | 13 | | Entertainment | 22 | 14 | | Band plays | 21 | 15 | | Jeans | 17 | 16 | | Plant | 16 | 17 | | Public address system | 16 | 17 | | Artist | 16 | 17 | | Leisure | 14 | 20 | +------------------------------+-------+------+
Die zehn häufigsten erkannten Markierungen ansehen:
SELECT description, COUNT(description) AS count FROM vision_analytics.landmark_annotation GROUP BY description ORDER BY count DESC LIMIT 10
Die Ausgabe sieht so aus:
+--------------------+-------+ | description | count | +--------------------+-------+ | Times Square | 55 | | Rockefeller Center | 21 | | St. Mark's Square | 16 | | Bryant Park | 13 | | Millennium Park | 13 | | Ponte Vecchio | 13 | | Tuileries Garden | 13 | | Central Park | 12 | | Starbucks | 12 | | National Mall | 11 | +--------------------+-------+
Ermitteln Sie die Bilder, die am ehesten Wasserfälle enthalten:
SELECT SPLIT(gcs_uri, '/')[OFFSET(3)] file_name, description, score FROM vision_analytics.landmark_annotation WHERE LOWER(description) LIKE '%fall%' ORDER BY score DESC LIMIT 10
Die Ausgabe sieht so aus:
+----------------+----------------------------+-----------+ | file_name | description | score | +----------------+----------------------------+-----------+ | 895502702.jpg | Waterfall Carispaccha | 0.6181358 | | 3639105305.jpg | Sahalie Falls Viewpoint | 0.44379658 | | 3672309620.jpg | Gullfoss Falls | 0.41680416 | | 2452686995.jpg | Wahclella Falls | 0.39005348 | | 2452686995.jpg | Wahclella Falls | 0.3792498 | | 3484649669.jpg | Kodiveri Waterfalls | 0.35024035 | | 539801139.jpg | Mallela Thirtham Waterfall | 0.29260656 | | 3639105305.jpg | Sahalie Falls | 0.2807213 | | 3050114829.jpg | Kawasan Falls | 0.27511594 | | 4707103760.jpg | Niagara Falls | 0.18691841 | +----------------+----------------------------+-----------+
Suchen Sie nach Bildern von Sehenswürdigkeiten in einem Umkreis von drei Kilometern vom Kolosseum in Rom (die Funktion
ST_GEOPOINT
verwendet den Längengrad und den Breitengrad des Kolosseums):WITH landmarksWithDistances AS ( SELECT gcs_uri, description, location, ST_DISTANCE(location, ST_GEOGPOINT(12.492231, 41.890222)) distance_in_meters, FROM `vision_analytics.landmark_annotation` landmarks CROSS JOIN UNNEST(landmarks.locations) AS location ) SELECT SPLIT(gcs_uri,"/")[OFFSET(3)] file, description, ROUND(distance_in_meters) distance_in_meters, location, CONCAT("https://storage.cloud.google.com/", SUBSTR(gcs_uri, 6)) AS image_url FROM landmarksWithDistances WHERE distance_in_meters < 3000 ORDER BY distance_in_meters LIMIT 100
Wenn Sie die Abfrage ausführen, sehen Sie, dass es mehrere Bilder des Kolosseums gibt, aber auch Bilder des Konstantinsbogens, des Palatins und einer Reihe anderer häufig fotografierter Orte.
Sie können die Daten in BigQuery Geo Viz visualisieren, indem Sie die vorherige Abfrage einfügen. Wählen Sie einen Punkt auf der Karte aus, um die Details dazu zu sehen. Das Attribut
Image_url
enthält einen Link zur Bilddatei.
Hinweis zu Abfrageergebnissen Standortinformationen sind normalerweise für Sehenswürdigkeiten vorhanden. Ein Bild kann mehrere Standorte derselben Sehenswürdigkeit enthalten.
Diese Funktion wird im Typ AnnotateImageResponse
beschrieben.
Da ein Standort die Position der Szene im Bild angeben kann, können mehrere LocationInfo
-Elemente vorhanden sein. Mit einem anderen Ort kann angegeben werden, wo das Bild aufgenommen wurde.
Bereinigen
Damit Ihrem Google Cloud-Konto die in diesem Leitfaden verwendeten Ressourcen nicht in Rechnung gestellt werden, können Sie entweder das Projekt löschen, das die Ressourcen enthält, oder das Projekt beibehalten und die einzelnen Ressourcen löschen.
Google Cloud-Projekt löschen
Am einfachsten können Sie die Abrechnung deaktivieren, wenn Sie das Google Cloud-Projekt löschen, das Sie für die Anleitung erstellt haben.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Wenn Sie Ressourcen einzeln löschen möchten, folgen Sie der Anleitung im Abschnitt Bereinigen des GitHub-Repositories.
Nächste Schritte
- Weitere Referenzarchitekturen, Diagramme und Best Practices finden Sie im Cloud-Architekturcenter.
Beitragende
Autoren:
- Masud Hasan | Site Reliability Engineering Manager
- Sergei Lilichenko | Solutions Architect
- Lakshmanan Sethu | Technical Account Manager
Weitere Beitragende:
- Jiyeon Kang | Customer Engineer
- Sunil Kumar Jang Bahadur | Customer Engineer