Engenharia

Evitando Alucinações: Preparando Imagens para Visão Computacional

O Desafio da Resolução em Projetos de Visão

Nos projetos atuais da AITY, um dos maiores desafios técnicos enfrentados é o tratamento de screenshots para automação. Frequentemente, capturamos telas em resoluções nativas, como 1366 x 768, mas ao enviar essas imagens para modelos de Inteligência Artificial, ocorrem erros de interpretação ou "alucinações".

Existe um mito de que IAs como o Gemini só conseguem "ver" imagens quadradas. A realidade técnica evoluiu, mas o pré-processamento continua sendo o fator decisivo para o sucesso ou falha da automação.

O Perigo do "Squash" (Esmagamento)

Antigamente, modelos clássicos (como as primeiras CNNs) exigiam entradas fixas e quadradas. Ao tentar adaptar um screenshot retangular (16:9) para esse formato, engenheiros frequentemente recorriam ao Squash — forçar a imagem a caber num quadrado.

O resultado é desastroso para a IA: botões retangulares viram quadrados e círculos viram ovais. Essa distorção geométrica destrói os padrões visuais que o modelo aprendeu, impedindo o reconhecimento correto de ícones e textos.

Exemplo de Distorção de Aspect Ratio

A Solução Moderna: Letterboxing

Modelos modernos, que utilizam arquiteturas Vision Transformers (ViT), dividem a imagem em pequenos ladrilhos (patches) e são mais flexíveis. No entanto, para garantir precisão absoluta nas coordenadas de clique e leitura (OCR), a geometria deve ser preservada.

A solução de engenharia definitiva é o Letterboxing (ou Padding).

Implementação em Python

Abaixo, compartilho o snippet desenvolvido para o ecossistema AITY. Este script utiliza a biblioteca Pillow (PIL) para aplicar o padding automaticamente, prevenindo alucinações antes de enviar os dados para a API.

from PIL import Image

def prepare_screenshot_for_ai(image_path, output_path="input_quadrado.jpg"):
    """
    Transforma um screenshot retangular em uma imagem quadrada
    adicionando bordas (padding), sem distorcer o conteúdo.
    Isso evita alucinações de geometria em modelos de visão.
    """
    try:
        # 1. Carrega a imagem original
        original_img = Image.open(image_path)
        old_width, old_height = original_img.size
        
        # 2. Define o tamanho do novo quadrado baseado no lado maior
        # Ex: Se 1366x768, o novo tamanho será 1366x1366
        new_size = max(old_width, old_height)
        
        # 3. Cria um canvas quadrado (0, 0, 0) é preto.
        new_img = Image.new("RGB", (new_size, new_size), (0, 0, 0))
        
        # 4. Calcula a posição para centralizar a imagem original
        x_offset = (new_size - old_width) // 2
        y_offset = (new_size - old_height) // 2
        
        # 5. Cola a imagem original no centro (sem dar stretch/resize)
        new_img.paste(original_img, (x_offset, y_offset))
        
        # 6. Salva o resultado
        new_img.save(output_path)
        print(f"✅ Processo concluído: {output_path} ({new_size}x{new_size}).")
        return output_path

    except Exception as e:
        print(f"❌ Erro ao processar imagem: {e}")

if __name__ == "__main__":
    prepare_screenshot_for_ai("meu_screenshot_1366x768.png")