Analyser des données multimodales dans Python avec BigQuery DataFrames

Ce tutoriel vous explique comment analyser des données multimodales dans un notebook Python à l'aide des classes et des méthodes BigQuery DataFrames.

Ce tutoriel utilise le catalogue de produits de l'ensemble de données public de la boutique pour animaux de compagnie Cymbal.

Pour importer un notebook déjà renseigné avec les tâches abordées dans ce tutoriel, consultez BigFrames Multimodal DataFrame.

Objectifs

  • Créez des DataFrames multimodaux.
  • Combinez des données structurées et non structurées dans un DataFrame.
  • Transformer des images
  • Générer du texte et des embeddings à partir de données d'image
  • Divisez les PDF en sections pour une analyse plus approfondie.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de 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.

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.Les nouveaux Google Cloud utilisateurs peuvent bénéficier d'un essai gratuit.

Pour en savoir plus, consultez les pages de tarification suivantes:

Avant de commencer

  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

Rôles requis

Pour obtenir les autorisations nécessaires pour suivre ce tutoriel, demandez à votre administrateur de vous accorder les rôles IAM suivants:

Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés ou d'autres rôles prédéfinis.

Configurer

Dans cette section, vous allez créer le bucket Cloud Storage, la connexion et le notebook utilisés dans ce tutoriel.

Créer un bucket

Créez un bucket Cloud Storage pour stocker les objets transformés:

  1. Dans la console Google Cloud , accédez à la page Buckets.

    Accéder à la page "Buckets"

  2. Cliquez sur Créer.

  3. Sur la page Créer un bucket, dans la section Premiers pas, saisissez un nom unique qui répond aux exigences de dénomination des buckets.

  4. Cliquez sur Créer.

Créer une connexion

Créez une connexion de ressource cloud et obtenez le compte de service de la connexion. BigQuery utilise cette connexion pour accéder aux objets de Cloud Storage.

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans le volet Explorateur, cliquez sur  Ajouter des données.

    La boîte de dialogue Ajouter des données s'ouvre.

  3. Dans le volet Filtrer par, dans la section Type de source de données, sélectionnez Applications d'entreprise.

    Vous pouvez également saisir Vertex AI dans le champ Rechercher des sources de données.

  4. Dans la section Sources de données sélectionnées, cliquez sur Vertex AI.

  5. Cliquez sur la fiche de solution Modèles Vertex AI: fédération BigQuery.

  6. Dans la liste Type de connexion, sélectionnez Modèles distants Vertex AI, fonctions distantes et BigLake (ressource Cloud).

  7. Dans le champ ID de connexion, saisissez bigframes-default-connection.

  8. Cliquez sur Créer une connexion.

  9. Cliquez sur Accéder à la connexion.

  10. Dans le volet Informations de connexion, copiez l'ID du compte de service à utiliser à l'étape suivante.

Accorder des autorisations au compte de service de la connexion

Attribuez au compte de service de la connexion les rôles dont il a besoin pour accéder à Cloud Storage et à Vertex AI. Vous devez accorder ces rôles dans le projet que vous avez créé ou sélectionné dans la section Avant de commencer.

Pour accorder le rôle, procédez comme suit :

  1. Accédez à la page IAM et administration.

    Accéder à IAM et administration

  2. Cliquez sur Accorder l'accès.

  3. Dans le champ Nouveaux comptes principaux, saisissez l'ID du compte de service que vous avez copié précédemment.

  4. Dans le champ Sélectionner un rôle, sélectionnez Cloud Storage, puis Utilisateur d'objets Storage.

  5. Cliquez sur Ajouter un autre rôle.

  6. Dans le champ Sélectionner un rôle, sélectionnez Vertex AI, puis Utilisateur Vertex AI.

  7. Cliquez sur Enregistrer.

Créer un notebook

Créez un notebook dans lequel vous pouvez exécuter du code Python:

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans la barre d'onglets du volet de l'éditeur, cliquez sur la flèche du menu déroulant à côté de Requête SQL, puis sur Notebook.

  3. Dans le volet Commencer avec un modèle, cliquez sur Fermer.

  4. Cliquez sur Connecter> Se connecter à un environnement d'exécution.

  5. Si vous disposez d'un environnement d'exécution, acceptez les paramètres par défaut, puis cliquez sur Connecter. Si vous ne disposez pas d'environnement d'exécution, sélectionnez Créer un environnement d'exécution, puis cliquez sur Se connecter.

    La configuration de l'environnement d'exécution peut prendre plusieurs minutes.

Créer un DataFrame multimodal

Créez un DataFrame multimodal qui intègre des données structurées et non structurées à l'aide de la méthode from_glob_path de la classe Session:

  1. Dans le notebook, créez une cellule de code et copiez-y le code suivant :
    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. Cliquez sur Exécuter.

    L'appel final à df_image renvoie les images qui ont été ajoutées au DataFrame. Vous pouvez également appeler la méthode .display.

Combiner des données structurées et non structurées dans le DataFrame

Combinez les données textuelles et visuelles dans le DataFrame multimodal:

  1. Dans le notebook, créez une cellule de code et copiez-y le code suivant :
    # 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. Cliquez sur Run (Exécuter) .

    Le code renvoie les données du DataFrame.

  3. Dans le notebook, créez une cellule de code et copiez-y le code suivant:

    # 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. Cliquez sur Run (Exécuter) .

    Le code renvoie les images du DataFrame où la valeur de la colonne author est alice.

Effectuer des transformations d'images

Transformez les données d'image à l'aide des méthodes suivantes de la classe Series.BlobAccessor:

Les images transformées sont écrites dans Cloud Storage.

Transformer des images:

  1. Dans le notebook, créez une cellule de code et copiez-y le code suivant :
    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. Mettez à jour toutes les références à {dst_bucket} pour qu'elles pointent vers le bucket que vous avez créé, au format gs://mybucket.
  3. Cliquez sur Run (Exécuter) .

    Le code renvoie les images d'origine ainsi que toutes leurs transformations.

Générer du texte

Générez du texte à partir de données multimodales à l'aide de la méthode predict de la classe GeminiTextGenerator:

  1. Dans le notebook, créez une cellule de code et copiez-y le code suivant :
    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. Cliquez sur Run (Exécuter) .

    Le code renvoie les deux premières images dans df_image, ainsi que le texte généré en réponse à la question what item is it? pour les deux images.

  3. Dans le notebook, créez une cellule de code et copiez-y le code suivant:

    # 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. Cliquez sur Run (Exécuter) .

    Le code renvoie les deux premières images dans df_image, avec du texte généré en réponse à la question what item is it? pour la première image et du texte généré en réponse à la question what color is the picture? pour la deuxième image.

Générer des embeddings

Générez des embeddings pour les données multimodales à l'aide de la méthode predict de la classe MultimodalEmbeddingGenerator:

  1. Dans le notebook, créez une cellule de code et copiez-y le code suivant :
    # Generate embeddings on images
    embed_model = llm.MultimodalEmbeddingGenerator()
    embeddings = embed_model.predict(df_image["image"])
    embeddings
  2. Cliquez sur Run (Exécuter) .

    Le code renvoie les représentations vectorielles continues générées par un appel à un modèle d'embedding.

Chunker des PDF

Divisez les objets PDF à l'aide de la méthode pdf_chunk de la classe Series.BlobAccessor:

  1. Dans le notebook, créez une cellule de code et copiez-y le code suivant :
    # 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. Cliquez sur Run (Exécuter) .

    Le code renvoie les données PDF par blocs.

Effectuer un nettoyage

  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.