Questo documento di deployment descrive come eseguire il deployment Dataflow per elaborare i file immagine su larga scala con API Cloud Vision. Questa pipeline archivia i risultati dei file elaborati in BigQuery. Puoi utilizzare i file per scopi analitici o per addestrare Modelli BigQuery ML.
La pipeline Dataflow che crei in questo deployment può elaborare milioni di immagini al giorno. L'unico limite è Quota dell'API Vision. Puoi aumentare la quota dell'API Vision in base alla tua scala i tuoi requisiti.
Queste istruzioni sono rivolte a data engineer e data scientist. Questo documento presuppone che tu abbia una conoscenza di base della creazione di Dataflow pipeline utilizzando SDK Java di Apache Beam, GoogleSQL per BigQuery e scripting shell di base. Inoltre, si presuppone che tu abbia familiarità con l'API Vision.
Architettura
Il seguente diagramma illustra il flusso di sistema per la creazione di una visione ML soluzione di analisi dei dati.
Nel diagramma precedente, le informazioni fluiscono attraverso l'architettura come segue:
- Un client carica i file immagine in un bucket Cloud Storage.
- Cloud Storage invia un messaggio sul caricamento dei dati a in Pub/Sub.
- Pub/Sub invia una notifica a Dataflow del caricamento.
- La pipeline Dataflow invia le immagini API Vision.
- L'API Vision elabora le immagini, quindi restituisce le annotazioni.
- La pipeline invia i file annotati a BigQuery per te da analizzare.
Obiettivi
- Crea una pipeline Apache Beam per l'analisi delle immagini caricate in Cloud Storage.
- Utilizza le funzionalità di Dataflow Runner v2 eseguire la pipeline Apache Beam in modalità flusso di dati per analizzare le immagini vengono caricati.
- Utilizza l'API Vision per analizzare le immagini per un insieme di tipi di caratteristiche.
- Analizza le annotazioni con BigQuery.
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Quando finisci di creare l'applicazione di esempio, puoi evitare ed eliminare le risorse che hai creato. Per ulteriori informazioni, vedi Esegui la pulizia.
Prima di iniziare
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
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 del
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
Come iniziare
del repository dataflow-vision-analytics in GitHub per
svolgere le seguenti attività:
- Abilita diverse API.
- Creare un bucket Cloud Storage.
- Creare un argomento e una sottoscrizione Pub/Sub.
- Creare un set di dati BigQuery.
- Configura diverse variabili di ambiente per questo deployment.
Esecuzione della pipeline Dataflow per tutte le funzionalità implementate dell'API Vision
La pipeline Dataflow richiede ed elabora un set specifico di Funzionalità e attributi dell'API Vision all'interno dei file annotati.
I parametri elencati nella seguente tabella sono specifici per i Dataflow in questo deployment. Per l'elenco completo i 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 a API Vision. Il valore predefinito è 1. Puoi aumentare questo valore 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 etichetta, punto di riferimento, logo, volto, suggerimento di ritaglio e proprietà dell'immagine le funzionalità di machine learning. |
|
Il parametro che definisce il numero massimo di chiamate parallele a API Vision. Il valore predefinito è 1. |
|
Parametri stringa con nomi tabella per varie annotazioni. La
Per ogni tabella vengono forniti valori predefiniti, ad esempio
label_annotation . |
|
Il tempo di attesa prima di elaborare le immagini in presenza di un'immagine incompleta gruppo di immagini. Il valore predefinito è 30 secondi. |
|
L'ID della sottoscrizione Pub/Sub che riceve le notifiche di Cloud Storage di input. |
|
L'ID progetto da utilizzare per l'API Vision. |
In Cloud Shell, esegui questo comando per elaborare le immagini per tutti i tipi di caratteristiche 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 avere accesso in lettura al bucket che contengono le immagini. In altre parole, tale account deve avere Ruolo
roles/storage.objectViewer
concesso per il bucket.Per ulteriori informazioni sull'uso di un account di servizio dedicato, vedi Sicurezza e autorizzazioni di Dataflow.
Apri l'URL visualizzato in una nuova scheda del browser oppure visita Job Dataflow e seleziona la pipeline test-vision-analytics.
Dopo alcuni secondi, viene visualizzato il grafico del job Dataflow:
La pipeline Dataflow è ora in esecuzione e in attesa di ricevere e inviare notifiche di input dalla sottoscrizione Pub/Sub.
Attiva l'elaborazione delle immagini Dataflow caricando i sei esempi nel bucket di input:
gcloud storage cp data-sample/* gs://${IMAGE_BUCKET}
Nella console Google Cloud, individua il riquadro Contatori personalizzati e utilizza per esaminare i contatori personalizzati in Dataflow e verificare che Dataflow ha elaborato tutte e sei le immagini. Puoi utilizzare lo la funzionalità di filtro del riquadro per accedere alle metriche corrette. A visualizza solo i contatori che iniziano con il prefisso
numberOf
, digitanumberOf
nel filtro.In Cloud Shell, verifica che le tabelle siano state automaticamente creato:
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 per la tabella
landmark_annotation
. LaLANDMARK_DETECTION
acquisizione di funzionalità 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 quanto segue
bq query
comandi per vedere 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 delle annotazioni, consulta
AnnotateImageResponse
Per arrestare la pipeline in modalità flusso, esegui questo comando. La pipeline continua a essere eseguita anche se non ci sono più Pub/Sub notifiche per l'elaborazione.
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 seguente sezione contiene altri esempi di query che analizzano caratteristiche delle immagini.
Analisi di un set di dati Flickr30K
In questa sezione, vengono rilevate le etichette e i punti di riferimento visibili al pubblico Set di dati immagine Flickr30k ospitato su Kaggle.
In Cloud Shell, modifica la pipeline Dataflow. in modo che sia ottimizzato per un set di dati di grandi dimensioni. Per consentire una maggiore aumenta anche la
batchSize
ekeyRange
valori. Dataflow scala il numero di worker necessario:./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 è grande, non puoi utilizzare Cloud Shell recupera le immagini da Kaggle e inviale a Cloud Storage di sincronizzare la directory di una VM con un bucket. Per farlo, devi usare una VM con una dimensione del disco maggiore.
Per recuperare le immagini basate su Kaggle e inviarle al per il bucket Cloud Storage, segui le istruzioni nel Simula le immagini che vengono caricate nel bucket di archiviazione nel repository GitHub.
Per osservare l'avanzamento del processo di copia esaminando il prompt personalizzato disponibili nell'interfaccia utente di Dataflow, Job Dataflow e seleziona la pipeline
vision-analytics-flickr
. Il cliente devono cambiare periodicamente fino a quando la funzione Dataflow la pipeline elabora tutti i file.L'output è simile al seguente screenshot dei contatori personalizzati dal riquadro. Uno dei file nel set di dati è di tipo errato e il contatore
rejectedFiles
riflette questo dato. Questi i valori del contatore sono approssimativi. Potresti vedere numeri più alti. Inoltre, di annotazioni molto probabilmente cambierà per via della maggiore accuratezza delle l'elaborazione da parte dell'API Vision.Per determinare se ti stai avvicinando o superando la soglia disponibile vedi la pagina delle quote dell'API Vision.
Nel nostro esempio, la pipeline Dataflow ha utilizzato solo approssimativamente fino al 50% della sua quota. In base alla percentuale della quota utilizzata, puoi decidi 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)"
Analizza le annotazioni in BigQuery
In questo deployment, hai elaborato più di 30.000 immagini per etichette e di un punto di riferimento. In questa sezione verranno raccolte le statistiche relative a questi file. Puoi eseguire queste query in GoogleSQL per BigQuery oppure puoi usare lo strumento a riga di comando bq.
Tieni presente che i numeri visualizzati possono variare rispetto ai risultati di query di esempio in questo deployment. l'API Vision migliora costantemente l'accuratezza della propria analisi; può produrre risultati più completi analizzando la stessa immagine dopo per testare la soluzione.
Nella console Google Cloud, vai a BigQuery Editor di query ed esegui questo comando per visualizzare le prime 20 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 | +------------------+-------+
Stabilire quali altre etichette sono presenti in un'immagine con un particolare classificata per 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 pizzicate utilizzata nella precedente, dovresti vedere:
+------------------------------+-------+------+ | 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 10 principali 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 | +--------------------+-------+
Individua le immagini che molto probabilmente 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 nel raggio di 3 km dal Colosseo a 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 sono presenti più immagini Colosseo, ma anche immagini dell'Arco di Costantino, del Palatino, e in una serie di altri luoghi fotografati di frequente.
Puoi visualizzare i dati in Visualizzazione geografica BigQuery incollando nella query precedente. Seleziona un punto sulla mappa per vedere i suoi dettagli. L'attributo
Image_url
contiene un link al file immagine.
Una nota sui risultati delle query. In genere le informazioni sulla posizione sono
punti di riferimento. La stessa immagine può contenere più posizioni dello stesso punto di riferimento.
Questa funzionalità viene descritta
AnnotateImageResponse
di testo.
Poiché un luogo può indicare la posizione della scena nell'immagine,
più
LocationInfo
ed elementi di IA generativa. Un'altra posizione può indicare dove si trovava l'immagine
prese.
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse usati in questa guida, eliminare il progetto che contiene le risorse oppure il progetto ed eliminare le singole risorse.
Elimina il progetto Google Cloud
Il modo più semplice per eliminare la fatturazione è quello di eliminare il progetto Google Cloud che hai creato per il tutorial.
- Nella console Google Cloud, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.
Se decidi di eliminare le risorse singolarmente, segui i passaggi nella Pulisci del repository GitHub.
Passaggi successivi
- Per altre architetture di riferimento, diagrammi e best practice, esplora il Centro architetture cloud.
Collaboratori
Autori:
- Masud Hasan | Responsabile Site Reliability Engineering
- Sergei Lilichenko | Architetto di soluzioni
- Lakshmanan Sethu | Technical Account Manager
Altri collaboratori:
- Jiyeon Kang | Customer Engineer
- Sunil Kumar Jang Bahadur | Customer Engineer