← Todos los articulos

Apple Vision Framework: el CV en el dispositivo que la mayoría omite

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 en el dispositivo. La mayoría de los desarrolladores de iOS recurre por defecto a OpenAI Vision API, Google Cloud Vision o AWS Rekognition para tareas que el framework realiza en milisegundos en el Neural Engine del dispositivo. Esa elección por defecto refleja un sesgo más que una evaluación: los APIs en la nube se sienten “IA moderna” y Vision se siente “fontanería de la plataforma”, así que la plataforma se omite. El sesgo malinterpreta lo que hoy contiene la plataforma.

Vision es el framework de CV con prioridad local. Se ejecuta en el Neural Engine cuando está disponible, en la GPU en caso contrario y en la CPU como último recurso. La inferencia ocurre en unos 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 proporciona más de dos docenas de operaciones de CV en el dispositivo: reconocimiento de texto, detección de rostros y puntos de referencia, estimación de pose corporal y de manos, lectura de códigos de barras, segmentación de documentos, embeddings de imagen, saliencia, detección de animales, contornos, trayectorias, flujo óptico y un ejecutor para cualquier modelo de Core ML.
  • Cada operación se ejecuta en milisegundos en el Neural Engine, no cuesta nada por llamada, no requiere red y no produce telemetría a terceros.
  • Los 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 rostros, leer texto, detectar una mano), Vision gana en costo, latencia y privacidad.
  • La conexión con flujos de trabajo de agentes: los resultados de Vision alimentan App Intents y las llamadas a LLM de Foundation Models en el dispositivo sin un viaje de ida y vuelta por la red. Toda la canalización corre localmente.

Qué contiene Vision realmente

Vision agrupa sus operaciones como tipos VNRequest. Se crea una solicitud, se configura con parámetros, se le pasa una imagen (o un CVPixelBuffer, una CIImage, 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), sugerencias de idioma, listas de palabras personalizadas y confianza de la caja delimitadora. La ruta .accurate en iOS 18+ maneja bien el texto impreso en recibos, señalización y documentos; el reconocimiento de escritura a mano se admite en un subconjunto de idiomas (ver la lista de idiomas de reconocimiento de 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])

La misma operación a través de la API de OpenAI Vision cuesta aproximadamente una fracción de centavo por llamada en modo de bajo detalle y considerablemente más en modo de alto detalle, tarda entre 1 y 3 segundos de ida y vuelta y envía la imagen a los servidores de OpenAI. Vision devuelve resultados en 100-300 ms de forma local, gratis y sin filtración de datos.

Detección de rostros y puntos de referencia

Vision incluye tres capas de análisis facial:

  • VNDetectFaceRectanglesRequest devuelve las cajas delimitadoras de cada rostro en el cuadro.
  • VNDetectFaceLandmarksRequest devuelve regiones de puntos de referencia estructuradas por rostro (mandíbula, boca, ojos, cejas, nariz, pupilas), cada una con múltiples puntos clave.
  • VNDetectFaceCaptureQualityRequest devuelve una puntuación de calidad por rostro (0-1) que refleja iluminación, nitidez y centrado. Las apps pueden usarla para controlar la captura de selfies o elegir automáticamente el mejor cuadro de una ráfaga.

Para la mayoría de las apps que necesitan encontrar rostros, recortar a rostros, difuminar rostros o contar rostros, la solicitud de rectángulos es la herramienta correcta. Para apps que animan algo sobre el rostro de un usuario (filtros, máscaras, seguimiento), 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, devolviendo resultados de VNHumanBodyPose3DObservation; la solicitud usa datos de profundidad (AVDepthData) cuando el dispositivo los expone para mejorar la precisión, pero no requiere un escáner LiDAR.4 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 fijar contenido virtual a las manos del usuario y lo que las apps de postura usan para evaluar la forma. La pose de la mano impulsa el reconocimiento de gestos (el usuario levanta dos dedos, la app ve dos dedos). Ambas pueden ejecutarse a la velocidad de cuadros de video en iPhones recientes, suficiente para AR en vivo y entrada por gestos. 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 sin procesar más el rectángulo delimitador. La detección se ejecuta en milisegundos y funciona en condiciones de poca luz que la propia app Camera de Apple ya valida.

Segmentación de documentos

VNDetectDocumentSegmentationRequest encuentra documentos rectangulares en un cuadro y devuelve sus puntos de esquina, teniendo en cuenta la perspectiva. La solicitud es lo que las apps de escaneo de documentos usan para recortar y rectificar el documento en una imagen plana. El propio framework VisionKit de Apple envuelve la solicitud junto con una UI, pero la operación subyacente es directamente invocable cuando una app necesita una UI personalizada.

Saliencia y estética

VNGenerateAttentionBasedSaliencyImageRequest devuelve un mapa de calor de los puntos donde es más probable que se enfoque la atención de un espectador 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 puntuaciones de calidad estética que incluyen una clasificación de utilidad (notas, capturas de pantalla) y un valor estético. Las puntuaciones son lo que Photos usa para destacar candidatos de “Recuerdos” y lo que alimenta las decisiones de recorte automático.

Clasificación de imágenes y embeddings

VNClassifyImageRequest devuelve las N etiquetas de categoría principales para una imagen usando un clasificador integrado que cubre cientos de categorías de objetos comunes.5 VNGenerateImageFeaturePrintRequest devuelve un vector de características (el embedding del modelo) adecuado para búsquedas de similitud de imágenes.

Los embeddings son cómo funcionan realmente una app de Photos, una función de “encontrar platos similares” en una app de recetas o la deduplicación por similitud en una app de moodboards. El equivalente en la nube son los embeddings de CLIP de OpenAI o el Vertex AI de Google; Vision los devuelve localmente y gratis.

Seguimiento de objetos y trayectorias

VNDetectTrajectoriesRequest rastrea objetos en movimiento a través de cuadros y devuelve ajustes de trayectoria parabólica (una pelota lanzada, una flecha disparada). VNTrackObjectRequest sigue un objeto delimitado manualmente a través de una secuencia de video.

Las trayectorias son la primitiva subyacente para apps deportivas (rastreo de 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 con VNCoreMLRequest

VNCoreMLRequest ejecuta cualquier modelo de Core ML a través de la canalización de Vision. La solicitud maneja el preprocesamiento (redimensionado de imagen, conversión de espacio de color, normalización) automáticamente según la descripción de entrada del modelo. Una app entrena un clasificador personalizado en Create ML (un puñado de categorías, un centenar de imágenes de muestra por categoría, diez minutos de entrenamiento) o descarga un modelo publicado, deja caer 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 es alojar el modelo en un servidor, pagar por el cómputo de inferencia, gestionar la API y aceptar la latencia de red. Vision lo convierte en un .mlpackage en el bundle de la app y un manejador de solicitudes.

Dónde ganan realmente las APIs en la nube

El territorio de Vision son las operaciones a nivel de píxel: encontrar esta cosa, clasificar esta imagen, reconocer este texto. El framework no proporciona razonamiento semántico complejo sobre el significado de una imagen. Tres casos en los que las APIs en la nube son la elección correcta:

Comprensión multimodal con LLM. “¿Qué está haciendo esta persona en la 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 en el dispositivo, cubierto en Foundation Models on-device LLM) está empezando a manejar algo de esto en el dispositivo, pero para razonamiento complejo, GPT-4o, Claude Sonnet o Gemini siguen ganando.

Tareas personalizadas únicas 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 corbatín?” sin haber visto un solo ejemplo de entrenamiento etiquetado. Para prototipado o tareas únicas en las que recopilar datos de entrenamiento es demasiado caro, los LLMs en la nube son la herramienta correcta.

Inteligencia de documentos más allá del OCR. El OCR de Vision devuelve texto. Una API de inteligencia de documentos (AWS Textract, Google Document AI, Azure Form Recognizer) devuelve campos estructurados: número de factura, fecha, partidas, totales. El valor agregado es la estructuración, no el OCR. Para flujos de trabajo de documentos de alto valor, las APIs en la nube suelen tener la razón; para “lee este recibo y vuelca el texto”, Vision la tiene.

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 canalización de inferencia representativa que se ejecuta en iPhone 16 Pro (chip A18 Pro):

Operación Vision (en el dispositivo) API de OpenAI Vision 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 rostros (1 cuadro) 5-15 ms 1-2 s + costo 100-300 ms + costo
Pose corporal (60 fps en vivo) <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 alojado requiere modelo alojado

Las cifras 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 ventajas 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 a 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 trabajo de agentes

Vision se combina limpiamente con dos ideas del clúster ya publicadas:

Herramientas de App Intents para Apple Intelligence. Cuando la app expone una capacidad de “Encuentra rostros en mis fotos” o “Lee texto de una captura de pantalla” a través de 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. La publicación sobre App Intents recorre el contrato de superficie.

LLM en el dispositivo de Foundation Models. Una canalización que necesita tanto percepción como razonamiento ejecuta Vision primero (extraer texto, encontrar rostros, localizar objetos) y Foundation Models después (razonar sobre lo encontrado, generar un resumen). Ambas etapas se ejecutan en el dispositivo. Total de llamadas de red: cero. La publicación sobre Foundation Models explica cómo invocar el LLM; esta publicación argumenta que Vision es lo que lo alimenta sin un viaje 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 canalización corre en el dispositivo. Sin clave de API. Sin llamada de red. Sin exposición de datos a terceros.

Qué ha madurado en las dos últimas versiones

Tres adiciones que vale la pena nombrar, con fechas conservadoras contrastadas con las notas de versión de Apple2:

Puntuación de estética como API pública (iOS 18). VNCalculateImageAestheticsScoresRequest devuelve puntuaciones que incluyen clasificación de utilidad y valor estético, reemplazando lo que las apps de curaduría de fotos antes tenían que aproximar con modelos personalizados de Core ML.

OCR multilingüe mejorado. VNRecognizeTextRequest ha ampliado su soporte para escrituras no latinas en versiones recientes, reduciendo la brecha con los servicios de OCR en la nube que históricamente tenían una cobertura multilingüe más fuerte. La documentación de reconocimiento de texto de Apple lista el soporte de idiomas actual3.

Segmentación de documentos con integración de VisionKit. VNDetectDocumentSegmentationRequest encuentra documentos rectangulares y devuelve los puntos de esquina; VNDocumentCameraViewController de VisionKit envuelve la captura de documentos en una UI diseñada para los usuarios, mientras que DataScannerViewController (iOS 16+) cubre el escaneo en vivo de texto y códigos legibles por máquina.6

Las capacidades destacadas del framework (rostro, texto, pose, código de barras, embeddings) han sido maduras durante varias versiones de iOS. El patrón: extender en lugar de reinventar.

Por qué la mayoría de los desarrolladores omite Vision

Tres razones por las que el framework se omite a pesar de que el caso es claro:

Hábito de prioridad a la nube. La mayor parte del desarrollo moderno de IA ocurre primero contra APIs en la nube. Los desarrolladores saben cómo invocar OpenAI; la superficie de VNRecognizeTextRequest más VNImageRequestHandler más VNRecognizedTextObservation se siente como más API por aprender para lo que es, por número de líneas, menos líneas que llamar a OpenAI Vision (sin auth, sin HTTP, sin reintentos, sin parseo de JSON).

Mala estimación de 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 es más de dos docenas 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 canalización de producción sin una reevaluación. Lo correcto es prototipar con lo que sea más rápido y reevaluar la capa de percepción una vez que el flujo de trabajo es real.

La corrección no es rechazar las APIs en la nube; la corrección es saber qué contiene la plataforma para que la elección sea real.

Qué significa este patrón para apps de iOS 26+

Tres conclusiones.

  1. Por defecto, usa Vision para primitivas de percepción. Encontrar rostros, leer texto, detectar códigos de barras, ejecutar estimación de pose, obtener embeddings de imagen. El framework corre en milisegundos en el Neural Engine, cuesta cero y no deja rastro de datos de terceros. Para operaciones de CV a nivel de píxel, el framework es el punto de partida correcto.

  2. 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 de documentos extrayendo campos estructurados, una tarea personalizada única sin datos de entrenamiento. Ese es el territorio de la nube; cederlo a la nube es correcto.

  3. Combina Vision con Foundation Models para canalizaciones completas en el dispositivo. La percepción (Vision) alimenta el razonamiento (LLM en el dispositivo). La canalización corre localmente de extremo a extremo, sin claves de API, sin jitter de red y sin telemetría que salga del dispositivo. La publicación sobre Foundation Models del clúster cubre la mitad del LLM; Vision es la mitad de la entrada.

El clúster completo de Apple Ecosystem: 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; Two MCP Servers; hooks para desarrollo en Apple; Live Activities; el runtime de watchOS; internals de SwiftUI; el modelo mental espacial de RealityKit; disciplina de esquema en SwiftData; patrones de Liquid Glass; shipping multiplataforma; la matriz de plataformas; sobre lo que me niego a escribir. El hub está en la Apple Ecosystem Series. Para el contexto más amplio de iOS-con-agentes-de-IA, consulta la guía de iOS Agent Development.

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 cada dispositivo Apple moderno; visionOS (el SO) corre específicamente en hardware Vision Pro.

¿Cuándo debería usar Vision en lugar de la API de OpenAI Vision o Google Cloud Vision?

Para tareas de percepción a nivel de píxel (encontrar rostros, leer texto, detectar objetos, contar elementos, estimar pose, generar embeddings de imagen), Vision es casi siempre la elecció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 apropiadas cuando la tarea requiere razonamiento semántico complejo sobre el significado de una imagen, o cuando una API vertical de inteligencia de documentos proporciona 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 múltiples solicitudes en paralelo, incluidas las solicitudes integradas de Vision y el modelo personalizado de Core ML.

¿Cómo funciona el dispatch 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 lo está 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 la mayor parte de la inferencia; el desarrollador no configura el dispatch manualmente.

¿Qué hay de nuevo en iOS 18 e iOS 26?

El resumen conservador, fechado contra las notas de versión de Apple: VNCalculateImageAestheticsScoresRequest se añadió como API pública en iOS 18; VNRecognizeTextRequest ha ampliado el soporte multilingüe en versiones recientes; DataScannerViewController de VisionKit (iOS 16+) cubre texto en vivo y códigos legibles por máquina, mientras que VNDocumentCameraViewController cubre la captura de documentos. Las capacidades destacadas (texto, rostro, pose, códigos de barras, embeddings) han estado maduras durante varias versiones de iOS.

Referencias


  1. Documentación para desarrolladores de Apple: VNCalculateImageAestheticsScoresRequest, introducida en iOS 18.0+. 

  2. Documentación para desarrolladores de Apple: framework Vision, referencia para las solicitudes disponibles y la disponibilidad por plataforma. 

  3. Documentación para desarrolladores de Apple: Recognizing Text in Images y VNRecognizeTextRequest, idiomas de reconocimiento admitidos. 

  4. Documentación para desarrolladores de Apple: VNDetectHumanBodyPose3DRequest y VNHumanBodyPoseObservation.JointName. La pose corporal 3D usa AVDepthData cuando el dispositivo lo expone; LiDAR no es obligatorio. 

  5. Documentación para desarrolladores de Apple: VNClassifyImageRequest y knownClassifications(forRevision:) para el conjunto de etiquetas en tiempo de ejecución. 

  6. Documentación para desarrolladores de Apple: DataScannerViewController (iOS 16+, escanea texto en vivo y códigos legibles por máquina) y VNDocumentCameraViewController (captura de documentos). 

Artículos relacionados

Inferencia en dispositivo con Core ML: los patrones que realmente llegan a producción

Core ML ejecuta modelos en el Neural Engine, GPU o CPU. Los patrones que llegan a producción: conversión de modelos, sug…

13 min de lectura

Core AI: ejecutar modelos en Apple silicon

Core AI es el framework de bajo nivel de iOS 27 para ejecutar modelos: asset frente a modelo, tensores NDArray, selecció…

17 min de lectura

Construyendo sistemas de IA: De RAG a agentes

Construí un sistema de agentes de 3.500 líneas con 86 hooks y validación por consenso. Esto es lo que aprendí sobre RAG,…

10 min de lectura