Use o Llama 3.2-90b-vision-instruct para consultas de IA multimodais em Python com o watsonx

Neste tutorial, você descobrirá como aplicar o modelo Meta Llama 3.2-90b-vision-instruct, agora disponível no watsonx.ai, a tarefas de visão computacional, como legendas de imagens e respostas a perguntas visuais.

Visão geral da IA multimodal

Modelos de IA multimodais versus unimodais

Muitos de nós estamos familiarizados com aplicações unimodais de IA. Uma ferramenta popular de IA unimodal é o ChatGPT. Chatbots como ChatGPT usam processamento de linguagem natural (NLP) para entender perguntas dos usuários e automatizar respostas em tempo real. O tipo de entrada ao qual esses grandes modelos de linguagem (LLMs) unimodais podem ser aplicados é limitado ao texto.

 A inteligência artificial (IA) multimodal depende de modelos de aprendizado de máquina desenvolvidos em redes neurais. Essas redes neurais são capazes de processar e integrar informações de vários tipos de dados usando técnicas complexas de deep learning. Essas diferentes modalidades produzidas pelo modelo de IA generativa, às vezes chamadas de modelos de IA gen, podem incluir texto, imagens, entrada de vídeo e áudio.

Os sistemas de IA multimodal têm muitos casos de uso no mundo real, desde diagnósticos de imagens médicas em ambientes de saúde usando computer vision até reconhecimento de fala em aplicações de tradução. Esses avanços da tecnologia de IA podem otimizar vários domínios. A principal vantagem das arquiteturas multimodais é a capacidade de processar diferentes tipos de dados.

IA multimodal: como funciona

A IA multimodal envolve três elementos:

Módulo de entrada

O módulo de entrada é construído com base em múltiplas redes neurais unimodais para pré-processar diferentes tipos de dados. Aqui, os dados são preparados para algoritmos de aprendizado de máquina realizados no módulo de fusão.

Módulo de fusão

A combinação, alinhamento e processamento de dados ocorrem neste módulo. O processo de fusão ocorre para cada modalidade de dados. Várias técnicas são comumente usadas neste módulo. Um exemplo é a fusão inicial, onde dados brutos de todos os tipos de entradas são combinados. Além disso, o mid-fusão ocorre quando dados de diferentes modalidades são codificados em diferentes estágios de pré-processamento. Por último, a fusão tardia consolida os dados após serem processados inicialmente no módulo de entrada por diferentes modelos correspondentes a cada modalidade.

Módulo de saída

O módulo de saída gera resultados no formato de saída desejado, entendendo os dados produzidos no módulo de fusão. Essas saídas podem assumir várias formas, como texto, imagem ou uma combinação de formatos.

Etapas

Consulte este vídeo da IBM Technology no YouTube que mostra as instruções de configuração a seguir nas etapas 1 e 2.

Etapa 1. Configure seu ambiente

Embora seja possível escolher entre várias ferramentas, este tutorial é mais adequado para um Jupyter Notebook. Os Jupyter Notebooks são amplamente utilizados na ciência de dados para combinar código com várias fontes de dados, como texto, imagens e visualização de dados.

Este tutorial vai orientar você em como configurar uma conta IBM para usar um Jupyter Notebook.

  1. Faça login no watsonx.ai usando sua conta do IBM Cloud.

  2. Criar um projeto do watsonx.ai.

    Você pode obter a ID do projeto a partir de seu projeto. Clique na guia Gerenciar. Em seguida, copie a ID do projeto da seção Detalhes da página Geral. Você precisa dessa ID para este tutorial.

  3. Crie um Jupyter Notebook.

    Esta etapa abrirá um ambiente de notebook onde você pode copiar o código deste tutorial para implementar o ajuste de prompt por conta própria. Ou então, você pode baixar esse Notebook em seu sistema local e carregá-lo como um ativo em seu projeto do watsonx.ai. Esse Jupyter Notebook , juntamente com os conjuntos de dados utilizados, pode ser encontrado no GitHub.

    Para evitar conflitos de dependência de pacotes Python, recomendamos configurar um ambiente virtual.

Etapa 2. Configure uma instância do watsonx.ai Runtime e uma chave de API

Para este tutorial, sugerimos usar o modelo Meta 3.2-90b-vision-instruct com watsonx.ai para obter resultados semelhantes. Você é livre para usar qualquer modelo de IA compatível com o aprendizado multimodal de sua escolha. Existem vários modelos de IA multimodal para escolher, incluindo o GPT-4 V(ision) e o DALL-E 3 da OpenAI, bem como o Gemini do Google. Certifique-se de que você esteja usando a API apropriada se estiver trabalhando com outros modelos, pois este tutorial foi desenvolvido para o watsonx.ai.

  1. Crie uma instância do serviço do watsonx.ai Runtime (tempo de execução) (selecione a região apropriada e escolha o plano Lite, que é uma instância gratuita).

  2. Gere uma chave de API.

  3. Associe a instância do serviço do watsonx.ai Runtime ao projeto que você criou no watsonx.ai.

Etapa 3. Instale e importe bibliotecas relevantes e configure suas credenciais

Precisaremos de algumas bibliotecas e módulos para este tutorial. Não deixe de importar os seguintes itens; se eles não estiverem instalados, você poderá resolver isso com uma instalação rápida.

#installations
%pip install image | tail -n 1
%pip install -U "ibm_watsonx_ai>=1.1.14" | tail -n 1
%pip install python-dotenv | tail -n 1 #imports
import requests
import base64
import os

from PIL import Image
from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai.foundation_models import ModelInference
from dotenv import load_dotenv
load_dotenv(os.getcwd()+"/.env", override=True)

Para definir nossas credenciais, precisamos do WATSONX_APIKEY e do WATSONX_PROJECT_ID que você gerou na etapa 1. Você pode armazená-los em um arquivo .env no seu diretório ou substitua o texto do espaço reservado. Também definiremos a URL como o endpoint da API.

WATSONX_APIKEY = os.getenv('WATSONX_APIKEY', "<YOUR_WATSONX_APIKEY_HERE>")
WATSONX_PROJECT_ID = os.getenv('WATSONX_PROJECT_ID', "<YOUR_WATSONX_PROJECT_ID_HERE>")
URL = "https://us-south.ml.cloud.ibm.com"

Podemos usar a classe Credentials para encapsular nossas credenciais passadas.

credentials = Credentials(
    url=URL,
    api_key=WATSONX_APIKEY
)

Etapa 4. Codifique imagens

Neste tutorial, trabalharemos com várias imagens para aplicações de IA multimodal, como legendas de imagens e detecção de objetos. As imagens que usaremos podem ser acessadas usando as seguintes URLs. Podemos armazenar essas URLs em uma lista para codificá-las de forma iterativa.

url_image_1 = 'https://assets.ibm.com/br-pt/is/image/ibm/hv6b0935?$original$'
url_image_2 = 'https://assets.ibm.com/br-pt/is/image/ibm/c30a2d57-a62b-4bb3-818895bfe2fc7bf8?$original$'
url_image_3 = 'https://assets.ibm.com/br-pt/is/image/ibm/nt170969?$original$'
url_image_4 = 'https://assets.ibm.com/br-pt/is/image/ibm/fb123b45-6530-4dd9-a758-10a7ec234d9d?$original$'

image_urls = [url_image_1, url_image_2, url_image_3, url_image_4]

Para entender melhor nossa entrada de dados, vamos exibir as imagens.

for idx, url in enumerate(image_urls):
    print(f'url_image_{idx}')
    display(Image.open(requests.get(url, stream=True).raw))

Saídas:

url_image_0

Fotografia da cidade de Nova Iorque

url_image_1

Mulher correndo

url_image_2

Fazenda alagada pelo rio Mississippi

url_image_3

Um rótulo nutricional

Para codificar essas imagens de uma maneira que seja digerível para o LLM, codificaremos as imagens em bytes que, em seguida, decodificamos para representação UTF-8.

encoded_images = []

for url in image_urls:
    encoded_images.append(base64.b64encode(requests.get(url).content).decode("utf-8"))

Etapa 5. Configure a solicitação de API e o LLM

Agora que as imagens podem ser enviadas para o LLM, vamos configurar uma função para as chamadas de API do watsonx. A função augment_api_request_body recebe a consulta e a imagem do usuário como parâmetros e aumenta o corpo da solicitação de API. Usaremos essa função em cada iteração.

def augment_api_request_body(user_query, image):
    messages = [
        {
            "role": "user",
            "content": [{
                "type": "text",
                "text": "Você é um assistente útil. Responda à seguinte consulta do usuário em uma ou duas frases: " + user_query
            },
            {
                "type": "image_url",
                "image_url": {
                "url": f"data:image/jpeg;base64,{image}",
                }
            }]
        }
    ]

    return messages

Vamos instanciar a interface do modelo usando a classe TheModelInference. Neste tutorial, usaremos o modelo meta-llama/llama-3-2-90b-vision-instruct.

model = ModelInference(
    model_id="meta-llama/llama-3-2-90b-vision-instruct",
    credentials=credentials,
    project_id=WATSONX_PROJECT_ID,
    params={
        "max_tokens": 200
    }
)

Etapa 6. Legenda da imagem

Agora, podemos percorrer nossas imagens para ver as descrições de texto produzidas pelo modelo em resposta à consulta "O que está acontecendo nesta imagem?"

for i in range(len(encoded_images)):
    image = encoded_images[i]
    user_query = "What is happening in this image?"
    messages = augment_api_request_body(user_query, image)
    response = model.chat(messages=messages)
    print(response['choices'][0]['message']['content'])

Saída

Esta imagem mostra uma rua movimentada da cidade com edifícios altos, carros e pessoas caminhando na calçada. A rua está repleta de semáforos, árvores e placas de trânsito, e há várias pessoas atravessando a rua em um cruzamento.
A imagem mostra uma mulher em trajes atléticos correndo pela rua, com um prédio e um carro visível ao fundo. A mulher está vestindo um suéter amarelo, leggings pretas e tênis, e parece estar engajada em uma corrida casual.
A imagem mostra uma área alagada, com água cobrindo o solo e os edifícios ao redor. A inundação parece ser severa, com o nível da água atingindo os telhados de algumas estruturas.
**Descrição

da imagem** * A imagem mostra um close de um rótulo nutricional, com um dedo apontando para ele.
* O rótulo fornece informações detalhadas sobre o conteúdo nutricional de um alimento específico, incluindo:
+ Calorias
+
Sódio
+ Carboidratos
+ Outras informações relevantes
* O rótulo é exibido em um fundo branco com texto em preto, facilitando a leitura e a compreensão .

O modelo Llama 3.2-90b-vision-instruct foi capaz de legendar com sucesso cada imagem com detalhes significativos.

Etapa 7. Detecção de objetos

Agora que mostramos a capacidade do modelo de realizar a conversão de imagem em texto na etapa anterior, vamos fazer ao modelo algumas perguntas que exigem detecção de objetos. Em relação à segunda imagem que mostra a mulher correndo ao ar livre, perguntaremos ao modelo: "Quantos carros há nesta imagem?"

image = encoded_images[1]
user_query = "How many cars are in this image?"
messages = augment_api_request_body(user_query, image)
response = model.chat(messages=messages)
print(response['choices'][0]['message']['content'])

Saída: há um carro nesta imagem. O carro está estacionado na rua, à direita do prédio.

O modelo identificou corretamente o veículo singular na imagem. Agora, vamos perguntar sobre os danos representados na imagem de uma inundação.

image = encoded_images[2]
user_query = "How severe is the damage in this image?"
messages = augment_api_request_body(user_query, image)
response = model.chat(messages=messages)
print(response['choices'][0]['message']['content'])

Saída: o dano nesta imagem é grave, com as águas da cheia cobrindo uma parte significativa do terreno e podendo causar grandes danos às estruturas e às culturas. O nível da água parece estar pelo menos na altura da cintura, o que pode levar a perdas significativas para os proprietários e agricultores da região.

Essa resposta destaca o valor que a IA multimodal tem para domínios como o de seguros. O modelo foi capaz de detectar a gravidade dos danos causados à casa alagada. Essa pode ser uma ferramenta poderosa para melhorar o tempo de processamento de pedidos de seguro.

Em seguida, vamos perguntar ao modelo quanto de conteúdo de Sódio aparece na imagem do rótulo nutricional.

image = encoded_images[3]
user_query = "How much sodium is in this product?"
request_body = augment_api_request_body(user_query, image)
messages = augment_api_request_body(user_query, image)
response = model.chat(messages=messages)
print(response['choices'][0]['message']['content'])

Saída: **Teor de sódio:** 640 miligramas (mg)

Ótimo! O modelo foi capaz de discernir objetos dentro das imagens após consultas de usuários. Incentivamos que você faça mais consultas para demonstrar melhor o desempenho do modelo.

Resumo

Neste tutorial, você usou o modelo Llama 3.2-90b-vision-instruct para realizar operações multimodais, incluindo legendas de imagens e respostas a perguntas visuais. Para ver mais casos de uso desse modelo, incentivamos você a verificar a página de documentação oficial. Lá você encontrará mais informações sobre os parâmetros e recursos do modelo. A saída do Python é importante, pois mostra a capacidade do sistema multimodal de extrair informações de dados multimodais.

Soluções relacionadas
IBM watsonx.ai

Treine, valide, ajuste e implemente recursos de IA generativa, modelos de base e recursos de aprendizado de máquina com o IBM watsonx.ai, um estúdio empresarial de última geração para construtores de IA. Crie aplicações de IA em uma fração do tempo com uma fração dos dados.

Conheça o watsonx.ai
Soluções de inteligência artificial

Use a IA a serviço de sua empresa com a experiência e o portfólio de soluções líder do setor da IBM à sua disposição.

Explore as soluções de IA
Serviços de IA

Reinvente os fluxos de trabalho e operações críticos adicionando IA para maximizar experiências, tomadas de decisão em tempo real e valor de negócios.

Explore os serviços de IA
Dê o próximo passo

Obtenha acesso completo aos recursos que abrangem o ciclo de vida do desenvolvimento da IA. Produza soluções poderosas de IA com interfaces fáceis de usar, fluxos de trabalhos e acesso a APIs e SDKs padrão do setor.

Explore o watsonx.ai Agende uma demonstração em tempo real