Vision é um framework de visão computacional da Apple, apresentado pela primeira vez no iOS 11 em 2017. O Vision fornece algoritmos prontos para detecção facial, reconhecimento de texto (OCR), detecção de códigos de barras, rastreamento de objetos, classificação de imagens e análise de contornos — tudo executado no dispositivo usando o Neural Engine. De acordo com a Apple WWDC 2023, o Vision é usado no aplicativo Fotos padrão para reconhecimento facial e no aplicativo Câmera para detecção de texto em tempo real no iPhone e iPad.
Pontos-chave
Vision é um framework de visão computacional de alto nível que abstrai algoritmos complexos de aprendizado de máquina por trás de uma API simples de requisições (VNRequest). O desenvolvedor não precisa entender redes neurais convolucionais — basta criar o tipo de requisição apropriado, passar uma imagem e obter o resultado.
A arquitetura do Vision segue o princípio Requisição → Manipulador → Resultado: VNImageRequestHandler aceita uma imagem, executa VNRequest e retorna um array de VNObservation com os resultados. Isso permite combinar múltiplas requisições em uma única imagem — por exemplo, detectar simultaneamente rostos e texto em uma foto.
Vision suporta iOS 11+ e macOS 10.13+. A aceleração por hardware via Neural Engine requer um chip A12 Bionic ou superior. Em dispositivos com A17 Pro e série M, o Vision processa até 60 quadros por segundo para vídeo em streaming.
Principal vantagem do Vision é a privacidade completa: toda a computação é realizada no dispositivo, as imagens nunca são enviadas para um servidor. Isso permite usar o framework em aplicações que lidam com dados sensíveis, como aplicativos médicos ou bancários.
VNDetectFaceRectanglesRequest é a requisição básica do Vision para detectar rostos em uma imagem. Ela retorna as coordenadas dos retângulos que delimitam cada rosto, sem identificar uma pessoa específica.
Para análise mais detalhada, use VNDetectFaceLandmarksRequest, que identifica os pontos-chave do rosto: olhos, sobrancelhas, nariz, boca, contorno da mandíbula. Esses dados são usados para sobrepor máscaras, animar emojis e filtros em tempo real (como no FaceTime e Snapchat).
import Vision
import UIKit
guard let image = UIImage(named: "photo") else { return }
let request = VNDetectFaceRectanglesRequest()
let handler = VNImageRequestHandler(cgImage: image.cgImage!, options: [:])
try handler.perform([request])
for observation in request.results ?? [] {
let bbox = observation.boundingBox
print("Face at x=\\(bbox.origin.x), y=\\(bbox.origin.y)")
}
VNFaceObservation contém não apenas boundingBox, mas também confidence (confiança de 0 a 1) e landmarks — um array de pontos faciais se a requisição foi VNDetectFaceLandmarksRequest. Confiança abaixo de 0,5 geralmente indica um falso positivo — esses resultados devem ser descartados.
Vision também suporta VNDetectFaceCaptureQualityRequest, que avalia a qualidade da imagem facial: iluminação, nitidez, ângulo de rotação. Isso é útil para selecionar o melhor quadro durante o registro do usuário ou criar um avatar.
VNRecognizeTextRequest é o mecanismo OCR integrado da Apple, apresentado no iOS 13. Ele reconhece texto impresso em imagens com suporte para 13 idiomas: inglês, russo, chinês, japonês, coreano, italiano, alemão, espanhol, português, francês, árabe, vietnamita e tailandês.
VNRecognizeTextRequest suporta dois níveis de precisão: .fast (rápido, para texto simples em fundo contrastante) e .accurate (preciso, para cenas complexas com diferentes fontes e ângulos). .fast é 3–5 vezes mais rápido, mas lida com texto manuscrito e fontes não padronizadas de forma menos eficaz.
import Vision
let textRequest = VNRecognizeTextRequest { request, _ in
guard let observations = request.results as? [VNRecognizedTextObservation]
else { return }
for observation in observations {
let topCandidate = observation.topCandidates(1).first
print(topCandidate?.string ?? "")
}
}
textRequest.recognitionLevel = .accurate
textRequest.usesLanguageCorrection = true
A propriedade usesLanguageCorrection ativa a correção do texto reconhecido usando um modelo de idioma. Isso melhora a precisão para inglês em 10–15%, mas aumenta o tempo de processamento. A correção para russo também está disponível quando o reconhecimento apropriado é especificado.
De acordo com Apple ML Research 2022, o VNRecognizeTextRequest no nível .accurate atinge 96% de precisão para fotos nítidas de documentos em inglês e cerca de 88% para russo. Para texto em embalagens, letreiros e telas, a precisão cai para 75–85%.
| Nível de reconhecimento | Velocidade | Precisão (inglês) | Suporte russo |
|---|---|---|---|
| .fast | 0,1–0,3 s | ~85% | Sim |
| .accurate | 0,3–1,0 s | ~96% | Sim |
VNDetectBarcodesRequest é uma requisição do Vision para detectar e decodificar códigos de barras e QR codes em imagens. Todos os formatos principais são suportados: EAN-8, EAN-13, UPC-A, UPC-E, Code 39, Code 93, Code 128, PDF417, Aztec e QR.
Ao contrário do AVFoundation (AVCaptureMetadataOutput), o Vision funciona não apenas com fluxos de vídeo, mas também com imagens estáticas — permitindo escanear códigos de fotos existentes ou capturas de tela. O Vision também determina o boundingBox do código com precisão de pixel, o que é conveniente para animar um quadro ao redor do código detectado.
import Vision
let barcodeRequest = VNDetectBarcodesRequest { request, _ in
guard let observations = request.results as? [VNBarcodeObservation]
else { return }
for observation in observations {
let payload = observation.payloadStringValue ?? ""
print("Barcode: \\(payload), Symbology: \\(observation.symbology.rawValue)"
}
}
VNBarcodeObservation contém payloadStringValue (conteúdo decodificado), symbology (tipo de código) e confidence. Para QR codes, o payload pode ser uma URL, texto ou JSON. Para EAN/UPC, um código numérico de produto é retornado, que pode ser usado para pesquisar o item em um banco de dados.
Vision pode processar múltiplos códigos de barras em uma única imagem — o array de observations contém um objeto para cada código detectado. Isso é útil para escanear lotes de produtos ou documentos com vários códigos de barras.
VNDetectObjectAtPointRequest e VNSequenceRequestHandler são ferramentas do Vision para rastrear objetos em um fluxo de vídeo. O primeiro identifica um objeto pelo ponto de toque do usuário, o segundo rastreia um objeto entre quadros de vídeo.
VNSequenceRequestHandler aceita uma sequência de imagens (quadros de vídeo) e retorna a posição atualizada do objeto rastreado para cada quadro. Isso é usado em aplicativos de realidade aumentada, editores de vídeo e sistemas de vigilância.
import Vision
let trackingRequest = VNTrackObjectRequest(detectedObjectObservation: initialObservation)
let sequenceHandler = VNSequenceRequestHandler()
for frame in videoFrames {
try sequenceHandler.perform([trackingRequest],
on: frame.cgImage!)
let newBBox = trackingRequest.results?.first?.boundingBox
// Atualizar posição do objeto na tela
}
VNTrackObjectRequest usa um algoritmo de rastreamento baseado em fluxo óptico — ele não retreina o detector em cada quadro, mas calcula o deslocamento do objeto em relação à sua posição anterior. Isso permite operação em tempo real mesmo em dispositivos sem Neural Engine.
Limitação: o rastreamento pode perder o objeto durante movimento rápido, oclusão ou mudanças bruscas de iluminação. A Apple recomenda reiniciar a detecção (VNDetectObjectAtPointRequest) a cada 10–15 quadros para correção do rastreamento.
VNClassifyImageRequest é o modelo integrado do Vision para classificação de imagens em 1000 categorias (modelo ResNet-50 treinado no ImageNet). A requisição retorna um array de VNClassificationObservation com o nome da categoria e a confiança.
VNDetectContoursRequest realiza análise de contornos de imagem — extrai os limites dos objetos, útil para segmentação, delineamento e pré-processamento antes do reconhecimento. A requisição retorna um array de pontos descrevendo cada contorno na imagem.
import Vision
// Classificação de imagens
let classificationRequest = VNClassifyImageRequest { request, _ in
guard let results = request.results as? [VNClassificationObservation]
else { return }
let topMatch = results.prefix(3).filter { $0.confidence > 0.3 }
for match in topMatch {
print("\\(match.identifier): \\(match.confidence)"
}
}
VNClassifyImageRequest funciona bem para categorias gerais (gato, cachorro, carro, comida), mas não é adequado para objetos específicos — para estes, você precisa treinar um modelo Core ML personalizado e usar VNCoreMLRequest. O modelo da Apple é otimizado para dispositivos móveis e ocupa apenas 5 MB.
VNDetectContoursRequest retorna contornos como um array de pontos com o tipo de contorno (externo, interno, furo). Esta requisição é usada para pré-processamento de imagens antes de OCR (melhorar contraste do texto), para desenhar efeitos (delineamento de objetos) e para análise de formas.
| Requisição Vision | Propósito | Versão iOS |
|---|---|---|
| VNDetectFaceRectanglesRequest | Detecção de rostos em imagens | iOS 11 |
| VNRecognizeTextRequest | Reconhecimento de texto (OCR) | iOS 13 |
| VNDetectBarcodesRequest | Detecção de códigos de barras e QR | iOS 11 |
| VNClassifyImageRequest | Classificação de imagens | iOS 13 |
| VNDetectContoursRequest | Análise de contornos | iOS 14 |
| VNTrackObjectRequest | Rastreamento de objetos | iOS 11 |
Perguntas frequentes
Vision fornece algoritmos prontos (detecção facial, OCR, códigos de barras) sem treinamento de modelo. Core ML é o motor para executar modelos personalizados. Vision + VNCoreMLRequest permitem executar modelos Core ML no pipeline do Vision, obtendo o melhor dos dois mundos: detectores prontos do Vision + classificação personalizada do Core ML.
Sim, Vision suporta processamento de fluxo de vídeo em tempo real através de VNSequenceRequestHandler para rastreamento e AVCaptureVideoDataOutput para processamento quadro a quadro. Em dispositivos com A12+ e Neural Engine, o Vision processa até 60 fps para detecção facial. Para tarefas pesadas (OCR, classificação), recomenda-se processar cada 5–10º quadro.
VNRecognizeTextRequest suporta 13 idiomas: inglês, russo, chinês (simplificado e tradicional), japonês, coreano, italiano, alemão, espanhol, português, francês, árabe, vietnamita e tailandês. Para reconhecer vários idiomas em uma única imagem, especifique um array na propriedade recognitionLanguages.
Sim, através de VNCoreMLRequest. Você cria um modelo Core ML envolto em VNCoreMLModel e o passa para VNCoreMLRequest. O Vision lida automaticamente com o pré-processamento da imagem (dimensionamento, corte) e a alimenta para o modelo Core ML. O resultado é retornado como VNCoreMLFeatureValueObservation com os dados de saída do modelo.
Não, Vision realiza toda a análise completamente no dispositivo. As imagens nunca saem do dispositivo do usuário. Esta é a arquitetura fundamental da Apple: todos os frameworks de ML (Vision, NaturalLanguage, Core ML, Speech) funcionam no dispositivo para garantir privacidade. Nenhum dado é enviado para os servidores da Apple.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também