Analizzare i dati multimodali in Python con BigQuery DataFrames

Questo tutorial mostra come analizzare i dati multimodali in un blocco note Python utilizzando metodi e classi di BigQuery DataFrames.

Questo tutorial utilizza il catalogo dei prodotti del set di dati pubblico del negozio di animali Cymbal.

Per caricare un notebook già compilato con le attività trattate in questo tutorial, consulta BigFrames Multimodal DataFrame.

Obiettivi

  • Crea DataFrame multimodali.
  • Combina i dati strutturati e non strutturati in un DataFrame.
  • Trasforma le immagini.
  • Genera testo ed embedding in base ai dati delle immagini.
  • Suddividi i PDF per ulteriori analisi.

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

  • BigQuery: you incur costs for the data that you process in BigQuery.
  • BigQuery Python UDFs: you incur costs for using BigQuery DataFrames image transformation and chunk PDF methods.
  • Cloud Storage: you incur costs for the objects stored in Cloud Storage.
  • Vertex AI: you incur costs for calls to Vertex AI models.

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 gratuita.

Per ulteriori informazioni, consulta le seguenti pagine dei prezzi:

Prima di iniziare

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery, BigQuery Connection, Cloud Storage, and Vertex AI APIs.

    Enable the APIs

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per completare questo tutorial, chiedi all'amministratore di concederti i seguenti ruoli IAM:

Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.

Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Configura

In questa sezione crei il bucket Cloud Storage, la connessione e il notebook utilizzati in questo tutorial.

Crea un bucket

Crea un bucket Cloud Storage per archiviare gli oggetti trasformati:

  1. Nella Google Cloud console, vai alla pagina Bucket.

    Vai a Bucket

  2. Fai clic su Crea.

  3. Nella pagina Crea un bucket, nella sezione Inizia, inserisci un nome univoco a livello globale che soddisfi i requisiti per i nomi dei bucket.

  4. Fai clic su Crea.

Crea una connessione

Crea una connessione a una risorsa Cloud e recupera il account di servizio della connessione. BigQuery utilizza la connessione per accedere agli oggetti in Cloud Storage.

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel riquadro Explorer, fai clic su Aggiungi dati.

    Viene visualizzata la finestra di dialogo Aggiungi dati.

  3. Nel riquadro Filtra per, seleziona Applicazioni aziendali nella sezione Tipo di origine dati.

    In alternativa, nel campo Cerca origini dati, puoi inserire Vertex AI.

  4. Nella sezione Origini dati in primo piano, fai clic su Vertex AI.

  5. Fai clic sulla scheda della soluzione Modelli Vertex AI: federazione BigQuery.

  6. Nell'elenco Tipo di connessione, seleziona Modelli remoti di Vertex AI, funzioni remote e BigLake (risorsa Cloud).

  7. Nel campo ID connessione, digita bigframes-default-connection.

  8. Fai clic su Crea connessione.

  9. Fai clic su Vai alla connessione.

  10. Nel riquadro Informazioni sulla connessione, copia l'ID account di servizio da utilizzare in un passaggio successivo.

Concedi le autorizzazioni all'account di servizio della connessione

Concedi all'account di servizio della connessione i ruoli di cui ha bisogno per accedere a Cloud Storage e Vertex AI. Devi concedere questi ruoli nello stesso progetto che hai creato o selezionato nella sezione Prima di iniziare.

Per concedere il ruolo, segui questi passaggi:

  1. Vai alla pagina IAM e amministrazione.

    Vai a IAM e amministrazione

  2. Fai clic su Concedi l'accesso.

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

  4. Nel campo Seleziona un ruolo, scegli Cloud Storage e poi Utente oggetto Storage.

  5. Fai clic su Aggiungi un altro ruolo.

  6. Nel campo Seleziona un ruolo, seleziona Vertex AI e poi Utente Vertex AI.

  7. Fai clic su Salva.

Crea un notebook

Crea un notebook in cui puoi eseguire codice Python:

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nella barra delle schede del riquadro dell'editor, fai clic sulla freccia menu a discesa accanto a Query SQL e poi su Notebook.

  3. Nel riquadro Inizia con un modello, fai clic su Chiudi.

  4. Fai clic su Connetti > Connetti a un runtime.

  5. Se hai già un runtime, accetta le impostazioni predefinite e fai clic su Connetti. Se non hai un ambiente di runtime esistente, seleziona Crea nuovo ambiente di runtime e poi fai clic su Connetti.

    La configurazione del runtime potrebbe richiedere diversi minuti.

Creare un DataFrame multimodale

Crea un dataframe multimodale che integra dati strutturati e non strutturati utilizzando il metodo from_glob_path della classe Session:

  1. Nel notebook, crea una cella di codice e copia il seguente codice al suo interno:
    import bigframes
    
    # Flags to control preview image/video preview size
    bigframes.options.display.blob_display_width = 300
    
    import bigframes.pandas as bpd
    
    # Create blob columns from wildcard path.
    df_image = bpd.from_glob_path(
        "gs://cloud-samples-data/bigquery/tutorials/cymbal-pets/images/*", name="image"
    )
    # Other ways are: from string uri column
    # df = bpd.DataFrame({"uri": ["gs://<my_bucket>/<my_file_0>", "gs://<my_bucket>/<my_file_1>"]})
    # df["blob_col"] = df["uri"].str.to_blob()
    
    # From an existing object table
    # df = bpd.read_gbq_object_table("<my_object_table>", name="blob_col")
    
    # Take only the 5 images to deal with. Preview the content of the Mutimodal DataFrame
    df_image = df_image.head(5)
    df_image
  2. Fai clic su Esegui.

    L'ultima chiamata a df_image restituisce le immagini aggiunte al DataFrame. In alternativa, puoi chiamare il metodo .display.

Combinare dati strutturati e non strutturati nel DataFrame

Combina i dati di testo e immagine nel DataFrame multimodale:

  1. Nel notebook, crea una cella di codice e copia il seguente codice al suo interno:
    # Combine unstructured data with structured data
    df_image["author"] = ["alice", "bob", "bob", "alice", "bob"]  # type: ignore
    df_image["content_type"] = df_image["image"].blob.content_type()
    df_image["size"] = df_image["image"].blob.size()
    df_image["updated"] = df_image["image"].blob.updated()
    df_image
  2. Fai clic su Esegui .

    Il codice restituisce i dati del DataFrame.

  3. Nel notebook, crea una cella di codice e copia il seguente codice al suo interno:

    # Filter images and display, you can also display audio and video types. Use width/height parameters to constrain window sizes.
    df_image[df_image["author"] == "alice"]["image"].blob.display()
  4. Fai clic su Esegui .

    Il codice restituisce le immagini dal DataFrame in cui il valore della colonna author è alice.

Eseguire trasformazioni delle immagini

Trasforma i dati delle immagini utilizzando i seguenti metodi della classe Series.BlobAccessor:

Le immagini trasformate vengono scritte in Cloud Storage.

Trasforma le immagini:

  1. Nel notebook, crea una cella di codice e copia il seguente codice al suo interno:
    df_image["blurred"] = df_image["image"].blob.image_blur(
        (20, 20), dst=f"{dst_bucket}/image_blur_transformed/", engine="opencv"
    )
    df_image["resized"] = df_image["image"].blob.image_resize(
        (300, 200), dst=f"{dst_bucket}/image_resize_transformed/", engine="opencv"
    )
    df_image["normalized"] = df_image["image"].blob.image_normalize(
        alpha=50.0,
        beta=150.0,
        norm_type="minmax",
        dst=f"{dst_bucket}/image_normalize_transformed/",
        engine="opencv",
    )
    
    # You can also chain functions together
    df_image["blur_resized"] = df_image["blurred"].blob.image_resize(
        (300, 200), dst=f"{dst_bucket}/image_blur_resize_transformed/", engine="opencv"
    )
    df_image
  2. Aggiorna tutti i riferimenti a {dst_bucket} in modo che facciano riferimento al bucket che hai creato, nel formato gs://mybucket.
  3. Fai clic su Esegui .

    Il codice restituisce le immagini originali e tutte le relative trasformazioni.

Genera testo

Genera testo da dati multimodali utilizzando il metodo predict della classe GeminiTextGenerator:

  1. Nel notebook, crea una cella di codice e copia il seguente codice al suo interno:
    from bigframes.ml import llm
    
    gemini = llm.GeminiTextGenerator(model_name="gemini-2.0-flash-001")
    
    # Deal with first 2 images as example
    df_image = df_image.head(2)
    
    # Ask the same question on the images
    df_image = df_image.head(2)
    answer = gemini.predict(df_image, prompt=["what item is it?", df_image["image"]])
    answer[["ml_generate_text_llm_result", "image"]]
  2. Fai clic su Esegui .

    Il codice restituisce le prime due immagini in df_image, insieme al testo generato in risposta alla domanda what item is it? per entrambe le immagini.

  3. Nel notebook, crea una cella di codice e copia il seguente codice al suo interno:

    # Ask different questions
    df_image["question"] = [  # type: ignore
        "what item is it?",
        "what color is the picture?",
    ]
    answer_alt = gemini.predict(
        df_image, prompt=[df_image["question"], df_image["image"]]
    )
    answer_alt[["ml_generate_text_llm_result", "image"]]
  4. Fai clic su Esegui .

    Il codice restituisce le prime due immagini in df_image, con il testo generato in risposta alla domanda what item is it? per la prima immagine e il testo generato in risposta alla domanda what color is the picture? per la seconda immagine.

Genera embedding

Genera embedding per i dati multimodali utilizzando il metodo predict della classe MultimodalEmbeddingGenerator:

  1. Nel notebook, crea una cella di codice e copia il seguente codice al suo interno:
    # Generate embeddings on images
    embed_model = llm.MultimodalEmbeddingGenerator()
    embeddings = embed_model.predict(df_image["image"])
    embeddings
  2. Fai clic su Esegui .

    Il codice restituisce gli embedding generati da una chiamata a un modello di embedding.

Suddividere i PDF

Suddividi gli oggetti PDF utilizzando il metodo pdf_chunk della classe Series.BlobAccessor:

  1. Nel notebook, crea una cella di codice e copia il seguente codice al suo interno:
    # PDF chunking
    df_pdf = bpd.from_glob_path(
        "gs://cloud-samples-data/bigquery/tutorials/cymbal-pets/documents/*", name="pdf"
    )
    df_pdf["chunked"] = df_pdf["pdf"].blob.pdf_chunk(engine="pypdf")
    chunked = df_pdf["chunked"].explode()
    chunked
  2. Fai clic su Esegui .

    Il codice restituisce i dati PDF suddivisi in blocchi.

Esegui la pulizia

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.