Apple Vision Framework: o CV on-device que a maioria dos devs ignora
O framework Vision da Apple, aquele sem o sufixo “OS”, oferece mais de duas dúzias de operações de visão computacional on-device. A maioria dos desenvolvedores iOS recorre por padrão à OpenAI Vision API, à Google Cloud Vision ou ao AWS Rekognition para tarefas que o framework executa em milissegundos no Neural Engine do dispositivo. Esse padrão reflete mais um viés do que uma avaliação: APIs na nuvem soam como “IA moderna” e o Vision soa como “encanamento de plataforma”, então a plataforma fica de fora. O viés interpreta mal o que a plataforma agora contém.
O Vision é o framework de CV local-first. Ele roda no Neural Engine quando disponível, na GPU caso contrário, e na CPU como último recurso. A inferência acontece em poucos milissegundos para a maioria das operações. O framework não tem custo por chamada. Os dados nunca saem do dispositivo. A chave de API não existe porque nenhuma API existe. Para a maior parte do trabalho de visão computacional que um app iOS faz, esta é a ferramenta certa.
TL;DR
- O Apple Vision oferece mais de duas dúzias de operações de CV on-device: reconhecimento de texto, detecção de rostos e landmarks, estimativa de pose corporal e de mãos, leitura de códigos de barras, segmentação de documentos, embeddings de imagem, saliência, detecção de animais, contornos, trajetórias, fluxo óptico e um runner para qualquer modelo Core ML.
- Cada operação roda em milissegundos no Neural Engine, não custa nada por chamada, não exige rede e não produz telemetria de terceiros.
- APIs na nuvem vencem em um caso específico: raciocínio semântico complexo sobre uma imagem (um LLM multimodal compreendendo um gráfico, um meme ou a intenção de um documento). Para operações em nível de pixel (encontrar rostos, ler texto, detectar uma mão), o Vision vence em custo, latência e privacidade.
- A conexão com agent-workflow: os resultados do Vision alimentam App Intents e chamadas ao LLM on-device do Foundation Models sem um roundtrip de rede. Todo o pipeline roda localmente.
O que o Vision realmente contém
O Vision agrupa suas operações como tipos VNRequest. Uma request é criada, configurada com parâmetros, alimentada com uma imagem (ou CVPixelBuffer, ou CIImage, ou CGImage, ou URL) e executada. Os resultados retornam como observações anexadas à request. As categorias abaixo cobrem o território do framework no iOS 26.
Reconhecimento de texto
A VNRecognizeTextRequest realiza OCR. A request suporta recognitionLevel (.fast para streams de câmera ao vivo, .accurate para escaneamento de documentos), dicas de idioma, listas de palavras personalizadas e confiança de bounding-box. O caminho .accurate no iOS 18+ lida bem com texto impresso em recibos, sinalizações e documentos; o reconhecimento de manuscrito é suportado em um subconjunto de idiomas (ver a lista de idiomas de reconhecimento da Apple3).
let request = VNRecognizeTextRequest { request, error in
guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
let lines = observations.compactMap { $0.topCandidates(1).first?.string }
print(lines.joined(separator: "\n"))
}
request.recognitionLevel = .accurate
request.usesLanguageCorrection = true
request.recognitionLanguages = ["en-US"]
let handler = VNImageRequestHandler(cgImage: image, options: [:])
try handler.perform([request])
A mesma operação através da API OpenAI Vision custa aproximadamente uma fração de centavo por chamada no modo de baixo detalhe e significativamente mais no modo de alto detalhe, leva de 1 a 3 segundos de round-trip e envia a imagem para os servidores da OpenAI. O Vision retorna resultados em 100-300 ms localmente, de graça e sem exfiltração de dados.
Detecção de rosto e landmarks
Três camadas de análise facial vêm no Vision:
- A
VNDetectFaceRectanglesRequestretorna bounding boxes para cada rosto no quadro. - A
VNDetectFaceLandmarksRequestretorna regiões estruturadas de landmarks por rosto (linha da mandíbula, boca, olhos, sobrancelhas, nariz, pupilas), cada uma com múltiplos keypoints. - A
VNDetectFaceCaptureQualityRequestretorna uma pontuação de qualidade por rosto (0-1) refletindo iluminação, nitidez e centralização. Apps podem usá-la para controlar captura de selfie ou auto-selecionar o melhor frame de uma rajada.
Para a maioria dos apps que precisam encontrar rostos, recortar para rostos, desfocar rostos ou contar rostos, a request de retângulos é a ferramenta certa. Para apps que animam algo no rosto do usuário (filtros, máscaras, tracking), landmarks com tracking de pupilas são a ferramenta certa. Nada disso requer um arquivo de modelo ou uma chamada de rede.
Pose corporal e de mãos
A VNDetectHumanBodyPoseRequest retorna as 19 articulações nomeadas em VNHumanBodyPoseObservation.JointName4 (nariz, pescoço, ombros, cotovelos, pulsos, quadris, joelhos, tornozelos, orelhas, olhos, raiz) com coordenadas 2D e confiança por articulação. A VNDetectHumanBodyPose3DRequest estende a topologia para o espaço 3D, retornando resultados VNHumanBodyPose3DObservation; a request usa dados de profundidade (AVDepthData) quando o dispositivo os expõe para melhorar a precisão, mas não exige um LiDAR Scanner.4 A VNDetectHumanHandPoseRequest retorna 21 landmarks da mão na resolução das articulações dos dedos.
A pose corporal é o que apps de fitness usam para contar repetições sem um wearable, o que apps de AR usam para anexar conteúdo virtual às mãos do usuário e o que apps de postura usam para avaliar forma. A pose de mão dirige o reconhecimento de gestos (o usuário ergue dois dedos, o app vê dois dedos). Ambas podem rodar em taxas de frame de vídeo em iPhones recentes, suficientes para AR ao vivo e entrada por gestos. Os equivalentes na nuvem são o Google MediaPipe ou APIs proprietárias de fitness-tech, que o framework substitui.
Código de barras e QR
A VNDetectBarcodesRequest lê as simbologias que a maioria dos fluxos de varejo e inventário precisa (QR, PDF417, Aztec, Code 128, Code 39, EAN-13, ITF14, Data Matrix, GS1 DataBar e mais) e retorna o payload bruto mais o retângulo de bounding. A detecção roda em milissegundos e funciona em condições de pouca luz que o app Câmera da Apple já valida.
Segmentação de documento
A VNDetectDocumentSegmentationRequest encontra documentos retangulares em um quadro e retorna seus pontos de canto, levando em conta a perspectiva. A request é o que apps de scanner de documentos usam para recortar e retificar o documento em uma imagem plana. O próprio framework VisionKit da Apple envolve a request com uma UI, mas a operação subjacente pode ser chamada diretamente quando um app precisa de uma UI personalizada.
Saliência e estética
A VNGenerateAttentionBasedSaliencyImageRequest retorna um heatmap de onde a atenção do espectador provavelmente se concentrará em uma imagem. A VNGenerateObjectnessBasedSaliencyImageRequest retorna um heatmap de onde estão os objetos. A VNCalculateImageAestheticsScoresRequest, adicionada como API pública no iOS 181, retorna pontuações de qualidade estética incluindo uma classificação de utilidade (memos, screenshots) e um valor estético. As pontuações são o que o Photos usa para fazer surgir candidatos a “Memory” e o que alimenta decisões de auto-recorte.
Classificação e embeddings de imagem
A VNClassifyImageRequest retorna os top-N rótulos de categoria para uma imagem usando um classificador embutido que cobre centenas de categorias comuns de objetos.5 A VNGenerateImageFeaturePrintRequest retorna um vetor de features (o embedding do modelo) adequado para busca por similaridade de imagem.
Embeddings são como um app de fotos, o “encontre pratos similares” de um app de receitas, ou a deduplicação por similaridade de um app de moodboard realmente funcionam. O equivalente na nuvem são embeddings OpenAI CLIP ou o Vertex AI do Google; o Vision os retorna localmente, de graça.
Tracking de objeto e trajetórias
A VNDetectTrajectoriesRequest rastreia objetos em movimento entre frames e retorna ajustes de trajetória parabólica (uma bola arremessada, uma flecha disparada). A VNTrackObjectRequest segue um objeto delimitado manualmente ao longo de uma sequência de vídeo.
Trajetórias são a primitiva subjacente para apps esportivos (rastreando uma bola de beisebol, uma de basquete, uma de tênis). A detecção funciona em um stream AVFoundation ao vivo e retorna resultados em tempo real.
Modelos personalizados via VNCoreMLRequest
A VNCoreMLRequest roda qualquer modelo Core ML através do pipeline do Vision. A request lida com pré-processamento (redimensionamento de imagem, conversão de espaço de cor, normalização) automaticamente com base na descrição de entrada do modelo. Um app treina um classificador personalizado no Create ML (um punhado de categorias, cem imagens de amostra por categoria, dez minutos de treinamento) ou baixa um modelo publicado, deposita o .mlpackage no bundle do app e o roda através do Vision com três linhas de código.
let model = try VNCoreMLModel(for: MyClassifier(configuration: .init()).model)
let request = VNCoreMLRequest(model: model) { request, error in
let results = request.results as? [VNClassificationObservation]
print(results?.first?.identifier, results?.first?.confidence)
}
let handler = VNImageRequestHandler(cgImage: image, options: [:])
try handler.perform([request])
O equivalente na nuvem para um classificador personalizado é hospedar o modelo em um servidor, pagar pela computação de inferência, gerenciar a API e aceitar a latência de rede. O Vision transforma isso em um .mlpackage no bundle do app e um request handler.
Onde APIs na nuvem realmente vencem
O território do Vision são operações em nível de pixel: encontre essa coisa, classifique essa imagem, reconheça esse texto. O framework não fornece raciocínio semântico complexo sobre o significado de uma imagem. Três casos em que APIs na nuvem são a escolha certa:
Compreensão por LLM multimodal. “O que essa pessoa está fazendo nesta imagem?” “Este gráfico é enganoso?” “Traduza este menu e me diga quais itens são vegetarianos.” Nenhuma dessas é uma pergunta em nível de pixel. Elas exigem um grande modelo multimodal para combinar percepção visual com conhecimento de mundo e linguagem. Os Foundation Models da Apple (o LLM on-device, abordado em Foundation Models on-device LLM) está começando a lidar com parte disso on-device, mas para raciocínio complexo, GPT-4o, Claude Sonnet ou Gemini ainda vencem.
Tarefas personalizadas one-shot sem dados de treinamento. O modelo de classificação do Vision é fixo; modelos Core ML personalizados exigem dados de treinamento. Um LLM multimodal pode responder “esta é uma foto de um gato com gravata-borboleta?” sem ver um único exemplo de treinamento rotulado. Para prototipagem ou tarefas pontuais em que coletar dados de treinamento é caro demais, LLMs na nuvem são a ferramenta certa.
Inteligência de documento além do OCR. O OCR do Vision retorna texto. Uma API de inteligência de documento (AWS Textract, Google Document AI, Azure Form Recognizer) retorna campos estruturados: número da fatura, data, itens de linha, totais. A estruturação é o valor agregado, não o OCR. Para fluxos de trabalho de documento de alto valor, as APIs na nuvem geralmente são certas; para “leia este recibo e despeje o texto”, o Vision é.
O padrão: a nuvem vence em raciocínio e em APIs verticais altamente especializadas; o Vision vence em primitivas de percepção.
Comparação honesta de latência e custo
Um pipeline de inferência representativo rodando no iPhone 16 Pro (chip A18 Pro):
| Operação | Vision (on-device) | API OpenAI Vision | AWS Rekognition |
|---|---|---|---|
| OCR (1 página de recibo) | 150-300 ms | 1-3 s round-trip + custo por imagem | 200-500 ms + custo por imagem |
| Detecção de rosto (1 frame) | 5-15 ms | 1-2 s + custo | 100-300 ms + custo |
| Pose corporal (60fps ao vivo) | <16 ms | não tempo real | não tempo real |
| Embedding de imagem | 20-40 ms | 200-500 ms + custo | não oferecido diretamente |
| Classificador personalizado | depende do tamanho do modelo | requer modelo hospedado | requer modelo hospedado |
Os números acima são derivados de benchmarks públicos da Apple e medições reportadas por desenvolvedores; a mensagem é a ordem de grandeza, não o número exato. As vitórias do Vision estão em custo (zero por chamada), em latência de cauda (sem jitter de rede) e em privacidade (os dados nunca saem do dispositivo).
O custo se acumula quando um app chama operações de visão com frequência. Um app de edição de fotos processando 100 imagens por sessão custa na ordem de dólares por sessão através de APIs na nuvem e zero através do Vision.
A conexão com agent-workflow
O Vision combina perfeitamente com duas ideias do cluster já publicadas:
App Intents tools para Apple Intelligence. Quando o app expõe uma capacidade “Encontrar rostos nas minhas fotos” ou “Ler texto do screenshot” através de um AppIntent, o método perform do intent roda o Vision localmente e retorna um resultado estruturado. O orquestrador do Apple Intelligence pode chamar o intent sem enviar a foto do usuário para um servidor. O post sobre App Intents percorre o contrato de superfície.
Foundation Models LLM on-device. Um pipeline que precisa tanto de percepção quanto de raciocínio roda primeiro o Vision (extrai texto, encontra rostos, localiza objetos) e depois os Foundation Models (raciocina sobre o que foi encontrado, gera um resumo). Ambas as etapas rodam on-device. Total de chamadas de rede: zero. O post sobre Foundation Models explica como chamar o LLM; este post argumenta que o Vision é o que o alimenta sem um roundtrip de nuvem.
let textRequest = VNRecognizeTextRequest()
textRequest.recognitionLevel = .accurate
let handler = VNImageRequestHandler(cgImage: receiptImage, options: [:])
try handler.perform([textRequest])
let extractedText = (textRequest.results ?? [])
.compactMap { ($0 as? VNRecognizedTextObservation)?.topCandidates(1).first?.string }
.joined(separator: "\n")
let llmResponse = await foundationModel.generate(
"Summarize this receipt as JSON with merchant, total, and date fields:\n\(extractedText)"
)
Todo o pipeline roda no dispositivo. Sem chave de API. Sem chamada de rede. Sem exposição de dados a terceiros.
O que amadureceu nas últimas duas releases
Três adições que merecem ser nomeadas, com datação conservadora contra as release notes da Apple2:
Pontuação de estética como API pública (iOS 18). A VNCalculateImageAestheticsScoresRequest retorna pontuações incluindo classificação de utilidade e valor estético, substituindo o que apps de curadoria de fotos antes precisavam aproximar com modelos Core ML personalizados.
OCR multilíngue aprimorado. A VNRecognizeTextRequest expandiu seu suporte a scripts não latinos nas releases recentes, diminuindo a distância para serviços de OCR na nuvem que historicamente tinham cobertura multilíngue mais forte. A documentação de reconhecimento de texto da Apple lista o suporte atual de idiomas3.
Segmentação de documento com integração com VisionKit. A VNDetectDocumentSegmentationRequest encontra documentos retangulares e retorna pontos de canto; o VNDocumentCameraViewController do VisionKit envolve a captura de documento em uma UI projetada para usuários, enquanto o DataScannerViewController (iOS 16+) cobre escaneamento de texto ao vivo e códigos legíveis por máquina.6
As capacidades principais do framework (rosto, texto, pose, código de barras, embeddings) estão maduras há várias releases do iOS. O padrão: estender em vez de reinventar.
Por que a maioria dos desenvolvedores ignora o Vision
Três razões pelas quais o framework é ignorado apesar de o caso ser claro:
Hábito cloud-first. A maior parte do desenvolvimento moderno de IA acontece primeiro contra APIs na nuvem. Os desenvolvedores sabem como chamar a OpenAI; a área de superfície de VNRecognizeTextRequest mais VNImageRequestHandler mais VNRecognizedTextObservation parece ser mais API para aprender por algo que, em contagem de linhas, são menos linhas do que chamar a OpenAI Vision (sem auth, sem HTTP, sem retry, sem parse de JSON).
Erro de avaliação de capacidade. Desenvolvedores que não verificaram o framework recentemente assumem que ele cobre apenas OCR e códigos de barras. A lista de categorias acima são mais de duas dúzias de capacidades, várias das quais não têm equivalente cloud-native e várias das quais correspondem a APIs comerciais sem o custo.
Divergência entre protótipo e produção. APIs na nuvem vencem na prototipagem inicial (um comando curl para obter um resultado), e o protótipo vira o pipeline de produção sem uma reavaliação. O movimento certo é prototipar com o que for mais rápido e reavaliar a camada de percepção quando o fluxo de trabalho for real.
A correção não é recusar APIs na nuvem; a correção é saber o que a plataforma contém para que a escolha seja real.
O que esse padrão significa para apps iOS 26+
Três conclusões.
-
Padrão para Vision em primitivas de percepção. Encontre rostos, leia texto, detecte códigos de barras, rode estimativa de pose, obtenha embeddings de imagem. O framework roda em milissegundos no Neural Engine, custa zero, não deixa rastro de dados a terceiros. Para operações de CV em nível de pixel, o framework é o ponto de partida certo.
-
Use APIs na nuvem para raciocínio, não percepção. Um LLM multimodal compreendendo o significado da imagem, uma API vertical de inteligência de documento extraindo campos estruturados, uma tarefa personalizada one-shot sem dados de treinamento. Esses são o território da nuvem; cedê-los à nuvem é correto.
-
Combine Vision com Foundation Models para pipelines totalmente on-device. A percepção (Vision) alimenta o raciocínio (LLM on-device). O pipeline roda localmente de ponta a ponta, sem chaves de API, sem jitter de rede e sem telemetria saindo do dispositivo. O post sobre Foundation Models do cluster cobre a metade do LLM; o Vision é a metade da entrada.
O cluster Apple Ecosystem completo: App Intents tipados; servidores MCP; a questão de roteamento; Foundation Models; a distinção entre LLM de runtime e de tooling; três superfícies; o padrão de fonte única da verdade; Two MCP Servers; hooks para desenvolvimento Apple; Live Activities; o runtime do watchOS; internals do SwiftUI; o modelo mental espacial do RealityKit; disciplina de schema do SwiftData; padrões Liquid Glass; shipping multi-plataforma; a matriz de plataformas; sobre o que me recuso a escrever. O hub está em Apple Ecosystem Series. Para o contexto mais amplo de iOS-com-AI-agents, veja o guia iOS Agent Development.
FAQ
Qual é a diferença entre Apple Vision e visionOS?
O framework Vision é a API de visão computacional on-device para iOS, macOS e visionOS. O visionOS é o sistema operacional para o Apple Vision Pro. A sobreposição de nomes é infeliz. O Vision (o framework) roda em todo dispositivo Apple moderno; o visionOS (o OS) roda especificamente no hardware do Vision Pro.
Quando devo usar o Vision em vez da API OpenAI Vision ou da Google Cloud Vision?
Para tarefas de percepção em nível de pixel (encontrar rostos, ler texto, detectar objetos, contar itens, estimar pose, gerar embeddings de imagem), o Vision é quase sempre a escolha certa. Ele roda em milissegundos, não custa nada por inferência e mantém os dados do usuário no dispositivo. APIs na nuvem são certas quando a tarefa exige raciocínio semântico complexo sobre o significado de uma imagem, ou quando uma API vertical de inteligência de documento fornece campos estruturados além da extração de texto.
Posso rodar meu próprio modelo Core ML através do Vision?
Sim. A VNCoreMLRequest envolve qualquer modelo Core ML e lida com pré-processamento automaticamente. Deposite o arquivo .mlpackage no bundle do app, instancie o modelo, envolva-o em um VNCoreMLModel e o rode através de um request handler. O mesmo handler pode rodar múltiplas requests em paralelo, incluindo as requests embutidas do Vision e o modelo Core ML personalizado.
Como o dispatch do Vision funciona no Apple Silicon?
O Vision (e os modelos Core ML que ele roda) faz dispatch automaticamente para o Neural Engine quando disponível, recai para a GPU quando não, e para a CPU como último recurso. O framework escolhe o caminho mais rápido para o dispositivo e a operação. Para a maioria dos iPhones modernos (A12 Bionic e posteriores), o Neural Engine lida com o grosso da inferência; o desenvolvedor não configura o dispatch manualmente.
O que há de novo no iOS 18 e iOS 26?
O resumo conservador, datado contra as release notes da Apple: a VNCalculateImageAestheticsScoresRequest foi adicionada como API pública no iOS 18; a VNRecognizeTextRequest expandiu o suporte multilíngue nas releases recentes; o DataScannerViewController do VisionKit (iOS 16+) cobre texto ao vivo e códigos legíveis por máquina, enquanto o VNDocumentCameraViewController cobre captura de documento. As capacidades principais (texto, rosto, pose, códigos de barras, embeddings) estão maduras há várias releases do iOS.
Referências
-
Documentação do Apple Developer:
VNCalculateImageAestheticsScoresRequest, introduzida no iOS 18.0+. ↩ -
Documentação do Apple Developer: framework Vision, referência para requests disponíveis e disponibilidade por plataforma. ↩
-
Documentação do Apple Developer: Recognizing Text in Images e
VNRecognizeTextRequest, idiomas de reconhecimento suportados. ↩↩ -
Documentação do Apple Developer:
VNDetectHumanBodyPose3DRequesteVNHumanBodyPoseObservation.JointName. A pose corporal 3D usaAVDepthDataquando o dispositivo o expõe; LiDAR não é exigido. ↩↩ -
Documentação do Apple Developer:
VNClassifyImageRequesteknownClassifications(forRevision:)para o conjunto de rótulos em runtime. ↩ -
Documentação do Apple Developer:
DataScannerViewController(iOS 16+, escaneia texto ao vivo e códigos legíveis por máquina) eVNDocumentCameraViewController(captura de documento). ↩