Analizza i dati multimodali in Python con BigQuery DataFrames

Questo tutorial mostra come analizzare dati multimodali in un notebook Python utilizzando classi e metodi BigQuery DataFrames.

Questo tutorial utilizza il catalogo 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 dati strutturati e non strutturati in un DataFrame.
  • Trasformare le immagini.
  • Genera testo ed embedding in base ai dati delle immagini.
  • Dividi i PDF in blocchi 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 Gestisci 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, creerai 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 console Google Cloud , vai alla pagina Bucket.

    Vai a Bucket

  2. Fai clic su Crea.

  3. Nella pagina Crea un bucket, inserisci un nome univoco globale che soddisfi i requisiti per il nome del bucket nella sezione Inizia.

  4. Fai clic su Crea.

Crea una connessione

Crea una connessione risorsa Cloud e ottieni 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.

    Si apre 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 evidenza, fai clic su Vertex AI.

  5. Fai clic sulla scheda della soluzione Vertex AI Models: BigQuery Federation.

  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 del account di servizio da utilizzare in un passaggio successivo.

Concedi le autorizzazioni al account di servizio della connessione

Concedi al account di servizio della connessione i ruoli necessari 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 seleziona Utente oggetti Storage.

  5. Fai clic su Aggiungi un altro ruolo.

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

  7. Fai clic su Salva.

Crea un notebook

Crea un notebook in cui puoi eseguire il 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 fai clic su Blocco note.

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

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

  5. Se hai un runtime esistente, accetta le impostazioni predefinite e fai clic su Connetti. Se non hai un runtime esistente, seleziona Crea nuovo runtime, quindi fai clic su Connetti.

    La configurazione del runtime potrebbe richiedere diversi minuti.

Crea 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 blocco note, crea una cella di codice e copia il seguente codice:
    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 che sono state 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 blocco note, crea una cella di codice e copia il seguente codice:
    # 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 blocco note, crea una cella di codice e copia il seguente codice:

    # 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 del 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.

Trasformare le immagini:

  1. Nel blocco note, crea una cella di codice e copia il seguente codice:
    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 blocco note, crea una cella di codice e copia il seguente codice:
    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 blocco note, crea una cella di codice e copia il seguente codice:

    # 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 testo generato in risposta alla domanda what item is it? per la prima immagine e testo generato in risposta alla domanda what color is the picture? per la seconda immagine.

Generare incorporamenti

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

  1. Nel blocco note, crea una cella di codice e copia il seguente codice:
    # 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.

PDF dei chunk

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

  1. Nel blocco note, crea una cella di codice e copia il seguente codice:
    # 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.