Questo documento di deployment descrive come eseguire il deployment di una pipeline Dataflow per elaborare file immagine su larga scala con l'API Cloud Vision. Questa pipeline archivia i risultati dei file elaborati in BigQuery. Puoi utilizzare i file a scopo analitico o per addestrare modelli BigQuery ML.
La pipeline Dataflow che crei in questo deployment può elaborare milioni di immagini al giorno. L'unico limite è la quota dell'API Vision. Puoi aumentare la quota dell'API Vision in base ai tuoi requisiti di scalabilità.
Queste istruzioni sono destinate a data engineer e data scientist. Questo documento presuppone che tu abbia una conoscenza di base della creazione di pipeline Dataflow utilizzando l'SDK Apache Beam per Java, GoogleSQL per BigQuery e scripting shell di base. Si presume inoltre che tu abbia familiarità con l'API Vision.
Architettura
Il seguente diagramma illustra il flusso del sistema per la creazione di una soluzione di analisi di visione ML.
Nel diagramma precedente, le informazioni scorrono attraverso l'architettura nel seguente modo:
- Un client carica i file immagine in un bucket Cloud Storage.
- Cloud Storage invia un messaggio sul caricamento dei dati a Pub/Sub.
- Pub/Sub invia una notifica a Dataflow in merito al caricamento.
- La pipeline Dataflow invia le immagini all'API Vision.
- L'API Vision elabora le immagini e restituisce le annotazioni.
- La pipeline invia i file annotati a BigQuery per l'analisi.
Obiettivi
- Crea una pipeline Apache Beam per l'analisi delle immagini caricate in Cloud Storage.
- Utilizza Dataflow Runner v2 per eseguire la pipeline Apache Beam in modalità streaming per analizzare le immagini non appena vengono caricate.
- Utilizza l'API Vision per analizzare le immagini per un insieme di tipi di funzionalità.
- Analizza le annotazioni con BigQuery.
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il calcolatore prezzi.
Al termine della creazione dell'applicazione di esempio, puoi evitare l'addebito di ulteriori costi eliminando le risorse create. Per ulteriori informazioni, vedi Pulizia.
Prima di iniziare
- 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.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify 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.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify 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.
- Clona il repository GitHub che contiene il codice sorgente della pipeline Dataflow:
git clone https://github.com/GoogleCloudPlatform/dataflow-vision-analytics.git
- Vai alla cartella principale del repository:
cd dataflow-vision-analytics
- Segui le istruzioni nella sezione
Guida introduttiva
del repository dataflow-vision-analytics su GitHub per
svolgere le seguenti attività:
- Abilita diverse API.
- Creare un bucket Cloud Storage.
- Crea un argomento e una sottoscrizione Pub/Sub.
- Creare un set di dati BigQuery.
- Configura diverse variabili di ambiente per questo deployment.
In Cloud Shell, esegui questo comando per elaborare le immagini per tutti i tipi di funzionalità supportati dalla pipeline Dataflow:
./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"
L'account di servizio dedicato deve disporre dell'accesso in lettura al bucket contenente le immagini. In altre parole, a questo account deve essere concesso il ruolo
roles/storage.objectViewer
nel bucket.Per ulteriori informazioni sull'utilizzo di un account di servizio dedicato, consulta Sicurezza e autorizzazioni di Dataflow.
Apri l'URL visualizzato in una nuova scheda del browser o vai alla pagina Job Dataflow e seleziona la pipeline test-vision-analytics.
Dopo alcuni secondi, viene visualizzato il grafico per il job Dataflow:
La pipeline Dataflow è ora in esecuzione e in attesa di ricevere notifiche di input dalla sottoscrizione Pub/Sub.
Attiva l'elaborazione delle immagini Dataflow caricando i sei file di esempio nel bucket di input:
gcloud storage cp data-sample/* gs://${IMAGE_BUCKET}
Nella console Google Cloud , individua il riquadro Contatori personalizzati e utilizzalo per esaminare i contatori personalizzati in Dataflow e verificare che Dataflow abbia elaborato tutte e sei le immagini. Puoi utilizzare la funzionalità di filtro del riquadro per passare alle metriche corrette. Per visualizzare solo i contatori che iniziano con il prefisso
numberOf
, digitanumberOf
nel filtro.In Cloud Shell, verifica che le tabelle siano state create automaticamente:
bq query --nouse_legacy_sql "SELECT table_name FROM ${BIGQUERY_DATASET}.INFORMATION_SCHEMA.TABLES ORDER BY table_name"
L'output è il seguente:
+----------------------+ | table_name | +----------------------+ | crop_hint_annotation | | face_annotation | | image_properties | | label_annotation | | landmark_annotation | | logo_annotation | +----------------------+
Visualizza lo schema della tabella
landmark_annotation
. La funzionalitàLANDMARK_DETECTION
acquisisce gli attributi restituiti dalla chiamata API.bq show --schema --format=prettyjson ${BIGQUERY_DATASET}.landmark_annotation
L'output è il seguente:
[ { "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" } ]
Visualizza i dati di annotazione prodotti dall'API eseguendo i seguenti comandi
bq query
per visualizzare tutti i punti di riferimento trovati in queste sei immagini ordinati in base al punteggio più probabile: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"
L'output è simile al seguente:
+------------------+-------------------+------------+---------------------------------+ | 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)"] | +------------------+-------------------+------------+---------------------------------+
Per descrizioni dettagliate di tutte le colonne specifiche per le annotazioni, vedi
AnnotateImageResponse
.Per arrestare la pipeline di streaming, esegui il seguente comando. La pipeline continua a essere eseguita anche se non ci sono altre notifiche Pub/Sub da elaborare.
gcloud dataflow jobs cancel --region ${REGION} $(gcloud dataflow jobs list --region ${REGION} --filter="NAME:test-vision-analytics AND STATE:Running" --format="get(JOB_ID)")
La sezione seguente contiene altre query di esempio che analizzano diverse caratteristiche delle immagini.
In Cloud Shell, modifica i parametri della pipeline Dataflow in modo che sia ottimizzata per un set di dati di grandi dimensioni. Per consentire una velocità effettiva maggiore, aumenta anche i valori
batchSize
ekeyRange
. Dataflow scala il numero di worker in base alle necessità:./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"
Poiché il set di dati è di grandi dimensioni, non puoi utilizzare Cloud Shell per recuperare le immagini da Kaggle e inviarle al bucket Cloud Storage. Per farlo, devi utilizzare una VM con un disco di dimensioni maggiori.
Per recuperare le immagini basate su Kaggle e inviarle al bucket Cloud Storage, segui le istruzioni nella sezione Simula il caricamento delle immagini nel bucket di archiviazione del repository GitHub.
Per osservare l'avanzamento del processo di copia esaminando le metriche personalizzate disponibili nell'interfaccia utente di Dataflow, vai alla pagina Job Dataflow e seleziona la pipeline
vision-analytics-flickr
. I contatori del cliente devono cambiare periodicamente finché la pipeline Dataflow non elabora tutti i file.L'output è simile allo screenshot seguente del pannello Contatori personalizzati. Uno dei file nel set di dati è del tipo errato e il contatore
rejectedFiles
lo riflette. Questi valori del contatore sono approssimativi. Potresti visualizzare numeri più alti. Inoltre, il numero di annotazioni cambierà molto probabilmente a causa della maggiore precisione dell'elaborazione da parte dell'API Vision.Per determinare se ti stai avvicinando o superando le risorse disponibili, consulta la pagina relativa alla quota dell'API Vision.
Nel nostro esempio, la pipeline Dataflow ha utilizzato solo circa il 50% della quota. In base alla percentuale di quota utilizzata, puoi decidere di aumentare il parallelismo della pipeline aumentando il valore del parametro
keyRange
.Arresta la pipeline:
gcloud dataflow jobs list --region $REGION --filter="NAME:vision-analytics-flickr AND STATE:Running" --format="get(JOB_ID)"
Nella console Google Cloud , vai alla pagina Editor di query di BigQuery ed esegui il seguente comando per visualizzare le prime 20 etichette nel set di dati:
SELECT description, count(*)ascount \ FROM vision_analytics.label_annotation GROUP BY description ORDER BY count DESC LIMIT 20
L'output è simile al seguente:
+------------------+-------+ | 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 | +------------------+-------+
Determina quali altre etichette sono presenti in un'immagine con una determinata etichetta, classificate in base alla frequenza:
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;
L'output è il seguente. Per l'etichetta Strumenti a corda pizzicata utilizzata nel comando precedente, dovresti visualizzare:
+------------------------------+-------+------+ | 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 | +------------------------------+-------+------+
Visualizza i primi 10 punti di riferimento rilevati:
SELECT description, COUNT(description) AS count FROM vision_analytics.landmark_annotation GROUP BY description ORDER BY count DESC LIMIT 10
L'output è il seguente:
+--------------------+-------+ | 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 | +--------------------+-------+
Determina le immagini che con maggiore probabilità contengono cascate:
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
L'output è il seguente:
+----------------+----------------------------+-----------+ | 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 | +----------------+----------------------------+-----------+
Trova immagini di punti di riferimento entro 3 chilometri dal Colosseo di Roma (la funzione
ST_GEOPOINT
utilizza la longitudine e la latitudine del Colosseo):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
Quando esegui la query, vedrai che ci sono più immagini del Colosseo, ma anche immagini dell'Arco di Costantino, del Palatino e di una serie di altri luoghi fotografati di frequente.
Puoi visualizzare i dati in BigQuery Geo Viz incollando la query precedente. Seleziona un punto sulla mappa per visualizzarne i dettagli. L'attributo
Image_url
contiene un link al file immagine.- 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.
- Per ulteriori architetture di riferimento, diagrammi e best practice, esplora il Cloud Architecture Center.
- Masud Hasan | Site Reliability Engineering Manager
- Sergei Lilichenko | Solutions Architect
- Lakshmanan Sethu | Technical Account Manager
- Jiyeon Kang | Customer Engineer
- Sunil Kumar Jang Bahadur | Customer Engineer
Esecuzione della pipeline Dataflow per tutte le funzionalità dell'API Vision implementate
La pipeline Dataflow richiede ed elabora un insieme specifico di funzionalità e attributi dell'API Vision all'interno dei file annotati.
I parametri elencati nella tabella seguente sono specifici della pipeline Dataflow in questo deployment. Per l'elenco completo dei parametri di esecuzione standard di Dataflow, consulta Impostare le opzioni della pipeline Dataflow.
Nome parametro | Descrizione |
---|---|
|
Il numero di immagini da includere in una richiesta all'API Vision. Il valore predefinito è 1. Puoi aumentare questo valore fino a un massimo di 16. |
|
Il nome del set di dati BigQuery di output. |
|
Un elenco di funzionalità di elaborazione delle immagini. La pipeline supporta le funzionalità di etichetta, punto di riferimento, logo, volto, suggerimento di ritaglio e proprietà dell'immagine. |
|
Il parametro che definisce il numero massimo di chiamate parallele all'API Vision. Il valore predefinito è 1. |
|
Parametri stringa con nomi di tabelle per varie annotazioni. I valori predefiniti sono forniti per ogni tabella, ad esempio label_annotation . |
|
Il periodo di tempo da attendere prima di elaborare le immagini quando è presente un batch incompleto di immagini. Il valore predefinito è 30 secondi. |
|
L'ID dell'abbonamento Pub/Sub che riceve le notifiche di Cloud Storage di input. |
|
L'ID progetto da utilizzare per l'API Vision. |
Analisi di un set di dati Flickr30K
In questa sezione, rileva etichette e punti di riferimento nel set di dati di immagini Flickr30k pubblico ospitato su Kaggle.
Analizzare le annotazioni in BigQuery
In questo deployment, hai elaborato più di 30.000 immagini per l'annotazione di etichette e punti di riferimento. In questa sezione, raccogli le statistiche su questi file. Puoi eseguire queste query nello spazio di lavoro GoogleSQL per BigQuery oppure utilizzare lo strumento a riga di comando bq.
Tieni presente che i numeri visualizzati possono variare rispetto ai risultati della query di esempio in questo deployment. L'API Vision migliora costantemente l'accuratezza dell'analisi; può produrre risultati più ricchi analizzando la stessa immagine dopo aver inizialmente testato la soluzione.
Una nota sui risultati delle query. Le informazioni sulla posizione sono in genere presenti per
i punti di riferimento. La stessa immagine può contenere più posizioni dello stesso punto di riferimento.
Questa funzionalità è descritta nel tipo
AnnotateImageResponse
.
Poiché una posizione può indicare la posizione della scena nell'immagine, possono essere presenti più elementi LocationInfo
. Un'altra posizione può indicare dove è stata
scattata l'immagine.
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questa guida, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Elimina il progetto Google Cloud
Il modo più semplice per eliminare la fatturazione è eliminare il progetto Google Cloud che hai creato per il tutorial.
Se decidi di eliminare le risorse singolarmente, segui i passaggi descritti nella sezione Pulizia del repository GitHub.
Passaggi successivi
Collaboratori
Autori:
Altri collaboratori: