OpenAI Vision: Descrevendo imagens em C#

OpenAI Vision: Descrevendo imagens em C#

A OpenAI introduziu capacidades de visão em modelos como o GPT-4o, GPT-4o mini e GPT-4 Turbo. Esses modelos podem receber imagens e responder a perguntas sobre elas, expandindo a tradicional entrada de texto dos modelos de linguagem. Neste artigo exploraremos como utilizar esses recursos para entender e analisar imagens.

Onde os recursos de visão podem ser utilizados

Os recursos de visão oferecidos pelos modelos da OpenAI, como o GPT-4 com capacidades de visão, podem ser aplicados em uma variedade de setores e casos de uso. Estes modelos são capazes de interpretar e entender imagens, o que abre novas possibilidades para diversas aplicações. 

Acessibilidade: os recursos de visão podem ser usados para melhorar a acessibilidade para pessoas com deficiência visual. Aplicativos podem descrever o conteúdo de imagens e fornecer informações sobre o ambiente ao redor, ajudando na navegação e compreensão do mundo visual para pessoas cegas ou com visão reduzida.

Melhoramento de experiência do usuário: modelos de visão podem ser integrados em aplicativos para melhorar a experiência do usuário. Por exemplo, em aplicativos de redes sociais, eles podem ser usados para sugerir tags, identificar amigos nas fotos, ou até mesmo criar descrições automáticas das imagens enviadas pelos usuários.

Agricultura: na agricultura, a visão computacional pode ser usada para monitorar a saúde das plantas e identificar pragas ou doenças em imagens de campos. Isso pode ajudar os agricultores a tomar decisões mais informadas sobre o manejo de culturas e a aplicação de tratamentos.

Limitações

Mesmo com capacidades avançadas, o modelo de visão da OpenAI tem algumas limitações:

Imagens médicas: o modelo não é adequado para interpretar imagens médicas especializadas, como tomografias ou ressonâncias magnéticas. Essas imagens requerem análise especializada que vai além das capacidades gerais do modelo.

Texto pequeno: se o texto na imagem for muito pequeno, o modelo pode ter dificuldades para lê-lo. Aumentar o tamanho do texto pode ajudar, mas ainda pode haver limitações na precisão.

Rotação: imagens rotacionadas ou de cabeça para baixo podem ser interpretadas incorretamente. O modelo pode ter problemas para identificar texto ou objetos em tais imagens sem um pré-processamento adequado.

Precisão: a precisão do modelo pode variar, e ele pode gerar descrições ou interpretações incorretas em alguns casos. Isso pode ser particularmente notável em imagens complexas ou com muitos detalhes.

Formato da imagem: imagens panorâmicas ou com efeitos de olho de peixe podem não ser processadas corretamente, pois o modelo pode ter dificuldades em lidar com distorções extremas ou formatos não convencionais.

Consumindo a API de Visão da OpenAI

Para integrar com a API de visão da OpenAI em nossa aplicação, usaremos um projeto ASP.NET. Primeiramente, você precisará de uma chave de API da OpenAI. Se ainda não tiver uma, consulte nosso tutorial detalhado, que orienta desde a criação da conta na plataforma OpenAI até a geração e configuração da chave de API necessária para acessar os serviços de visão.

Após configurar o projeto e obter a chave de API, vamos criar um controller chamado “VisionController” em nosso projeto ASP.NET. Dentro desse controller, criaremos uma action do tipo POST chamada “AnalyzeImage”, que receberá dois parâmetros do tipo string denominados “question” e “imageUrl”. O parâmetro “question” receberá o que queremos saber sobre a imagem e o “imageUrl” receberá a URL da imagem que será analisada.

				
					using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using System.Text;

namespace OpenAI_Vision.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class VisionController : ControllerBase
    {
        [HttpPost]
        public async Task<ActionResult> AnalyzeImage(string question, string imageUrl)
        {
            //Nosso código
        }
    }
}

				
			

Armazenar a chave da API

Antes de interagir com a API da OpenAI, você precisa armazenar sua chave de API em uma variável. Esta chave é usada para autenticar suas requisições e é fundamental que ela seja mantida segura e não seja exposta publicamente.

				
					string apiKey = "Sua_chave_API";
				
			

Construir o corpo da requisição

Construir o corpo da requisição é uma etapa essencial para enviar dados à API. No exemplo abaixo, estamos criando um objeto que especifica todos os detalhes necessários para nossa solicitação.

				
					var requestContent = new
{
    model = "gpt-4o-mini",
    messages = new object[]
    {
        new
        {
            role = "user",
            content = new object[]
            {
                new { type = "text", text = question },
                new
                {
                    type = "image_url",
                    image_url = new
                    {
                        url = imageUrl
                    }
                }
            }
        }
    },
    max_tokens = 300
};

				
			

No campo “model” vamos definir qual modelo da OpenAI será usado para processar a solicitação. No caso, estamos utilizando o modelo “gpt-4o-mini”.

Em “messages”, definimos o conteúdo da mensagem que será enviada para o modelo:

O “role” definido como “user”, significa que estamos simulando uma interação de um usuário.

O “content” vai definir que o conteúdo da mensagem é uma lista que inclui dois tipos de dados:

text”, que contém a pergunta que estamos fazendo, armazenada na variável “question”.

image_url”, que especifica que estamos fornecendo uma URL de imagem para análise. A URL da imagem está armazenada na variável “imageUrl”.

max_tokens” vai controlar a quantidade máxima de tokens (unidades de texto) que a resposta da API pode conter. Este limite ajuda a gerenciar a extensão da resposta e a controlar o uso dos recursos da API.

Serializar o corpo da requisição

Para enviar o corpo da requisição para a API, precisamos convertê-lo para o formato JSON. A biblioteca “JsonConvert” da biblioteca “Newtonsoft.Json” é utilizada para essa conversão, transformando o objeto “requestContent” em uma string JSON adequada para o envio.

				
					var requestBodyJson = JsonConvert.SerializeObject(requestContent);
				
			

Criar e configurar o cliente HTTP

A criação de um cliente HTTP (HttpClient) é necessária para enviar a solicitação à API. No código, configuramos o cliente adicionando um cabeçalho de autorização que inclui a chave da API. Isso garante que sua solicitação seja autenticada pela API da OpenAI.

				
					using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");
    
    // Enviar requisição HTTP.
}

				
			

Enviar a requisição POST

Com o cliente HTTP configurado, enviamos uma requisição “POST” para a API da OpenAI. Utilizamos o método “PostAsync” para enviar a solicitação, incluindo o corpo da requisição (em formato JSON) e definindo o tipo de mídia como “application/json”. A URL da API é “https://api.openai.com/v1/chat/completions”, que é o endpoint para gerar respostas baseadas no conteúdo da mensagem.

				
					var response = await client.PostAsync("https://api.openai.com/v1/chat/completions", new StringContent(requestBodyJson, Encoding.UTF8, "application/json"));
				
			

Processar a resposta

Após enviar a requisição, é necessário processar a resposta da API. Lemos o corpo da resposta como uma string e retornamos na nossa API com um status code 200.

				
					var responseString = await response.Content.ReadAsStringAsync();
	return Ok(responseString);

				
			

Testando a API

Para verificar o funcionamento da nossa aplicação, execute-a e faça uma requisição enviando a pergunta “Descreva a imagem” juntamente com a URL da imagem que você deseja analisar. Abaixo está um exemplo do resultado que recebemos ao processar a imagem fornecida:

Imagem:

Requisição:

Reposta:

				
					{
  "id": "chatcmpl-9r2ZTZmnXwvwynMLGj5VNgJ3p30uU",
  "object": "chat.completion",
  "created": 1722428295,
  "model": "gpt-4o-mini-2024-07-18",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "A imagem mostra uma versão alterada da famosa pintura \"Mona Lisa\". Ela apresenta a figura da Mona Lisa fazendo um gesto de sinal de chifres, além de elementos alienígenas, como uma nave espacial acima dela e uma criatura alienígena no fundo. O cenário também possui um ambiente de fogo, criando uma atmosfera surreal e excêntrica."
      },
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 25514,
    "completion_tokens": 72,
    "total_tokens": 25586
  },
  "system_fingerprint": "fp_611b667b19"
}

				
			

Acelere a sua carreira conosco!

Se você é Desenvolvedor .NET Júnior e quer acelerar sua carreira até nível Pleno com salário de R$7k+, ou mesmo busca a primeira vaga, conheça a Mentoria .NET StartClique aqui

Se é Desenvolvedor .NET Pleno ou Sênior e quer virar referência técnica em sua equipe e mercado, com salário de R$10k+, conheça a Mentoria .NET ExpertClique aqui

Conclusão

Os recursos de visão da OpenAI representam uma poderosa integração entre linguagem e percepção visual, permitindo aplicações inovadoras em diversos campos. A capacidade de interpretar imagens e responder a perguntas sobre elas amplia as possibilidades para desenvolvimento de tecnologias mais inteligentes e úteis.