DSDiego Salles
← Todos os projetos
Case secundárioEntregueEntregue

Leitor de Placas

Sistema ALPR com YOLOv8 e Google Cloud Vision

Pipeline de reconhecimento automático de placas veiculares que detecta carros, localiza placas e extrai o texto usando modelos YOLO e OCR do Google Cloud Vision, com validação de formatos brasileiros.

PythonFlaskOpenCVUltralytics YOLOv8Google Cloud VisionNumPyHTMLJavaScript
01

Visão geral

O Leitor de Placas é um sistema de ALPR (Automatic License Plate Recognition) que processa imagens de trânsito para identificar veículos e suas respectivas placas. A aplicação recebe uma imagem via upload, executa uma cascata de modelos YOLOv8 para detectar carros e, dentro de cada carro, localizar a placa. Em seguida, a região da placa é enviada para o Google Cloud Vision, que realiza o OCR e retorna o texto. O texto é validado com expressões regulares para os formatos brasileiros (antigo e Mercosul) e a imagem original é anotada com bounding boxes e o texto reconhecido. A arquitetura é dividida em um backend Flask que expõe uma API REST e serve uma interface web estática. O backend orquestra os modelos de detecção, o processamento de imagem com OpenCV e a chamada à API de OCR. Os resultados incluem os crops dos veículos e das placas em Base64, além da imagem anotada, permitindo que o frontend exiba os detalhes de cada veículo detectado. O sistema foi construído para ser executado localmente, com os modelos YOLO já incluídos no repositório e a chave de serviço do Google Cloud configurada separadamente. A interface web permite testar o fluxo completo de forma interativa, com preview da imagem e exibição dos resultados por veículo.

A dor

A identificação manual de placas veiculares em imagens é um processo lento e sujeito a erros, especialmente em cenários com múltiplos veículos. Sistemas de controle de acesso, estacionamentos e monitoramento de tráfego precisam automatizar essa tarefa com precisão.

A solução

Desenvolvi um pipeline de visão computacional que combina detecção de objetos com YOLOv8 e OCR com Google Cloud Vision para extrair placas de veículos em imagens. O sistema valida os formatos brasileiros e retorna os dados estruturados, incluindo imagens anotadas e crops, prontos para integração com outras aplicações.

02

Abordagem de engenharia

01

Detecção de veículos

Um modelo YOLOv8 treinado para carros identifica todos os veículos na imagem, retornando as coordenadas das bounding boxes.

02

Localização de placas

Para cada veículo detectado, um segundo modelo YOLO especializado em placas localiza a região da placa dentro do crop do carro.

03

OCR e validação

A região da placa é enviada ao Google Cloud Vision para extração do texto; o resultado passa por uma limpeza e validação com regex para os padrões brasileiros.

04

Anotação e resposta

A imagem original é anotada com retângulos e texto, e a API retorna um JSON com os dados dos veículos, crops em Base64 e o caminho da imagem processada.

03

O que o projeto entrega

  • Detecção de múltiplos veículos e placas em uma única imagem
  • Validação automática de placas nos formatos antigo e Mercosul
  • API RESTful com Flask e interface web para testes
  • Geração de crops individuais e imagem anotada
04

Arquitetura e desafios técnicos

Pipeline ALPR em cascata com YOLOv8 e OCR em nuvem

Backend Flask orquestra uma cascata de dois modelos YOLOv8 (carro → placa) e delega o OCR ao Google Cloud Vision, validando o texto com regex de placas brasileiras e devolvendo imagem anotada e crops em Base64.

Renderizando diagrama...

Desafios técnicos

Cascata de dois YOLO em vez de um modelo único

Contexto

Detectar carros e placas em uma única passada exigiria um modelo multi-classe com dataset anotado para ambas as tarefas, o que aumenta custo de rotulagem e complexidade de treino.

Decisão

Encadear dois modelos YOLOv8 especializados: o primeiro detecta carros na imagem inteira e o segundo localiza a placa dentro do crop de cada carro.

Trade-off

A cascata adiciona latência por veículo e propaga erros do primeiro estágio (carro não detectado não gera placa). Mitigado ao restringir a busca da placa à região do carro, o que reduz falsos positivos do segundo modelo e mantém cada modelo simples de treinar e versionar.

OCR em nuvem em vez de OCR local

Contexto

Cenas de trânsito têm variação de iluminação, ângulo e qualidade, e um OCR local exigiria treino e ajuste fino para atingir robustez comparável.

Decisão

Delegar o OCR ao Google Cloud Vision, mantendo o pipeline de detecção local com YOLOv8.

Trade-off

Cria dependência de rede, custo por chamada e necessidade de credencial de serviço configurada separadamente. Mitigado ao enviar apenas o crop da placa (não a imagem inteira) ao Vision, reduzindo payload e custo, e ao validar o texto com regex para descartar leituras inválidas antes de retornar ao cliente.

Validação por regex como filtro de qualidade

Contexto

O OCR pode retornar texto ruidoso, com caracteres trocados ou lixo, especialmente em placas parcialmente ocluídas ou com baixa resolução.

Decisão

Aplicar limpeza e validação com expressões regulares para os formatos brasileiros antigo e Mercosul antes de considerar a leitura válida.

Trade-off

Placas de outros países ou formatos não previstos são descartadas, e o sistema não retorna leituras parciais. Mitigado ao manter o texto bruto disponível na resposta e ao estruturar o resultado por veículo, permitindo que o consumidor decida como tratar leituras não validadas.

Execução local com pesos versionados no repositório

Contexto

O projeto precisa ser executável localmente sem infraestrutura de serving de modelos, mas depende de pesos YOLO e de uma chave de serviço do Google Cloud.

Decisão

Incluir os pesos YOLO no repositório e carregá-los no processo Flask, com a chave de serviço configurada separadamente.

Trade-off

Aumenta o tamanho do repositório e acopla o ciclo de vida dos modelos ao da aplicação, além de exigir configuração manual da credencial. Mitigado ao manter o backend como processo único que serve interface e API, simplificando o deploy local e o teste interativo do fluxo completo.

Resposta com crops em Base64 em vez de URLs

Contexto

O frontend precisa exibir a imagem anotada e os recortes de carro e placa por veículo sem um serviço de armazenamento ou CDN.

Decisão

Retornar os crops embutidos em Base64 no JSON, junto com o caminho da imagem anotada.

Trade-off

Aumenta o tamanho da resposta e o consumo de memória no cliente, especialmente com muitos veículos por imagem. Mitigado ao limitar o escopo ao crop da placa e do carro (não à imagem inteira em Base64) e ao servir a imagem anotada como arquivo estático, mantendo o payload controlado para o caso de uso interativo.

05

Resultados

Identifica múltiplos carros por imagem com YOLOv8

Detecção de veículos

Extração de texto via Google Cloud Vision com validação de formato

Reconhecimento de placas

API REST pronta para consumo por outros sistemas

Integração

06

Stack

PythonFlaskOpenCVUltralytics YOLOv8Google Cloud VisionNumPyHTMLJavaScript
07

Temas

#visão computacional#ALPR#YOLOv8#OCR#Flask#Google Cloud Vision

Vamos conversar sobre a próxima oportunidade.

Infraestrutura, IA aplicada, mobile/edge ou integrações críticas — se o desafio exige profundidade, me conte o contexto.