El framework Vision de Apple: lo que viene incluido y para lo que la mayoría de los devs recurre a APIs en la nube
El framework Vision de Apple, el que no lleva el sufijo “OS”, incluye más de dos docenas de operaciones de visión por computadora que se ejecutan en el dispositivo. La mayoría de los desarrolladores de iOS recurren por defecto a OpenAI Vision API, Google Cloud Vision o AWS Rekognition para tareas que el framework realiza en microsegundos sobre el Neural Engine del dispositivo. Esa elección por defecto refleja un sesgo más que una evaluación: las APIs en la nube se sienten como “IA moderna” y Vision se siente como “fontanería de la plataforma”, así que la plataforma queda relegada. El sesgo malinterpreta lo que la plataforma contiene hoy.
Vision es el framework de CV con prioridad local. Se ejecuta en el Neural Engine cuando está disponible, en la GPU cuando no, y en la CPU como último recurso. La inferencia ocurre en pocos milisegundos para la mayoría de las operaciones. El framework no cuesta nada por llamada. Los datos nunca salen del dispositivo. La clave de API no existe porque no existe ninguna API. Para la mayor parte del trabajo de visión por computadora que hace una app de iOS, esta es la herramienta correcta.
TL;DR
- Apple Vision ofrece más de dos docenas de operaciones de CV en el dispositivo: reconocimiento de texto, detección de caras y puntos de referencia, estimación de pose corporal y de manos, lectura de códigos de barras, segmentación de documentos, embeddings de imágenes, saliencia, detección de animales, contornos, trayectorias, flujo óptico y un runner para cualquier modelo de Core ML.
- Cada operación corre en milisegundos sobre el Neural Engine, no cuesta nada por llamada, no requiere red y no produce telemetría de terceros.
- Las APIs en la nube ganan en un caso específico: razonamiento semántico complejo sobre una imagen (un LLM multimodal entendiendo un gráfico, un meme o la intención de un documento). Para operaciones a nivel de píxel (encontrar caras, leer texto, detectar una mano), Vision gana en costo, latencia y privacidad.
- La conexión con flujos de agentes: los resultados de Vision alimentan App Intents y llamadas al LLM on-device de Foundation Models sin un viaje de ida y vuelta por la red. Toda la pipeline corre localmente.
Qué contiene Vision realmente
Vision agrupa sus operaciones como tipos VNRequest. Se crea una solicitud, se configura con parámetros, se le entrega una imagen (o un CVPixelBuffer, o un CIImage, o un CGImage, o una URL) y se ejecuta. Los resultados regresan como observaciones adjuntas a la solicitud. Las categorías a continuación cubren el territorio del framework a partir de iOS 26.
Reconocimiento de texto
VNRecognizeTextRequest realiza OCR. La solicitud admite recognitionLevel (.fast para flujos de cámara en vivo, .accurate para escaneo de documentos), pistas de idioma, listas de palabras personalizadas y confianza por bounding box. La ruta accurate en iOS 18+ rivaliza con APIs comerciales de OCR sobre recibos, letreros y documentos impresos; el reconocimiento de escritura a mano se admite en muchos idiomas.
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])
La misma operación a través de OpenAI Vision API cuesta aproximadamente una fracción de centavo por llamada en modo de bajo detalle y considerablemente más en modo de alto detalle, tarda 1-3 segundos de ida y vuelta y envía la imagen a los servidores de OpenAI. Vision devuelve resultados en 100-300 ms localmente, gratis y sin exfiltración de datos.
Detección de caras y puntos de referencia
Vision incluye tres capas de análisis facial:
VNDetectFaceRectanglesRequestdevuelve bounding boxes para cada cara en el cuadro.VNDetectFaceLandmarksRequestdevuelve regiones estructuradas de puntos de referencia por cara (mandíbula, boca, ojos, cejas, nariz, pupilas), cada una con múltiples keypoints.VNDetectFaceCaptureQualityRequestdevuelve un puntaje de calidad que la app Cámara usa para temporizar la captura de selfies.
Para la mayoría de las apps que necesitan encontrar caras, recortar a las caras, difuminar caras o contar caras, la solicitud de rectángulos es la herramienta correcta. Para apps que animan algo sobre la cara del usuario (filtros, máscaras, tracking), los puntos de referencia más el seguimiento de pupilas son la herramienta correcta. Nada de esto requiere un archivo de modelo ni una llamada de red.
Pose corporal y de manos
VNDetectHumanBodyPoseRequest devuelve las 19 articulaciones nombradas en VNHumanBodyPoseObservation.JointName4 (nariz, cuello, hombros, codos, muñecas, caderas, rodillas, tobillos, orejas, ojos, raíz) con coordenadas 2D y confianza por articulación. VNDetectHumanBodyPose3DRequest extiende la topología al espacio 3D en dispositivos con un escáner LiDAR. VNDetectHumanHandPoseRequest devuelve 21 puntos de referencia de la mano con resolución a nivel de articulación de los dedos.
La pose corporal es lo que las apps de fitness usan para contar repeticiones sin un wearable, lo que las apps de AR usan para anclar contenido virtual a las manos del usuario y lo que las apps de postura usan para evaluar la forma. La pose de manos impulsa el reconocimiento de gestos (el usuario levanta dos dedos, la app ve dos dedos). Ambas corren a 60 fps en un Neural Engine reciente de iPhone. Los equivalentes en la nube son Google MediaPipe o APIs propietarias de fitness-tech, que el framework reemplaza.
Códigos de barras y QR
VNDetectBarcodesRequest lee las simbologías que la mayoría de los flujos de retail e inventario necesitan (QR, PDF417, Aztec, Code 128, Code 39, EAN-13, ITF14, Data Matrix, GS1 DataBar, y más) y devuelve la carga útil en bruto más el rectángulo delimitador. La detección corre en milisegundos y funciona en condiciones de poca luz que la app Cámara de Apple ya valida.
Segmentación de documentos
VNDetectDocumentSegmentationRequest encuentra documentos rectangulares en un cuadro y devuelve sus puntos de esquina, considerando la perspectiva. La solicitud es lo que las apps escáner de documentos usan para recortar y rectificar el documento a una imagen plana. El propio framework VisionKit de Apple envuelve la solicitud junto con una UI, pero la operación subyacente puede invocarse directamente cuando una app necesita una UI personalizada.
Saliencia y estética
VNGenerateAttentionBasedSaliencyImageRequest devuelve un mapa de calor de dónde es más probable que la atención del espectador se enfoque en una imagen. VNGenerateObjectnessBasedSaliencyImageRequest devuelve un mapa de calor de dónde están los objetos. VNCalculateImageAestheticsScoresRequest, añadida como API pública en iOS 181, devuelve puntajes de calidad estética incluyendo una clasificación de utilidad (memorandos, capturas de pantalla) y un valor estético. Los puntajes son los que Photos usa para sugerir candidatos de “Recuerdos” y los que alimentan las decisiones de auto-recorte.
Clasificación de imágenes y embeddings
VNClassifyImageRequest devuelve etiquetas de categoría top-N para una imagen usando un clasificador integrado (más de 1.000 categorías a partir de un modelo entrenado con datos a escala web). VNGenerateImageFeaturePrintRequest devuelve un vector de características (el embedding del modelo) apto para búsqueda de similitud entre imágenes.
Los embeddings son la forma en que una app de Photos, el “encontrar platos similares” de una app de recetas o la deduplicación-por-similitud de una app de moodboards funciona en la práctica. El equivalente en la nube son los embeddings de OpenAI CLIP o Vertex AI de Google; Vision los devuelve localmente y gratis.
Seguimiento de objetos y trayectorias
VNDetectTrajectoriesRequest rastrea objetos en movimiento a lo largo de los cuadros y devuelve ajustes de trayectoria parabólica (una pelota lanzada, una flecha disparada). VNTrackObjectRequest sigue un objeto delimitado manualmente a lo largo de una secuencia de video.
Las trayectorias son la primitiva subyacente para apps deportivas (rastrear una pelota de béisbol, una de baloncesto, una de tenis). La detección funciona sobre un flujo en vivo de AVFoundation y devuelve resultados en tiempo real.
Modelos personalizados vía VNCoreMLRequest
VNCoreMLRequest ejecuta cualquier modelo de Core ML a través de la pipeline de Vision. La solicitud maneja el preprocesamiento (redimensionamiento de imagen, conversión de espacio de color, normalización) automáticamente con base en la descripción de entrada del modelo. Una app entrena un clasificador personalizado en Create ML (un puñado de categorías, cien imágenes de muestra por categoría, diez minutos de entrenamiento) o descarga un modelo publicado, suelta el .mlpackage en el bundle de la app y lo ejecuta a través de Vision con tres líneas 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])
El equivalente en la nube para un clasificador personalizado consiste en hospedar el modelo en un servidor, pagar el cómputo de inferencia, gestionar la API y aceptar la latencia de red. Vision lo convierte en un .mlpackage dentro del bundle de la app y un manejador de solicitudes.
Dónde ganan realmente las APIs en la nube
El territorio de Vision es el de las operaciones a nivel de píxel: encuentra esto, clasifica esta imagen, reconoce este texto. El framework no provee razonamiento semántico complejo sobre el significado de una imagen. Tres casos en los que las APIs en la nube son la decisión correcta:
Comprensión multimodal con LLM. “¿Qué está haciendo esta persona en esta imagen?” “¿Es engañoso este gráfico?” “Traduce este menú y dime qué platos son vegetarianos.” Ninguna de esas son preguntas a nivel de píxel. Requieren un gran modelo multimodal que combine percepción visual con conocimiento del mundo y lenguaje. Foundation Models de Apple (el LLM on-device, cubierto en Foundation Models on-device LLM) está empezando a manejar parte de esto en el dispositivo, pero para razonamiento complejo, GPT-4o, Claude Sonnet o Gemini siguen ganando.
Tareas personalizadas one-shot sin datos de entrenamiento. El modelo de clasificación de Vision es fijo; los modelos personalizados de Core ML requieren datos de entrenamiento. Un LLM multimodal puede responder “¿es esta una foto de un gato con corbata de moño?” sin haber visto un solo ejemplo etiquetado. Para prototipado o tareas puntuales en las que recolectar datos de entrenamiento es demasiado costoso, los LLMs en la nube son la herramienta correcta.
Inteligencia documental más allá del OCR. El OCR de Vision devuelve texto. Una API de inteligencia documental (AWS Textract, Google Document AI, Azure Form Recognizer) devuelve campos estructurados: número de factura, fecha, partidas, totales. La estructuración es el valor agregado, no el OCR. Para flujos documentales de alto valor, las APIs en la nube suelen ser la decisión correcta; para “lee este recibo y vuelca el texto”, lo es Vision.
El patrón: la nube gana en razonamiento y en APIs verticales altamente especializadas; Vision gana en primitivas de percepción.
Comparación honesta de latencia y costo
Una pipeline de inferencia representativa corriendo en un iPhone 16 Pro (chip A18 Pro):
| Operación | Vision (en el dispositivo) | OpenAI Vision API | AWS Rekognition |
|---|---|---|---|
| OCR (recibo de 1 página) | 150-300 ms | 1-3 s ida y vuelta + costo por imagen | 200-500 ms + costo por imagen |
| Detección de caras (1 cuadro) | 5-15 ms | 1-2 s + costo | 100-300 ms + costo |
| Pose corporal (en vivo a 60fps) | <16 ms | no en tiempo real | no en tiempo real |
| Embedding de imagen | 20-40 ms | 200-500 ms + costo | no se ofrece directamente |
| Clasificador personalizado | depende del tamaño del modelo | requiere modelo hospedado | requiere modelo hospedado |
Los números anteriores se derivan de benchmarks públicos de Apple y mediciones reportadas por desarrolladores; el mensaje es el orden de magnitud, no la cifra exacta. Las victorias de Vision están en el costo (cero por llamada), en la latencia de cola (sin jitter de red) y en la privacidad (los datos nunca salen del dispositivo).
El costo se acumula cuando una app llama operaciones de visión con frecuencia. Una app de edición de fotos que procesa 100 imágenes por sesión cuesta del orden de dólares por sesión a través de APIs en la nube y cero a través de Vision.
La conexión con flujos de agentes
Vision se acopla con limpieza a dos ideas del clúster que ya se publicaron:
Herramientas de App Intents para Apple Intelligence. Cuando la app expone una capacidad de “Encontrar caras en mis fotos” o “Leer texto de una captura de pantalla” mediante un AppIntent, el método perform del intent ejecuta Vision localmente y devuelve un resultado estructurado. El orquestador de Apple Intelligence puede invocar el intent sin enviar la foto del usuario a un servidor. El post sobre App Intents recorre el contrato de superficie.
LLM on-device de Foundation Models. Una pipeline que necesita tanto percepción como razonamiento ejecuta primero Vision (extraer texto, encontrar caras, localizar objetos) y después Foundation Models (razonar sobre lo encontrado, generar un resumen). Ambas etapas corren en el dispositivo. Llamadas de red totales: cero. El post sobre Foundation Models explica cómo invocar el LLM; este post sostiene que Vision es lo que lo alimenta sin un viaje de ida y vuelta a la nube.
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)"
)
Toda la pipeline corre en el dispositivo. Sin clave de API. Sin llamada de red. Sin exposición de datos a terceros.
Qué ha madurado en los dos últimos lanzamientos
Tres adiciones que vale la pena nombrar, con fechas conservadoras contrastadas con las notas de lanzamiento de Apple2:
Puntuación de estética como API pública (iOS 18). VNCalculateImageAestheticsScoresRequest devuelve puntajes que incluyen clasificación de utilidad y valor estético, sustituyendo lo que las apps de curaduría fotográfica antes tenían que aproximar con modelos personalizados de Core ML.
OCR multilingüe mejorado. VNRecognizeTextRequest ha ampliado su soporte de scripts no latinos a lo largo de los lanzamientos recientes, acortando la brecha con servicios de OCR en la nube que históricamente tenían mayor cobertura multilingüe. La documentación de reconocimiento de texto de Apple lista el soporte de idiomas actual3.
Segmentación de documentos con integración a VisionKit. VNDetectDocumentSegmentationRequest encuentra documentos rectangulares y devuelve los puntos de esquina; el DataScannerViewController de VisionKit envuelve la solicitud con una UI diseñada para escaneo de documentos en vivo.
Las capacidades estrella del framework (cara, texto, pose, código de barras, embeddings) llevan varios lanzamientos de iOS maduras. El patrón: extender en lugar de reinventar.
Por qué la mayoría de los desarrolladores se saltan Vision
Tres razones por las cuales el framework queda relegado a pesar de que el caso a su favor es claro:
Hábito cloud-first. La mayor parte del desarrollo moderno de IA ocurre primero contra APIs en la nube. Los desarrolladores saben cómo invocar a OpenAI; la superficie de VNRecognizeTextRequest más VNImageRequestHandler más VNRecognizedTextObservation se siente como más API que aprender para lo que, en la práctica, son menos líneas de código.
Mala estimación de la capacidad. Los desarrolladores que no han revisado el framework recientemente asumen que solo cubre OCR y códigos de barras. La lista de categorías anterior incluye más de una docena de capacidades, varias de las cuales no tienen equivalente nativo en la nube y varias de las cuales igualan a APIs comerciales sin el costo.
Divergencia entre prototipo y producción. Las APIs en la nube ganan en el prototipado temprano (un comando curl para obtener un resultado), y el prototipo se convierte en la pipeline de producción sin una reevaluación. La jugada correcta es prototipar con lo que sea más rápido y reevaluar la capa de percepción cuando el flujo ya es real.
La solución no es rechazar las APIs en la nube; la solución es saber qué contiene la plataforma para que la elección sea genuina.
Qué significa este patrón para apps de iOS 26+
Tres puntos clave.
-
Por defecto, usa Vision para primitivas de percepción. Encontrar caras, leer texto, detectar códigos de barras, ejecutar estimación de pose, obtener embeddings de imagen. El framework corre en microsegundos sobre el Neural Engine, no cuesta nada y no deja rastro de datos a terceros. Para operaciones de CV a nivel de píxel, el framework es el punto de partida correcto.
-
Usa APIs en la nube para razonamiento, no para percepción. Un LLM multimodal entendiendo el significado de una imagen, una API vertical de inteligencia documental que extrae campos estructurados, una tarea personalizada one-shot sin datos de entrenamiento. Ese es el territorio de la nube; cederlo a la nube es lo correcto.
-
Combina Vision con Foundation Models para pipelines totalmente en el dispositivo. La percepción (Vision) alimenta el razonamiento (LLM on-device). La pipeline corre localmente de extremo a extremo, sin claves de API, sin jitter de red y sin telemetría saliendo del dispositivo. El post sobre Foundation Models del clúster cubre la mitad del LLM; Vision es la mitad de entrada.
El clúster completo del Ecosistema Apple: App Intents tipados; servidores MCP; la pregunta de enrutamiento; Foundation Models; la distinción entre LLM de runtime y de tooling; tres superficies; el patrón de fuente única de verdad; dos servidores MCP; hooks para desarrollo Apple; Live Activities; el contrato de runtime de watchOS; internas de SwiftUI; el modelo mental espacial de RealityKit; disciplina de esquemas en SwiftData; patrones de Liquid Glass; envío multiplataforma; la matriz de plataformas; sobre lo que me niego a escribir. El hub está en la Serie del Ecosistema Apple. Para el contexto más amplio de iOS-con-agentes-de-IA, consulta la guía de desarrollo de agentes en iOS.
FAQ
¿Cuál es la diferencia entre Apple Vision y visionOS?
El framework Vision es la API de visión por computadora en el dispositivo para iOS, macOS y visionOS. visionOS es el sistema operativo del Apple Vision Pro. La superposición de nombres es desafortunada. Vision (el framework) corre en cualquier dispositivo Apple moderno; visionOS (el OS) corre específicamente en el hardware Vision Pro.
¿Cuándo debo usar Vision en lugar de OpenAI Vision API o Google Cloud Vision?
Para tareas de percepción a nivel de píxel (encontrar caras, leer texto, detectar objetos, contar elementos, estimar pose, generar embeddings de imagen), Vision casi siempre es la decisión correcta. Corre en milisegundos, no cuesta nada por inferencia y mantiene los datos del usuario en el dispositivo. Las APIs en la nube son lo correcto cuando la tarea requiere razonamiento semántico complejo sobre el significado de una imagen, o cuando una API vertical de inteligencia documental provee campos estructurados más allá de la extracción de texto.
¿Puedo ejecutar mi propio modelo de Core ML a través de Vision?
Sí. VNCoreMLRequest envuelve cualquier modelo de Core ML y maneja el preprocesamiento automáticamente. Suelta el archivo .mlpackage en el bundle de la app, instancia el modelo, envuélvelo en un VNCoreMLModel y ejecútalo a través de un manejador de solicitudes. El mismo manejador puede ejecutar varias solicitudes en paralelo, incluyendo las solicitudes integradas de Vision y el modelo personalizado de Core ML.
¿Cómo funciona el despacho de Vision en Apple Silicon?
Vision (y los modelos de Core ML que ejecuta) despacha automáticamente al Neural Engine cuando está disponible, recurre a la GPU cuando no, y a la CPU como último recurso. El framework elige la ruta más rápida para el dispositivo y la operación. Para la mayoría de los iPhones modernos (A12 Bionic en adelante), el Neural Engine maneja el grueso de la inferencia; el desarrollador no configura el despacho manualmente.
¿Qué se ha agregado recientemente?
El resumen conservador, contrastado con las notas de lanzamiento de Apple: VNCalculateImageAestheticsScoresRequest se añadió como API pública en iOS 18; VNRecognizeTextRequest ha ampliado el soporte multilingüe en los lanzamientos recientes; el DataScannerViewController de VisionKit envuelve el escaneo de documentos en una UI diseñada. Las capacidades estrella (texto, caras, pose, códigos de barras, embeddings) llevan varios lanzamientos de iOS maduras.
Referencias
-
Documentación para desarrolladores de Apple:
VNCalculateImageAestheticsScoresRequest, introducida en iOS 18.0+. ↩ -
Documentación para desarrolladores de Apple: framework Vision, referencia de las solicitudes disponibles y la disponibilidad por plataforma. ↩
-
Documentación para desarrolladores de Apple: Recognizing Text in Images, idiomas de reconocimiento admitidos por llamada de API. ↩
-
Documentación para desarrolladores de Apple:
VNHumanBodyPoseObservation.JointName, nombres enumerados de articulaciones devueltos por solicitudes de pose corporal 2D. ↩