Vision es un framework de visión artificial de Apple, presentado por primera vez en iOS 11 en 2017. Vision proporciona algoritmos listos para usar para detección de rostros, reconocimiento de texto (OCR), detección de códigos de barras, seguimiento de objetos, clasificación de imágenes y análisis de contornos, todo realizado en el dispositivo utilizando Neural Engine. Según Apple WWDC 2023, Vision se utiliza en la aplicación estándar Fotos para el reconocimiento de rostros y en la aplicación Cámara para la detección de texto en tiempo real en iPhone y iPad.
Puntos clave
Vision es un framework de visión artificial de alto nivel que abstrae algoritmos complejos de aprendizaje automático detrás de una API simple de solicitudes (VNRequest). El desarrollador no necesita entender redes neuronales convolucionales: simplemente crea el tipo de solicitud adecuado, pasa una imagen y obtiene el resultado.
La arquitectura de Vision sigue el principio Solicitud → Manejador → Resultado: VNImageRequestHandler acepta una imagen, ejecuta VNRequest y devuelve un array de VNObservation con los resultados. Esto permite combinar múltiples solicitudes en una sola imagen, por ejemplo, detectar simultáneamente rostros y texto en una foto.
Vision es compatible con iOS 11+ y macOS 10.13+. La aceleración por hardware a través de Neural Engine requiere un chip A12 Bionic o superior. En dispositivos con A17 Pro y la serie M, Vision procesa hasta 60 cuadros por segundo para video en streaming.
Ventaja clave de Vision es la privacidad total: todos los cálculos se realizan en el dispositivo, las imágenes nunca se envían a un servidor. Esto permite utilizar el framework en aplicaciones que manejan datos sensibles, como aplicaciones médicas o bancarias.
VNDetectFaceRectanglesRequest es la solicitud básica de Vision para detectar rostros en una imagen. Devuelve las coordenadas de los rectángulos que delimitan cada rostro, sin identificar a una persona específica.
Para un análisis más detallado, use VNDetectFaceLandmarksRequest, que identifica los puntos clave del rostro: ojos, cejas, nariz, boca, contorno mandibular. Estos datos se utilizan para superponer máscaras, animar emojis y filtros en tiempo real (como en FaceTime y 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 contiene no solo boundingBox, sino también confidence (confianza de 0 a 1) y landmarks, un array de puntos faciales si la solicitud fue VNDetectFaceLandmarksRequest. Una confianza inferior a 0.5 generalmente indica un falso positivo; estos resultados se recomienda descartarlos.
Vision también admite VNDetectFaceCaptureQualityRequest, que evalúa la calidad de la imagen facial: iluminación, nitidez, ángulo de rotación. Esto es útil para seleccionar el mejor cuadro durante el registro de usuario o para crear un avatar.
VNRecognizeTextRequest es el motor OCR integrado de Apple, presentado en iOS 13. Reconoce texto impreso en imágenes con soporte para 13 idiomas: inglés, ruso, chino, japonés, coreano, italiano, alemán, español, portugués, francés, árabe, vietnamita y tailandés.
VNRecognizeTextRequest admite dos niveles de precisión: .fast (rápido, para texto simple sobre fondo contrastante) y .accurate (preciso, para escenas complejas con diferentes fuentes y ángulos). .fast es de 3 a 5 veces más rápido, pero maneja menos eficazmente el texto manuscrito y las fuentes no estándar.
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
La propiedad usesLanguageCorrection activa la corrección del texto reconocido mediante un modelo de lenguaje. Esto mejora la precisión para inglés en un 10–15%, pero aumenta el tiempo de procesamiento. La corrección para ruso también está disponible si se especifica el reconocimiento adecuado.
Según Apple ML Research 2022, VNRecognizeTextRequest en nivel .accurate alcanza un 96% de precisión para fotos nítidas de documentos en inglés y aproximadamente un 88% para ruso. Para texto en envases, letreros y pantallas, la precisión disminuye al 75–85%.
| Nivel de reconocimiento | Velocidad | Precisión (inglés) | Soporte ruso |
|---|---|---|---|
| .fast | 0.1–0.3 s | ~85% | Sí |
| .accurate | 0.3–1.0 s | ~96% | Sí |
VNDetectBarcodesRequest es una solicitud de Vision para detectar y decodificar códigos de barras y códigos QR en imágenes. Se admiten todos los formatos principales: EAN-8, EAN-13, UPC-A, UPC-E, Code 39, Code 93, Code 128, PDF417, Aztec y QR.
A diferencia de AVFoundation (AVCaptureMetadataOutput), Vision funciona no solo con flujos de video, sino también con imágenes estáticas, lo que permite escanear códigos desde fotos existentes o capturas de pantalla. Vision también determina el boundingBox del código con precisión de píxel, lo que es conveniente para animar un marco alrededor del 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 contiene payloadStringValue (contenido decodificado), symbology (tipo de código) y confidence. Para códigos QR, el payload puede ser una URL, texto o JSON. Para EAN/UPC, se devuelve un código numérico de producto que se puede usar para buscar el artículo en una base de datos.
Vision puede procesar múltiples códigos de barras en una sola imagen: el array de observations contiene un objeto por cada código detectado. Esto es útil para escanear lotes de productos o documentos con múltiples códigos de barras.
VNDetectObjectAtPointRequest y VNSequenceRequestHandler son herramientas de Vision para rastrear objetos en un flujo de video. La primera identifica un objeto por el punto de toque del usuario, la segunda rastrea un objeto entre fotogramas de video.
VNSequenceRequestHandler acepta una secuencia de imágenes (fotogramas de video) y devuelve la posición actualizada del objeto rastreado para cada fotograma. Esto se utiliza en aplicaciones de realidad aumentada, editores de video y sistemas de videovigilancia.
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
// Actualizar posición del objeto en pantalla
}
VNTrackObjectRequest utiliza un algoritmo de seguimiento basado en flujo óptico: no reentrena el detector en cada fotograma, sino que calcula el desplazamiento del objeto respecto a su posición anterior. Esto permite trabajar en tiempo real incluso en dispositivos sin Neural Engine.
Limitación: el seguimiento puede perder el objeto durante movimientos rápidos, occlusiones o cambios bruscos de iluminación. Apple recomienda reiniciar la detección (VNDetectObjectAtPointRequest) cada 10–15 fotogramas para corregir el seguimiento.
VNClassifyImageRequest es el modelo integrado de Vision para clasificación de imágenes en 1000 categorías (modelo ResNet-50 entrenado en ImageNet). La solicitud devuelve un array de VNClassificationObservation con el nombre de la categoría y la confianza.
VNDetectContoursRequest realiza análisis de contornos de imágenes: extrae los límites de los objetos, útil para segmentación, delineado y preprocesamiento antes del reconocimiento. La solicitud devuelve un array de puntos que describen cada contorno en la imagen.
import Vision
// Clasificación de imágenes
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 bien para categorías generales (gato, perro, coche, comida), pero no es adecuado para objetos específicos; para estos, se necesita entrenar un modelo Core ML personalizado y usar VNCoreMLRequest. El modelo de Apple está optimizado para dispositivos móviles y ocupa solo 5 MB.
VNDetectContoursRequest devuelve contornos como un array de puntos con el tipo de contorno (externo, interno, agujero). Esta solicitud se utiliza para preprocesar imágenes antes de OCR (mejorar el contraste del texto), para dibujar efectos (delineado de objetos) y para análisis de formas.
| Solicitud Vision | Propósito | Versión iOS |
|---|---|---|
| VNDetectFaceRectanglesRequest | Detección de rostros en imágenes | iOS 11 |
| VNRecognizeTextRequest | Reconocimiento de texto (OCR) | iOS 13 |
| VNDetectBarcodesRequest | Detección de códigos de barras y QR | iOS 11 |
| VNClassifyImageRequest | Clasificación de imágenes | iOS 13 |
| VNDetectContoursRequest | Análisis de contornos | iOS 14 |
| VNTrackObjectRequest | Seguimiento de objetos | iOS 11 |
Preguntas frecuentes
Vision proporciona algoritmos listos para usar (detección de rostros, OCR, códigos de barras) sin necesidad de entrenar modelos. Core ML es el motor para ejecutar modelos personalizados. Vision + VNCoreMLRequest permiten ejecutar modelos Core ML en el pipeline de Vision, obteniendo lo mejor de ambos mundos: detectores listos de Vision + clasificación personalizada de Core ML.
Sí, Vision admite procesamiento de flujo de video en tiempo real a través de VNSequenceRequestHandler para seguimiento y AVCaptureVideoDataOutput para procesamiento fotograma a fotograma. En dispositivos con A12+ y Neural Engine, Vision procesa hasta 60 fps para detección de rostros. Para tareas pesadas (OCR, clasificación), se recomienda procesar cada 5–10 fotograma.
VNRecognizeTextRequest admite 13 idiomas: inglés, ruso, chino (simplificado y tradicional), japonés, coreano, italiano, alemán, español, portugués, francés, árabe, vietnamita y tailandés. Para reconocer múltiples idiomas en una sola imagen, especifique un array en la propiedad recognitionLanguages.
Sí, a través de VNCoreMLRequest. Crea un modelo Core ML envuelto en VNCoreMLModel y lo pasa a VNCoreMLRequest. Vision maneja automáticamente el preprocesamiento de la imagen (escalado, recorte) y lo alimenta al modelo Core ML. El resultado se devuelve como VNCoreMLFeatureValueObservation con los datos de salida del modelo.
No, Vision realiza todo el análisis completamente en el dispositivo. Las imágenes nunca salen del dispositivo del usuario. Esta es la arquitectura fundamental de Apple: todos los frameworks de ML (Vision, NaturalLanguage, Core ML, Speech) funcionan en el dispositivo para garantizar la privacidad. No se envían datos a los servidores de Apple.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también