OCR na prática: Tesseract, PaddleOCR, TrOCR
- ⬜✂️ Segmentation: U-Net, Mask R-CNN, SAM(Computer Vision Clássico)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
Pipeline OCR: detection + recognition
| Sintoma | Etapa culpada | Correção |
|---|---|---|
| O texto nem aparece na saída | Localização | Contraste, correção de rotação, limiar adaptativo |
| Aparece com caracteres trocados | Reconhecimento | Modelo específico do idioma, ou de manuscrito |
| Valores certos, colunas trocadas | Análise de layout | Ferramenta com suporte a tabela — não é problema de leitura |
| Bom em documento digital, ruim no digitalizado | Qualidade da entrada | Pré-processamento ou serviço da geração seguinte |
| Alto e errado ao mesmo tempo | Confiança mal interpretada | Confiança não é acurácia; medir no seu próprio conjunto |
Separe mentalmente dois problemas: onde está o texto (detection, responde com polígonos) e o que o texto diz (recognition, responde com string). Soluções end-to-end (PaddleOCR, Tesseract) escondem isso; soluções híbridas (DBNet + TrOCR) expõem e dão mais controle.
PaddleOCR: default sensato em 2026
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang="pt")
result = ocr.ocr("nota-fiscal.jpg", cls=True)
for line in result[0]:
box, (text, conf) = line
print(f"[{conf:.2f}] {text}")PaddleOCR é open-source (Apache-2.0), rápido em CPU, suporta 80+ idiomas, detection DBNet + recognition CRNN + classifier de ângulo. Para 80% dos casos (notas fiscais, placas, menus), é o ponto de partida correto.
TrOCR para manuscritos
from transformers import TrOCRProcessor, VisionEncoderDecoderModel
from PIL import Image
import torch
processor = TrOCRProcessor.from_pretrained("microsoft/trocr-base-handwritten")
model = VisionEncoderDecoderModel.from_pretrained("microsoft/trocr-base-handwritten").to("cuda")
def recognize_line(crop_pil):
pixel_values = processor(images=crop_pil, return_tensors="pt").pixel_values.to("cuda")
ids = model.generate(pixel_values, max_length=128)
return processor.batch_decode(ids, skip_special_tokens=True)[0]
line_crop = Image.open("manuscrito-linha.png")
print(recognize_line(line_crop))AWS Textract: extração estruturada
import boto3
textract = boto3.client("textract", region_name="us-east-1")
with open("fatura.pdf", "rb") as f:
resp = textract.analyze_document(
Document={"Bytes": f.read()},
FeatureTypes=["FORMS", "TABLES"],
)
# Extrair key-value pairs
blocks = resp["Blocks"]
kv = {b["Id"]: b for b in blocks}
for b in blocks:
if b["BlockType"] == "KEY_VALUE_SET" and "KEY" in b.get("EntityTypes", []):
# resolver relationships pra achar VALUE correspondente
passPor que separar mentalmente detecção e reconhecimento de texto, mesmo usando uma solução integrada?
Layout analysis e tabelas
Tabela é o pesadelo do OCR: linhas implícitas, células mescladas, headers em múltiplos níveis. Ferramentas especializadas: Textract (Tables feature), PaddleOCR Structure, Docling (IBM 2024), LayoutLMv3 para classificar tokens em header/row/cell.
Jamais confie 100% em OCR de documento fiscal/legal sem validação — sempre tenha confidence threshold + regra de negócio (ex.: CPF válido, soma de tabela fecha). OCR é probabilístico; contabilidade não é.
Árvore de decisão 2026
Texto impresso limpo e volume baixo: PaddleOCR. Manuscrito ou fonte rara: DBNet + TrOCR. Documento estruturado com campos (KV, tabelas) em produção: Textract/Azure DI. Scale >10M páginas/mês: vale investigar pipeline custom com PaddleOCR fine-tuned + LayoutLMv3.
Perguntas frequentes
❓ OCR clássico ou baseado em modelo de linguagem?
❓ Por que o OCR erra em documento escaneado?
❓ Como avaliar a qualidade de um OCR?
Fixando
Para documento fiscal ou legal, que salvaguarda o módulo considera obrigatória?
Por que tabelas são descritas como o caso mais difícil?
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…