API FastAPI para deteccao de placas Mercosul. O repositorio inclui script de inicializacao completa (init.sh), utilitarios para subir a API (start.sh) e configuracoes prontas para treino utilizando o dataset Artificial Mercosur License Plates (CC BY 4.0).
- Framework principal: FastAPI (Python 3.10+)
- Modelo de deteccao: YOLOv8 (Ultralytics)
- Objetivo: detectar placas padrao Mercosul em imagens, retornando coordenadas normalizadas e confianca.
-
Python 3.10 ou superior (com
venvhabilitado) -
Git Bash, WSL ou outro shell POSIX para executar scripts
.shno Windows -
Docker (Docker Desktop ou Docker Engine + plugin compose) para executar os containers
-
Tesseract OCR instalado no sistema (necessario para extracao de texto)
-
curlouwgetpara baixar o dataset -
Espaco em disco: ~6 GB (dataset compactado + imagens extraidas + artefatos de treino)
-
GPU opcional (CUDA) para treinos mais rapidos
.
|-- app/ # Codigo FastAPI (routers, services, schemas)
|-- artifacts/ # Pesos YOLO gerados pelo treino (criado pelo init)
|-- data/ # Dataset preparado para YOLO (criado pelo init)
|-- docs/postman.json # Colecao Postman para testar a API
|-- init.sh # Setup completo: dependencias, dataset, treino inicial
|-- start.sh # Wrapper para executar a API via Docker
|-- Dockerfile
|-- docker-compose.yml
|-- docker/entrypoint.sh
|-- requirements.txt
|-- .dockerignore
`-- .env-example
- Copie o exemplo de variaveis:
cp .env-example .env
- Ajuste
PLACAOCR_MODEL_PATHpara apontar para o peso YOLO desejado quando disponivel.
| Variavel | Descricao | Padrao |
|---|---|---|
PLACAOCR_MODEL_PATH |
Caminho para o peso YOLO (.pt) utilizado na inferencia |
artifacts/license-plate.pt |
PLACAOCR_CONFIDENCE_THRESHOLD |
Confianca minima para retornar deteccoes | 0.25 |
PLACAOCR_DEVICE |
Dispositivo (cpu, cuda:0, etc.) |
cpu |
PLACAOCR_IMAGE_SIZE |
Tamanho de imagem usado na inferencia (None = default do modelo) | 640 |
PLACAOCR_DEBUG |
Ativa retorno de informacoes adicionais de debug | false |
Integração API Brasil (opcional):
| Variavel | Descricao | Padrao |
|---|---|---|
PLACAOCR_APIBRASIL_BASE_URL |
Endpoint do recurso de consulta | https://gateway.apibrasil.io/api/v2/vehicles/base/001/consulta |
PLACAOCR_APIBRASIL_TOKEN |
Token/Bearer utilizado pela API Brasil | (vazio) |
PLACAOCR_APIBRASIL_TIMEOUT |
Timeout da chamada em segundos | 15 |
Execute o script de inicializacao na raiz do projeto:
./init.shO que o script faz:
- cria (ou reutiliza) o virtualenv em
.venv; - instala
requirements.txtcompipatualizado; - baixa o dataset Artificial Mercosur License Plates (~1.52 GB) via
curlouwget; - extrai o zip e gera um split
train/val/testdeterministico (seed 42); - gera o arquivo YAML para o Ultralytics em
data/yolo/mercosur-license-plates.yaml; - executa um treino inicial com YOLOv8 (
yolov8n.pt, 1 epoch por padrao) e salva o melhor peso emartifacts/license-plate.pt; - armazena os runs completos em
artifacts/runs/.
Flags uteis:
./init.sh --skip-training: prepara tudo exceto o treino (mantem pesos existentes)../init.sh --force-download: rebaixa e reextrai o dataset (descarta arquivos anteriores).
Variaveis de ambiente para ajuste rapido:
| Variavel | Funcao | Valor padrao |
|---|---|---|
TRAIN_EPOCHS |
Numero de epocas no treino inicial | 1 |
TRAIN_BATCH |
Tamanho do batch por step | 16 |
BASE_MODEL |
Checkpoint YOLO base (qualquer compativel com Ultralytics) | yolov8n.pt |
TRAIN_IMAGE_SIZE |
Resolucao usada no treino | 640 |
MODEL_OUTPUT_NAME |
Nome do arquivo de saida em artifacts/ |
license-plate.pt |
Observacao: o dataset possui licenca CC BY 4.0. Consulte Mendeley Data para detalhes.
Depois que o ambiente estiver configurado e o peso disponivel:
./start.sh --dev # docker compose profile dev (reload habilitado e logs no foreground)
./start.sh --prod # docker compose profile prod (modo detach)Para encerrar os servicos utilize docker compose down ou docker compose --profile <perfil> down.
Por padrao o servidor sobe em http://0.0.0.0:8000. A documentacao Swagger fica em http://localhost:8000/docs e o Redoc em http://localhost:8000/redoc.
- Importe
docs/postman.jsonno Postman. - Defina a variavel
baseUrl(padraohttp://localhost:8000). - Na requisicao
Detect License Platesenvie:- campo
filecom a imagem (multipart/form-data), - campo
tipo(ex.:agregados-basica), - campo
homolog(truepara modo sandbox da API Brasil), - opcional
placa_manualcaso queira forcar a placa utilizada na consulta externa.
- campo
Resposta esperada (com PLACAOCR_DEBUG=true):
{
"placa": "ABC1234",
"data": [
{
"resumo": {
"x_center": 0.51,
"y_center": 0.63,
"width": 0.18,
"height": 0.07,
"confidence": 0.94
},
"veiculo": {
"marca": "FORD",
"modelo": "KA 1.0",
"detalhes": {
"exemplo": "payload retornado pela API Brasil em modo homolog"
}
}
}
],
"debug": {
"image": {
"size": {
"width": 1280,
"height": 720
},
"mode": "RGB",
"format": "JPEG"
},
"detections": {
"total": 1,
"primary": {
"x_center": 0.51,
"y_center": 0.63,
"width": 0.18,
"height": 0.07,
"confidence": 0.94
}
},
"placa": {
"manual": null,
"final": "ABC1234"
},
"apibrasil": {
"request": {
"url": "https://gateway.apibrasil.io/api/v2/vehicles/base/001/consulta",
"payload": {
"tipo": "agregados-basica",
"placa": "ABC1234",
"homolog": true
},
"token_configured": false
},
"http": {
"status_code": 200,
"reason": "OK",
"elapsed": 0.23,
"response_preview": "{ ... }"
}
}
}
}Quando PLACAOCR_DEBUG=false, o campo debug nao e retornado.
- Configure
PLACAOCR_APIBRASIL_TOKEN(e demais variaveis) para habilitar a chamada. - A API envia
tipo,placa(derivada da imagem ou do campoplaca_manual) ehomolog. - Se
homolog=truee nenhuma placa for detectada, o sistema utilizaABC1234para recuperar o payload de exemplo. - O retorno completo da API Brasil e anexado em
data[].veiculo.detalhes. - Com
PLACAOCR_DEBUG=true, o JSON tambem inclui logs de execucao (decodificacao da imagem + chamada externa).
- Utilize
./start.sh --devdurante o desenvolvimento; o script carrega variaveis deENV_FILE(padrao.env). - Ajuste o codigo em
app/api/routes.pyeapp/services/detector.pyconforme necessario. - Para atualizar dependencias, edite
requirements.txte rode novamente oinit.shoupip install -r requirements.txtdentro do virtualenv.
- Implementar OCR real para extrair a placa a partir dos recortes retornados pelo detector.
- Executar treinos mais longos (maior
TRAIN_EPOCHS) e avaliar metricas emartifacts/runs/. - Adicionar testes automatizados para validar o servico de inferencia.
- Incluir monitoramento/logging e pipeline de deploy.
- Criar workflow CI/CD para validar lint/testes automaticamente.