Esegui il deployment di una soluzione di analisi della visione basata sull'IA con Dataflow e l'API Cloud Vision

Last reviewed 2024-05-16 UTC

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 per scopi analitici o per addestrare i 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 requisiti di scalabilità.

Queste istruzioni sono rivolte 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 Java, GoogleSQL per BigQuery e script shell di base. Presuppone inoltre che tu abbia familiarità con l'API Vision.

Architettura

Il seguente diagramma illustra il flusso di sistema per la creazione di una soluzione di analisi della visione ML.

Un'architettura che mostra il flusso di informazioni per i processi di importazione e trigger, elaborazione, archiviazione e analisi.

Nel diagramma precedente, le informazioni scorrono attraverso l'architettura come segue:

  1. Un client carica i file immagine in un bucket Cloud Storage.
  2. Cloud Storage invia un messaggio sul caricamento dei dati a Pub/Sub.
  3. Pub/Sub notifica a Dataflow il caricamento.
  4. La pipeline Dataflow invia le immagini all' API Vision.
  5. L'API Vision elabora le immagini e restituisce le annotazioni.
  6. 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à di 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.

I nuovi Google Cloud utenti potrebbero avere diritto a una prova senza costi.

Al termine della creazione dell'applicazione di esempio, puoi evitare l'addebito di ulteriori costi eliminando le risorse create. Per saperne di più, consulta Liberare spazio.

Prima di iniziare

  1. Accedi al tuo Google Cloud account. Se non hai mai utilizzato Google Cloud, crea un account per valutare il rendimento dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
  2. 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 role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. 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 role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Nella Google Cloud console, attiva Cloud Shell.

    Attiva Cloud Shell

    Nella parte inferiore della Google Cloud console viene avviata una sessione di Cloud Shell e viene visualizzato un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già incluso e installato e con valori già impostati per il progetto corrente. L'inizializzazione della sessione può richiedere alcuni secondi.

  7. Clona il repository GitHub che contiene il codice sorgente della pipeline Dataflow:
        git clone
        https://github.com/GoogleCloudPlatform/dataflow-vision-analytics.git
        
  8. Vai alla cartella principale del repository:
        cd dataflow-vision-analytics
        
  9. Segui le istruzioni nella Guida introduttiva sezione del repository dataflow-vision-analytics in GitHub per svolgere le seguenti attività:
    • Abilita diverse API.
    • Crea un bucket Cloud Storage.
    • Crea un argomento e una sottoscrizione Pub/Sub.
    • Crea un set di dati BigQuery.
    • Configura diverse variabili di ambiente per questo deployment.

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

batchSize

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.

datasetName

Il nome del set di dati BigQuery di output.

features

Un elenco di funzionalità di elaborazione delle immagini features. La pipeline supporta le funzionalità di etichetta, punto di riferimento, logo, volto, suggerimento di ritaglio e proprietà dell'immagine.

keyRange

Il parametro che definisce il numero massimo di chiamate parallele all'API Vision. Il valore predefinito è 1.

labelAnnottationTable,
landmarkAnnotationTable,
logoAnnotationTable,
faceAnnotationTable,
imagePropertiesTable,
cropHintAnnotationTable,
errorLogTable

Parametri stringa con nomi di tabella per varie annotazioni. I valori predefiniti vengono forniti per ogni tabella, ad esempio label_annotation.

maxBatchCompletionDurationInSecs

Il periodo di tempo di attesa prima di elaborare le immagini quando è presente un batch di immagini incompleto. Il valore predefinito è 30 secondi.

subscriberId

L'ID della sottoscrizione Pub/Sub che riceve le notifiche di input di Cloud Storage.

visionApiProjectId

L'ID progetto da utilizzare per l'API Vision.
  1. In Cloud Shell, esegui il comando seguente 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"
    

    Il account di servizio dedicato deve disporre dell'accesso in lettura al bucket contenente le immagini. In altre parole, questo account deve avere il ruolo roles/storage.objectViewer concesso su questo bucket.

    Per ulteriori informazioni sull'utilizzo di un account di servizio dedicato, consulta Sicurezza e autorizzazioni di Dataflow.

  2. Apri l'URL visualizzato in una nuova scheda del browser o vai alla pagina Job di Dataflow e seleziona la pipeline test-vision-analytics.

    Dopo alcuni secondi, viene visualizzato il grafico del job Dataflow:

    Diagramma del workflow per il job Dataflow.

    La pipeline Dataflow è ora in esecuzione e in attesa di ricevere notifiche di input dalla sottoscrizione Pub/Sub.

  3. Attiva l'elaborazione delle immagini di Dataflow caricando i sei file di esempio nel bucket di input:

    gcloud storage cp data-sample/* gs://${IMAGE_BUCKET}
    
  4. Nella Google Cloud console, 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, digita numberOf nel filtro.

    Elenco dei contatori filtrato per mostrare solo quelli che iniziano con `numberof`.

  5. 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      |
    +----------------------+
    
  6. 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"
       }
    ]
    
  7. 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 ordinate 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.

  8. Per arrestare la pipeline di streaming, esegui il comando seguente. La pipeline continua a essere eseguita anche se non sono presenti 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 funzionalità delle immagini.

Analisi di un set di dati Flickr30K

In questa sezione, rileverai etichette e punti di riferimento nel set di dati di immagini pubblici Flickr30k ospitato su Kaggle.

  1. 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 maggiore velocità effettiva, aumenta anche i valori batchSize e keyRange. Dataflow scala il numero di worker in base alle esigenze:

    ./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 dimensioni del disco maggiori.

  2. 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 nel repository GitHub.

  3. Per osservare l'avanzamento del processo di copia esaminando le metriche personalizzate disponibili nell'interfaccia utente di Dataflow, vai alla pagina Job di Dataflow e seleziona la vision-analytics-flickr pipeline. I contatori dei clienti devono cambiare periodicamente finché la pipeline Dataflow non elabora tutti i file.

    L'output è simile alla seguente schermata del riquadro Contatori personalizzati. Uno dei file nel set di dati è del tipo errato e il contatore rejectedFiles lo riflette. Questi valori dei contatori sono approssimativi. Potresti visualizzare numeri più elevati. Inoltre, il numero di annotazioni cambierà molto probabilmente a causa della maggiore accuratezza dell'elaborazione da parte dell'API Vision.

    Elenco dei contatori associati all'elaborazione delle immagini basate su Kaggle.

    Per determinare se ti stai avvicinando o superando le risorse disponibili, consulta la pagina della quota dell'API Vision.

    Nel nostro esempio, la pipeline Dataflow ha utilizzato solo circa il 50% della sua quota. In base alla percentuale della quota utilizzata, puoi decidere di aumentare il parallelismo della pipeline aumentando il valore del parametro keyRange.

  4. Arresta la pipeline:

    gcloud dataflow jobs list --region $REGION --filter="NAME:vision-analytics-flickr AND STATE:Running" --format="get(JOB_ID)"
    

Analisi delle 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, raccoglierai 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 delle query di esempio in questo deployment. L'API Vision migliora costantemente l'accuratezza dell'analisi; può produrre risultati più completi analizzando la stessa immagine dopo aver testato inizialmente la soluzione.

  1. Nella Google Cloud console, vai alla pagina Editor di query di BigQuery ed esegui il comando seguente per visualizzare le prime 20 etichette nel set di dati:

    Vai all'editor di query

    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 |
    +------------------+-------+
    
  2. Determina quali altre etichette sono presenti in un'immagine con un'etichetta specifica, 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 Plucked string instruments 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 |
    +------------------------------+-------+------+
    
  3. 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 |
      +--------------------+-------+
      

  4. 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 |
    +----------------+----------------------------+-----------+
    
  5. Trova le immagini dei 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 sono presenti 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.

    Mappa delle località e della loro distanza dal Colosseo.

Una nota sui risultati delle query. Le informazioni sulla località sono in genere presenti per i punti di riferimento. La stessa immagine può contenere più località dello stesso punto di riferimento. Questa funzionalità è descritta nel AnnotateImageResponse tipo.

Poiché una località può indicare la località della scena nell'immagine, possono essere presenti più elementi LocationInfo. Un'altra località può indicare dove è stata scattata l'immagine.

Libera spazio

Per evitare che al tuo Google Cloud account 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 Google Cloud progetto

Il modo più semplice per eliminare la fatturazione è eliminare il Google Cloud progetto creato per il tutorial.

  1. Nella Google Cloud console, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID progetto e fai clic su Chiudi per eliminare il progetto.

Se decidi di eliminare le risorse singolarmente, segui i passaggi descritti nella sezione Esegui la pulizia del repository GitHub.

Passaggi successivi

Collaboratori

Autori:

Altri collaboratori: