# Garage77 V4 — relatório de testes

Testes em 14/10/2026. Esta demo foi executada de verdade com os pesos incluídos, sem resultados gravados no código e sem API de reconhecimento. A amostra tem quatro fotos e somente duas placas distintas; ela não mede uma taxa de acerto geral.

## Fotos originais fornecidas

Arquivos `20261014_184609.jpg`, `20261014_184615.jpg`, `20261014_184600.jpg` e `20261014_184628.jpg`. JPEG armazenado em 4000×1868 com orientação EXIF 6; navegador e OpenCV interpretaram como 1868×4000 em pé. As fotos não estão no ZIP público.

### Execução real em ONNX Runtime Web

Navegador Chromium/Chrome 155 no Windows 64 bits, backend WASM SIMD, uma thread, worker dedicado. É o mesmo runtime, pesos e código de inferência do pacote, servido em localhost. Foi executado o modo de comparação e depois o modo automático. Para validar as fotos antigas, a opção de aceitar placas antigas foi habilitada nos testes.

| Foto | T384 + OCR | S608 + OCR | Automático com antigas habilitadas | Fallback |
|---|---|---|---|---|
| 184609 | FJJ1B28 | FJJ1B28 | FJJ1B28 / T384 | Não |
| 184615 | FJJ1B28 | FJJ1B28 | FJJ1B28 / T384 | Não |
| 184600 | Sem detecção | FRR1510 | FRR1510 / S608 | Sim |
| 184628 | FRR1510 | FR151 (incompleta) | FRR1510 / T384 | Não |

Na execução de comparação, o caractere menos confiante de S608 na 184600 ficou em aproximadamente 80,8%; no fluxo da interface, aproximadamente 80,5%. A interface pede conferência cuidadosa para esse caso. Na 184628, T384 ficou em aproximadamente 98,4%, e S608 devolveu apenas `FR151`. Os resultados completos, recortes e scores ficam disponíveis no diagnóstico durante o uso.

Uma execução do automático levou aproximadamente 382 ms, 153 ms, 1.195 ms e 132 ms, na ordem da tabela. O primeiro resultado inclui a preparação inicial de T384/OCR; o da 184600 inclui a preparação adicional de S608. Estes são tempos do computador de teste, com arquivos em localhost, não tempos de rede ou do Android.

### Comparação independente de referência

Foi usada uma sessão nativa ONNX Runtime CPU, com o preprocessamento oficial Open Image Models em OpenCV, e OCR uint8/RGB com a configuração correspondente. Reproduziu exatamente os textos do histórico do PC: T384 sem detecção na 184600; S608 `FR151` na 184628; demais leituras completas conforme a tabela. Para S608, as quatro caixas e os scores da execução de referência coincidiram com os números fornecidos pelo usuário.

O navegador teve pequenas diferenças de coordenadas e scores. Elas são compatíveis com diferenças de decodificação JPEG, arredondamento da interpolação e execução numérica; não declaramos igualdade bit a bit com OpenCV. Nenhum caractere foi corrigido com base no resultado esperado.

As quatro cópias reduzidas recuperadas inicialmente da conversa (956×2048) também foram executadas na referência CPU: ambos os detectores leram as quatro, inclusive FRR1510 na 184600 e 184628. Isso mostra que redimensionar a imagem pode mudar a detecção/recorte e não deve ser confundido com resultado nos originais. Essas cópias não foram usadas para alegar o resultado real do navegador da tabela.

## Foco em Mercosul após a revisão da lista

Os 327 itens fornecidos pelo usuário foram normalizados apenas para conferência (remoção do hífen). Todos têm o formato `LLLNLNN`; 327 únicos, zero fora do formato e zero duplicatas. A lista não está embutida nem é usada para completar resultados.

Na configuração final, **Aceitar também placas antigas (teste)** começa desmarcada. Com a foto 184600, o fluxo da interface reconheceu `FRR1510` internamente, mostrou o recorte e o aviso **Padrão antigo**, e deixou o campo final vazio. Com a opção habilitada e nova leitura, a placa antiga pode ser exibida para teste. As leituras Mercosul continuam sendo aceitas no modo padrão.

## Outras verificações

- Uma imagem uniforme sem placa retornou lista vazia e acionou S608 no automático, sem inventar texto.
- Upload real de um original pelo seletor da interface, preservando orientação e 1868×4000.
- Interface com imagem, contorno, recorte, candidato selecionável, edição e cópia da placa confirmadas, aviso de baixa confiança e opções de diagnóstico.
- Layout conferido em viewport de 412×915 no navegador desktop. Esse teste verifica a largura, não emula processador, câmera ou memória de Android.
- Verificação HTTP local dos arquivos de execução, com tamanhos e tipos MIME esperados.
- Verificações do núcleo: padding ímpar e inversão de coordenadas, saída de detecção vazia, RGB bilinear, slots de OCR, preservação de `JJ`, remoção apenas de padding final e seleção/fallback.
- Verificação de sintaxe JavaScript, presença dos assets e integridade do ZIP (incluindo hashes dos arquivos).

Durante o desenvolvimento, o primeiro bundle genérico do runtime tentou buscar um arquivo JSEP ausente. Isso foi corrigido usando o bundle oficial específico `ort.wasm.min.js` com os respectivos `.mjs` e `.wasm`. Os testes reais acima foram feitos depois da correção.

## Limites objetivos

Não houve acesso a um Chrome Android físico, à câmera traseira de um celular, nem ao cPanel de produção. Portanto, desempenho/memória no Android, permissão e captura reais da câmera, SSL e regras Apache do domínio ainda precisam ser conferidos após a instalação. O layout responsivo e a lógica não substituem esse teste no aparelho. Não houve teste de navegação offline. Os caminhos de falha de timeout/memória não foram forçados em um Android real.

Quatro fotos não demonstram robustez para frota inteira, movimento, motocicletas, chuva, placas sujas, outras câmeras ou reflexos diferentes. Reconhecimento de uma placa desgastada como FRR1510 não é garantido. Os scores não são uma probabilidade de acerto calibrada, e a demo sempre permite conferência humana.
