O Gargalo Real: Dados, Não Arquitetura
Quando o assunto é OCR, a maioria dos times fica obcecada com arquitetura de modelo — camadas transformer, cabeças de atenção, escolha do backbone. Mas a história do Nemotron OCR v2 vira essa lógica de cabeça pra baixo. O time da NVIDIA descobriu que, mesmo expandindo o conjunto de caracteres de 855 para 14.244, a acurácia mal mudou. O modelo conseguia teoricamente gerar os caracteres certos, mas nunca tinha aprendido como eles se pareciam.
A conclusão é clara: o gargalo são os dados, não a arquitetura.
Para OCR multilíngue, coletar e anotar imagens reais em escala é proibitivamente caro. Anotar bounding boxes nos níveis de palavra, linha e parágrafo em seis línguas diferentes? Esquece. A geração de dados sintéticos resolve isso — oferecendo a escala da raspagem web com a pureza da anotação manual.
Essa abordagem gerou o Nemotron OCR v2, que reduziu o NED (Normalized Edit Distance) para línguas não-inglesas de 0,56–0,92 para 0,035–0,069. Vamos ver como eles fizeram.

O Pipeline de Dados Sintéticos: Agnóstico de Idioma
A mágica está no pipeline de renderização. Ele é genérico o suficiente para funcionar com qualquer idioma — você só precisa de texto fonte e fontes. Olha só a receita:
Ingredientes
- Texto fonte do mOSCAR, um corpus web multilíngue com 163 idiomas. Isso garante vocabulário, comprimento de frases e frequência de caracteres realistas.
- Fontes de coleções open-source como Google Fonts e Noto — de 165 a 1.258 fontes únicas por idioma.
Renderização com SynthDoG Modificado
O time estendeu o SynthDoG (do projeto Donut) para gerar:
- Bounding boxes multinível — palavra, linha e parágrafo, com quads de 4 pontos
- Grafos de relação para ordem de leitura (essencial para layouts com múltiplas colunas e tabelas)
- Modos de layout diversos — texto fluido, palavras estilo cena, colunas verticais (para CJK), tabelas, sumários, slides e páginas de documento
- Reconhecimento em nível de linha para línguas CJK (sem fronteiras de palavra para segmentar)
Pilha de Aumentações
Cada página renderizada passa por aumentações aleatórias:
- Nível do texto: bordas, sombras, ruído de glifo, variação de opacidade do traço
- Nível da imagem: dilatação, erosão, blur mediano, distorção elástica
- Nível da página: jitter de contraste/brilho, blur Gaussiano/de movimento, deslocamento de cor, sombras, ruído aditivo
Resultado? 12,2 milhões de amostras em inglês, japonês, coreano, russo, chinês simplificado e tradicional.
# Pseudocódigo simplificado do pipeline de dados sintéticos
import random
from synthdog import DocumentRenderer
from augmentations import apply_augmentations
idiomas = ['en', 'ja', 'ko', 'ru', 'zh_cn', 'zh_tw']
for lang in idiomas:
texto_fonte = load_moscar_subset(lang)
fontes = load_fontes_para_idioma(lang)
renderer = DocumentRenderer(fontes=fontes, modos_layout=['multi_coluna', 'tabela', 'slide', 'texto_cena'])
for _ in range(numero_amostras):
texto = random.choice(texto_fonte)
imagem, anotacoes = renderer.render(texto, modo_layout=random.choice(renderer.modos_layout))
imagem = apply_augmentations(imagem, altura_minima_texto=8)
salvar_amostra(imagem, anotacoes, lang)
Leitura relacionada: Testes Just-in-Time para Desenvolvimento Agentic — outra abordagem orientada a dados para qualidade.

Arquitetura: Backbone Compartilhado, Features Reutilizadas
O Nemotron OCR v2 usa design FOTS (Fast Oriented Text Spotting) com backbone RegNetX-8GF compartilhado. A passagem convolucional acontece uma vez, e os mapas de features são reutilizados pelos três componentes:
- Detector de Texto — localiza regiões
- Reconhecedor de Texto — Transformer pré-norm (6 camadas para multilíngue, 3 para inglês)
- Modelo Relacional — prevê agrupamento e ordem de leitura
Essa reutilização é o motivo do modelo atingir 34,7 páginas/segundo em uma única A100 — contra 1,2 páginas/s do PaddleOCR v5 server. Mais de 28x mais rápido.
Resultados de Benchmark
| Idioma | PaddleOCR (especializado) | Nemotron OCR v2 (multi) |
|---|---|---|
| Inglês | 0,096 | 0,069 |
| Japonês | 0,201 | 0,046 |
| Coreano | 0,133 | 0,047 |
| Russo | 0,163 | 0,043 |
| Chinês (Simplificado) | 0,054 | 0,035 |
| Chinês (Tradicional) | 0,094 | 0,065 |
Em dados reais (OmniDocBench), o Nemotron OCR v2 multilíngue é competitivo e muito mais rápido:
| Modelo | páginas/s | EN NED | ZH NED | Misto NED |
|---|---|---|---|---|
| PaddleOCR v5 (server) | 1,2 | 0,027 | 0,037 | 0,041 |
| Nemotron OCR v2 (multi) | 34,7 | 0,048 | 0,072 | 0,142 |
Limitações e Cuidados
- Tradeoff velocidade-precisão: O modelo multilíngue é mais lento que a versão só inglês (34,7 vs 40,7 páginas/s) por causa do reconhecedor mais pesado (6 camadas vs 3).
- Gap com mundo real: Em documentos mistos, o Nemotron v2 multilíngue mostra NED maior (0,142) comparado ao PaddleOCR (0,041). Dados sintéticos sozinhos não bastam — o modelo ainda se beneficia de ~680 mil imagens reais.
- Cobertura de idiomas: Atualmente limitado a 6 línguas. Estender para árabe, devanágari ou tailandês requer fontes e texto fonte, mas o pipeline está pronto.
Próximos Passos
- Explore o dataset: nvidia/OCR-Synthetic-Multilingual-v1 — licença CC-BY-4.0.
- Teste a demo: Nemotron OCR v2 Space — suba um documento e veja funcionando.
- Monte seu próprio pipeline: Comece com SynthDoG, adicione fontes do seu idioma e texto do mOSCAR, e experimente modos de layout.

Conclusão: Estratégia de Dados é o Diferencial
O Nemotron OCR v2 prova que investir em ajustes de arquitetura não resolve um gargalo de dados. O investimento do time em um pipeline genérico de dados sintéticos gerou acurácia quase perfeita em seis línguas — usando um único modelo unificado.
Para devs construindo sistemas OCR, o recado é claro: invista em infraestrutura de geração de dados antes de correr atrás da próxima arquitetura SOTA. Dados sintéticos te dão controle, escala e rótulos perfeitos. O desafio é o realismo, mas como a NVIDIA mostra, com aleatorização e aumento suficientes, os modelos generalizam bem para documentos reais.
O pipeline é open-source e extensível. Se você trabalha com OCR para um idioma ainda não coberto, o caminho é direto: arrume fontes, arrume texto, e renderize. O resto já está pronto.
Junto com: Native Popover API para Tooltips — outro exemplo de repensar suposições para melhores experiências de desenvolvimento.