Tutorial: analizzare una tabella di oggetti utilizzando una funzione remota

Questo tutorial mostra come creare una tabella degli oggetti basata sulle immagini del set di dati flowers, creare una funzione remota che etichetta le immagini utilizzando l'API Cloud Vision e quindi analizzare le immagini nella tabella degli oggetti utilizzando la funzione remota.

Autorizzazioni obbligatorie

  • Per creare il set di dati, devi disporre dell'autorizzazione bigquery.datasets.create.
  • Per creare la risorsa di connessione, devi disporre delle seguenti autorizzazioni:

    • bigquery.connections.create
    • bigquery.connections.get
  • Per concedere le autorizzazioni all'account di servizio della connessione, devi disporre della seguente autorizzazione:

    • resourcemanager.projects.setIamPolicy
  • Per creare la tabella degli oggetti, devi disporre delle seguenti autorizzazioni:

    • bigquery.tables.create
    • bigquery.tables.update
    • bigquery.connections.delegate
  • Per creare la funzione remota, devi avere le autorizzazioni associate al ruolo Sviluppatore Cloud Functions.

  • Per richiamare la funzione remota, devi disporre del ruolo Invoker di Cloud Run.

  • Per analizzare la tabella degli oggetti con la funzione remota, devi disporre dell'autorizzazione bigquery.tables.getData sulla tabella degli oggetti.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

  • BigQuery: You incur storage costs for the object table you create in BigQuery.
  • Cloud Functions: You incur costs for invoking the remote function and for any compute resources it uses, including calls to Cloud Vision API.

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Per ulteriori informazioni sui prezzi di Cloud Storage, consulta la pagina Prezzi di Cloud Storage.

Per ulteriori informazioni sui prezzi dell'archiviazione di BigQuery, consulta Prezzi dell'archiviazione nella documentazione di BigQuery.

Per ulteriori informazioni sui prezzi di Cloud Functions, consulta la pagina dei prezzi di Cloud Functions.

Per ulteriori informazioni sui prezzi dell'API Vision, consulta la pagina relativa ai prezzi di Cloud Vision nella documentazione di Vision.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Abilita le API BigQuery, BigQuery Connection API, and Cloud Functions.

    Abilita le API

  5. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  6. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  7. Abilita le API BigQuery, BigQuery Connection API, and Cloud Functions.

    Abilita le API

crea una funzione Cloud Functions

Per creare una funzione, segui questi passaggi:

  1. Vai alla pagina Cloud Functions.

    Vai a Cloud Functions

  2. Fai clic su Crea funzione.

  3. Per Ambiente, seleziona 2a generazione.

  4. In Nome funzione, digita vision-ai.

  5. Tocca Avanti.

  6. In Runtime, seleziona Python 3.9.

  7. In Punto di ingresso, digita label_detection.

  8. Seleziona main.py. Copia e incolla il seguente codice:

    Python

    import urllib.request
    
    import flask
    import functions_framework
    from google.cloud import vision
    
    
    @functions_framework.http
    def label_detection(request: flask.Request) -> flask.Response:
        """BigQuery remote function to label input images.
        Args:
            request: HTTP request from BigQuery
            https://cloud.google.com/bigquery/docs/reference/standard-sql/remote-functions#input_format
        Returns:
            HTTP response to BigQuery
            https://cloud.google.com/bigquery/docs/reference/standard-sql/remote-functions#output_format
        """
        try:
            client = vision.ImageAnnotatorClient()
            calls = request.get_json()["calls"]
            replies = []
            for call in calls:
                content = urllib.request.urlopen(call[0]).read()
                results = client.label_detection({"content": content})
                replies.append(vision.AnnotateImageResponse.to_dict(results))
            return flask.make_response(flask.jsonify({"replies": replies}))
        except Exception as e:
            return flask.make_response(flask.jsonify({"errorMessage": str(e)}), 400)
    
    

  9. Seleziona requirements.txt. Copia e incolla il seguente testo:

    Flask==2.2.2
    functions-framework==3.5.0
    google-cloud-vision==3.4.2
    Werkzeug==2.3.7
    

  10. Fai clic su Esegui il deployment.

  11. Al termine del deployment della funzione, fai clic sulla scheda Trigger.

  12. Copia il valore dell'URL di attivazione e salvalo da qualche parte. Queste informazioni sono necessarie quando crei la funzione remota.

crea un set di dati

Crea un set di dati denominato remote_function_test:

SQL

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel riquadro Editor, esegui la seguente istruzione SQL:

    CREATE SCHEMA `PROJECT_ID.remote_function_test`;
    

    Sostituisci PROJECT_ID con l'ID progetto.

bq

  1. Nella console Google Cloud, attiva Cloud Shell.

    Attivare Cloud Shell

  2. Esegui il comando bq mk per creare il set di dati:

      bq mk --dataset --location=us PROJECT_ID:remote_function_test
      

    Sostituisci PROJECT_ID con l'ID progetto.

Creazione di una connessione

Crea una connessione denominata lake-connection:

Console

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Fai clic su Aggiungi dati e poi su Origine dati esterna.

  3. Nell'elenco Tipo di connessione, seleziona BigLake e funzioni remote (Cloud Resource).

  4. Nel campo ID connessione, digita lake-connection.

  5. Fai clic su Crea connessione.

  6. Nel riquadro Informazioni sulla connessione, copia il valore del campo ID account di servizio e salvalo da qualche parte. Queste informazioni sono necessarie per concedere le autorizzazioni all'account di servizio della connessione.

bq

  1. In Cloud Shell, esegui il comando bq mk per creare la connessione:

    bq mk --connection --location=us --connection_type=CLOUD_RESOURCE \
    lake-connection
    
  2. Esegui il comando bq show per recuperare le informazioni sulla connessione:

    bq show --connection us.lake-connection
    
  3. Dalla colonna properties, copia il valore della proprietà serviceAccountId e salvalo da qualche parte. Queste informazioni sono necessarie per concedere le autorizzazioni all'account di servizio della connessione.

Crea un bucket Cloud Storage

Crea un bucket Cloud Storage che contenga il set di dati Flowers.

Concedi le autorizzazioni all'account di servizio della connessione

Per concedere le autorizzazioni all'account di servizio:

  1. Vai alla pagina IAM e amministrazione.

    Vai a IAM e amministrazione

  2. Fai clic su Concedi l'accesso.

    Viene visualizzata la finestra di dialogo Aggiungi entità.

  3. Nel campo Nuove entità, inserisci l'ID account di servizio che hai copiato in precedenza.

  4. Nel campo Seleziona un ruolo, seleziona Cloud Run, quindi seleziona Invoker di Cloud Run.

  5. Fai clic su Aggiungi un altro ruolo.

  6. Nel campo Seleziona un ruolo, seleziona Cloud Storage e poi Visualizzatore oggetti Storage.

  7. Fai clic su Salva.

Carica il set di dati in Cloud Storage

Recupera i file del set di dati e rendili disponibili in Cloud Storage:

  1. Scarica il set di dati "Fiori" sulla tua macchina locale.
  2. Carica il set di dati nel bucket che hai creato in precedenza.

Crea una tabella di oggetti

Crea una tabella oggetto denominata sample_images basata sul set di dati dei fiori che hai caricato:

SQL

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel riquadro Editor, esegui la seguente istruzione SQL:

    CREATE EXTERNAL TABLE remote_function_test.sample_images
    WITH CONNECTION `us.lake-connection`
    OPTIONS(
      object_metadata = 'SIMPLE',
      uris = ['gs://BUCKET_NAME/*']);
    

    Sostituisci BUCKET_NAME con il nome del bucket che hai creato in precedenza.

bq

In Cloud Shell, esegui il comando bq mk per creare la connessione:

bq mk --table \
--external_table_definition=gs:"//BUCKET_NAME/*@us.lake-connection" \
--object_metadata=SIMPLE \
remote_function_test.sample_images

Sostituisci BUCKET_NAME con il nome del bucket che hai creato in precedenza.

Crea la funzione remota di BigQuery

Crea una funzione remota denominata label_detection:

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel riquadro Editor, esegui la seguente istruzione SQL:

    CREATE OR REPLACE FUNCTION `remote_function_test.label_detection` (signed_url_ STRING) RETURNS JSON
    REMOTE WITH CONNECTION `us.lake-connection`
    OPTIONS(
    endpoint = 'TRIGGER_URL',
    max_batching_rows = 1
    );
    

    Sostituisci TRIGGER_URL con l'URL dell'attivatore che hai salvato in precedenza. L'URL dovrebbe essere simile a https://vision-ai-1abcd2efgh-uc.a.run.app.

Chiamare la funzione remota

Richiama la funzione remota label_detection nella tabella degli oggetti sample_images:

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel riquadro Editor, esegui la seguente istruzione SQL:

    SELECT uri, remote_function_test.label_detection(signed_url)
    FROM EXTERNAL_OBJECT_TRANSFORM(
    TABLE remote_function_test.sample_images,
    ["SIGNED_URL"]
    )
    LIMIT 100;
    

    I risultati dovrebbero essere simili ai seguenti:

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    | uri                                                           | f0_                                                                                                            |
    —---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    |  gs://bq_huron_demo/flowers/daisy/100080576_f52e8ee070_n.jpg  |  {"face_annotations":[],"label_annotations":[{"confidence":0.0,"description":"Flower",                         |
    |                                                               |  "locale":"","locations":[],"mid":"/m/0c9ph5","properties":[],"score":0.9785631,"topicality":0.9785631},       |
    |                                                               |  {"confidence":0.0,"description":"Plant","locale":"","locations":[],"mid":"/m/05s2s","properties":[],          |
    |                                                               |  "Score":0.9635679,"topicality":0.9635679},{"confidence":0.0,"description":"camomile","locale":"",             |
    |                                                               |  "locations":[],"mid":"/m/011bc8hg","properties":[],"score":0.9110366,"topicality":0.9110366},                 |
    |                                                               |  {"confidence":0.0,"description":"Petal","locale":"","locations":[],"mid":"/m/016q19","properties":[],         |
    |                                                               |  "score":0.8927441,"topicality":0.8927441},{"confidence":0.0,"description":"Chamaemelum nobile","locale":"",   |
    |                                                               |  "locations":[],"mid":"/m/05cmcg","properties":[],"score":0.8460995,"topicality":0.8460995},                   |
    |                                                               |   {"confidence":0.0,"description":"Flowering plant","locale":"","locations":[],"mid":"/m/04sjm",               |
    |                                                               |  "properties":[],"score":0.7642974,"topicality":0.7642974},{"confidence":0.0,"description":"Annual plant",     |
    |                                                               |  "locale":"","locations":[],"mid":"/m/0jqb","properties":[],"score":0.7478164,                                 |
    |                                                               |  "topicality":0.7478164},{"confidence":0.0,"description":"Close-up","locale":"","locations":[],                |
    |                                                               |  "mid":"/m/02cqfm","properties":[],"score":0.7207553,"topicality":0.7207553},{"confidence":0.0,                |
    |                                                               |  "description":"Oxeye daisy","locale":"","locations":[],"mid":"/m/02qvnf","properties":[],                     |
    |                                                               |  "score":0.71786934,"topicality":0.71786934},{"confidence":0.0,"description":"Daisy family","locale":"",       |
    |                                                               |  "locations":[],"mid":"/m/0l5r","properties":[],"score":0.7164383,"topicality":0.7164383}],                    |
    |                                                               |  "landmark_annotations":[],"localized_object_annotations":[],"logo_annotations":[],"text_annotations":[]}      |
    —---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    | gs://bq_huron_demo/flowers/daisy/10140303196_b88d3d6cec.jpg   |  {"face_annotations":[],"label_annotations":[{"confidence":0.0,"description":"Flower","locale":"",             |
    |                                                               |  "locations":[],"mid":"/m/0c9ph5","properties":[],"score":0.9770426,"topicality":0.9770426},                   |
    |                                                               |  {"confidence":0.0,"description":"Plant","locale":"","locations":[],"mid":"/m/05s2s",                          |
    |                                                               |  "Properties":[],"score":0.95798975,"topicality":0.95798975},{"confidence":0.0,                                |
    |                                                               |  "description":"Petal","locale":"","locations":[],"mid":"/m/016q19","properties":[],                           |
    |                                                               |  "score":0.88984144,"topicality":0.88984144},{"confidence":0.0,"description":"Yellow",                         |
    |                                                               |  "locale":"","locations":[],"mid":"/m/088fh","properties":[],"score":0.84456813,                               |
    |                                                               |  "Topicality":0.84456813},{"confidence":0.0,"description":"camomile","locale":"",                              |
    |                                                               |  "locations":[],"mid":"/m/011bc8hg","properties":[],"score":0.7926449, "topicality":0.7926449},                |
    |                                                               |  {"confidence":0.0,"description":"Annual plant","locale":"","locations":[],"mid":"/m/0jqb",                    |
    |                                                               |  "Properties":[],"score":0.75020844, "topicality":0.75020844},{"confidence":0.0,                               |
    |                                                               |  "description":"Flowering plant","locale":"","locations":[],"mid":"/m/04sjm",                                  |
    |                                                               |  "Properties":[],"score":0.7403478,"topicality":0.7403478},{"confidence":0.0,                                  |
    |                                                               |  "description":"Chamaemelum nobile","locale":"","locations":[],"mid":"/m/05cmcg",                              |
    |                                                               |  "Properties":[],"score":0.7264577,"topicality":0.7264577},{"confidence":0.0,                                  |
    |                                                               |  "description":"Close-up","locale":"","locations":[],"mid":"/m/02cqfm","properties":[],                        |
    |                                                               |  "score":0.721242,"topicality":0.721242},{"confidence":0.0,"description":"Daisy family",                       |
    |                                                               |  "locale":"","locations":[],"mid":"/m/0l5r","properties":[],"score":0.7012979,                                 |
    |                                                               |  "Topicality":0.7012979}],"landmark_annotations":[],"localized_object_annotations":[],                         |
    |                                                               |  "logo_annotations":[],"text_annotations":[]}                                                                  |
    —------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------
    
    

Esegui la pulizia

  1. Nella console Google Cloud, 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 del progetto e fai clic su Chiudi per eliminare il progetto.