Pular para o conteúdo principal

Desafio 27: OCR - Extrair Texto de Imagens

Tempo Estimado

45 min | Custo: $1-3 (estimado) | Domínio: Implementar Soluções de Visão Computacional (10-15%)

Habilidades do exame abordadas

  • Extrair texto de imagens usando o recurso Read do Azure AI Vision
  • Converter texto manuscrito em texto digital
  • Processar documentos de múltiplas páginas

Visão Geral

O recurso Read do Azure AI Vision (parte do Image Analysis 4.0) extrai texto impresso e manuscrito de imagens e documentos. A hierarquia do texto:

Imagem → Blocks → Lines → Words (com polígonos delimitadores e confiança)

Características principais:

  • Suporta 164+ idiomas para texto impresso, 9 idiomas para manuscrito
  • Lida com texto rotacionado, inclinado e com ruído
  • Retorna polígonos delimitadores para cada elemento de texto
  • API síncrona para imagens individuais

Para PDFs de múltiplas páginas, use o modelo Read do Azure AI Document Intelligence.

Pré-requisitos

  • Assinatura Azure
  • Recurso Azure AI Services
  • Python 3.9+ ou .NET 8
  • Pacote: azure-ai-vision-imageanalysis (v1.0+)

Implementação

Tarefa 1: Extrair Texto Impresso de Imagens

import os
from azure.ai.vision.imageanalysis import ImageAnalysisClient
from azure.ai.vision.imageanalysis.models import VisualFeatures
from azure.core.credentials import AzureKeyCredential

client = ImageAnalysisClient(
endpoint=os.environ["AZURE_AI_ENDPOINT"],
credential=AzureKeyCredential(os.environ["AZURE_AI_KEY"])
)

# Extract text from an image URL
image_url = "https://learn.microsoft.com/azure/ai-services/computer-vision/media/quickstarts/presentation.png"

result = client.analyze_from_url(
image_url=image_url,
visual_features=[VisualFeatures.READ]
)

if result.read:
print("Extracted Text:")
print("-" * 40)
for block in result.read.blocks:
for line in block.lines:
print(f" Line: '{line.text}'")
print(f" Bounding polygon: {line.bounding_polygon}")

# Access individual words with confidence
for word in line.words:
print(f" Word: '{word.text}' (confidence: {word.confidence:.4f})")

Tarefa 2: Extrair Texto Manuscrito

# Read handwritten text from a local image
with open("handwritten-note.jpg", "rb") as f:
image_data = f.read()

result = client.analyze(
image_data=image_data,
visual_features=[VisualFeatures.READ]
)

if result.read:
print("Handwritten Text Extracted:")
for block in result.read.blocks:
for line in block.lines:
# Check confidence - handwriting often has lower confidence
avg_confidence = sum(w.confidence for w in line.words) / len(line.words)
confidence_indicator = "✓" if avg_confidence > 0.8 else "?"
print(f" [{confidence_indicator}] '{line.text}' (avg conf: {avg_confidence:.3f})")

Tarefa 3: Processar Documento de Múltiplas Páginas com Document Intelligence

from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeDocumentRequest
from azure.core.credentials import AzureKeyCredential

# For multi-page documents, use Document Intelligence Read model
doc_client = DocumentIntelligenceClient(
endpoint=os.environ["AZURE_AI_ENDPOINT"],
credential=AzureKeyCredential(os.environ["AZURE_AI_KEY"])
)

# Analyze a multi-page PDF
with open("multi-page-document.pdf", "rb") as f:
poller = doc_client.begin_analyze_document(
"prebuilt-read",
body=f,
content_type="application/pdf"
)

result = poller.result()

print(f"Document contains {len(result.pages)} pages")
for page in result.pages:
print(f"\n--- Page {page.page_number} ({page.width}x{page.height} {page.unit}) ---")
for line in page.lines:
print(f" '{line.content}'")

# Access full content as continuous text
print(f"\nFull content:\n{result.content[:500]}")

Saída Esperada

Extracted Text:
----------------------------------------
Line: 'Azure AI Services'
Bounding polygon: [{'x': 54, 'y': 28}, {'x': 403, 'y': 26}, ...]
Word: 'Azure' (confidence: 0.9980)
Word: 'AI' (confidence: 0.9950)
Word: 'Services' (confidence: 0.9970)
Line: 'Computer Vision'
Word: 'Computer' (confidence: 0.9920)
Word: 'Vision' (confidence: 0.9910)

Handwritten Text Extracted:
[✓] 'Meeting notes - January 2024' (avg conf: 0.892)
[?] 'discuss quarterly goals' (avg conf: 0.734)
[✓] 'Action items below' (avg conf: 0.856)

Document contains 3 pages
--- Page 1 (8.5x11.0 inch) ---
'Annual Report 2024'
'Executive Summary'

Quebra & conserta

CenárioSintomaCausa RaizCorreção
Nenhum texto detectadoResultados vaziosImagem muito pequena ou baixa qualidadeMín 50x50 px; garanta resolução adequada (300 DPI para impressão)
Idioma errado detectadoTexto ilegívelAutodetecção falhou para scripts rarosEspecifique o parâmetro language na requisição
Confiança baixa nas palavrasResultados incertosQualidade da escrita manual ou fontes incomunsAceite limiares mais baixos para manuscrito; pré-processe a imagem
413 Request Entity Too LargeArquivo rejeitadoImagem excede o limite de 20MBComprima ou redimensione a imagem antes do envio
Polígonos delimitadores incorretosBoxes desalinhadosRotação da imagem não detectadaUse auto-rotação ou pré-processe para corrigir inclinação

Verificação de Conhecimento

1. Qual é a hierarquia de texto retornada pelo recurso Read do Azure AI Vision?

2. Qual é o tamanho máximo de imagem suportado pelo recurso Read do Image Analysis?

3. Para documentos PDF de múltiplas páginas, qual serviço Azure você deve usar para extração de texto?

4. Como a API indica incerteza no reconhecimento de texto manuscrito?

5. Qual header Content-Type você deve usar ao enviar um arquivo de imagem local para OCR?

Limpeza

az group delete --name rg-ai102-vision --yes --no-wait

Saiba Mais