Apple的Vision框架:大多数开发者求助于云API的功能其实已内置
Apple的Vision框架(不带”OS”后缀的那个)内置了二十多项设备端计算机视觉操作。大多数iOS开发者默认使用OpenAI Vision API、Google Cloud Vision或AWS Rekognition来完成这些任务,而该框架可以在设备的Neural Engine上以微秒级速度执行这些操作。这种默认选择更多反映的是一种偏见而非评估结果:云API给人”现代AI”的感觉,而Vision感觉像是”平台基础设施”,于是平台被跳过了。这种偏见误读了平台现今所包含的内容。
Vision是本地优先的CV框架。它在Neural Engine可用时运行于其上,否则运行于GPU,最后才退回CPU。对大多数操作而言,推理只需几毫秒。该框架按调用计费为零。数据从不离开设备。API密钥不存在,因为根本没有API。对于iOS应用所做的大多数计算机视觉工作而言,这才是正确的工具。
TL;DR
- Apple Vision提供二十多项设备端CV操作:文本识别、人脸检测与特征点、身体与手部姿态估计、条形码读取、文档分割、图像嵌入、显著性、动物检测、轮廓、轨迹、光流,以及任意Core ML模型的运行器。
- 每项操作在Neural Engine上仅需毫秒级时间,按调用计费为零,无需网络,也不会产生任何第三方遥测数据。
- 云API在一种特定场景下胜出:对图像进行复杂的语义推理(例如多模态LLM理解图表、表情包或文档意图)。对于像素级操作(查找人脸、读取文本、检测手部),Vision在成本、延迟和隐私方面都胜出。
- 与代理工作流的连接:Vision结果可输入App Intents和Foundation Models的设备端LLM调用,无需网络往返。整个流水线都在本地运行。
Vision实际包含的内容
Vision将其操作分组为VNRequest类型。请求被创建、配置参数后,输入图像(或CVPixelBuffer、CIImage、CGImage或URL)并运行。结果以观测对象的形式附加到请求上返回。下列类别涵盖了截至iOS 26该框架的范围。
文本识别
VNRecognizeTextRequest执行OCR。该请求支持recognitionLevel(.fast用于实时摄像头流,.accurate用于文档扫描)、语言提示、自定义词表以及边界框置信度。iOS 18+上的精确路径在收据、标牌和印刷文档方面可与商业OCR API相媲美;多种语言支持手写识别。
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])
通过OpenAI Vision API执行同样的操作,低细节模式下每次调用约几分之一美分,高细节模式下成本显著更高,往返耗时1-3秒,并将图像发送至OpenAI的服务器。Vision在本地100-300毫秒内返回结果,免费,且无任何数据外泄。
人脸检测与特征点
Vision内置三层人脸分析:
VNDetectFaceRectanglesRequest返回画面中每张人脸的边界框。VNDetectFaceLandmarksRequest返回每张人脸的结构化特征点区域(下颌线、嘴部、眼睛、眉毛、鼻子、瞳孔),每个区域包含多个关键点。VNDetectFaceCaptureQualityRequest返回质量分数,相机应用使用该分数确定自拍捕获时机。
对于大多数需要查找人脸、按人脸裁剪、模糊人脸或统计人脸数量的应用,矩形请求是合适的工具。对于需要将某物动画化贴合用户人脸的应用(滤镜、面具、跟踪),特征点加瞳孔跟踪是合适的工具。这些都不需要模型文件或网络调用。
身体与手部姿态
VNDetectHumanBodyPoseRequest返回VNHumanBodyPoseObservation.JointName4中的19个命名关节(鼻、颈、肩、肘、腕、髋、膝、踝、耳、眼、根部),带有2D坐标和每个关节的置信度。VNDetectHumanBodyPose3DRequest在配备LiDAR Scanner的设备上将拓扑扩展到3D空间。VNDetectHumanHandPoseRequest以指关节分辨率返回21个手部特征点。
健身应用使用身体姿态来无需穿戴设备就能计数,AR应用使用它将虚拟内容附着到用户手部,姿态应用使用它评估姿势。手部姿态驱动手势识别(用户举起两根手指,应用识别出两根手指)。两者在最新iPhone的Neural Engine上均可达到60fps运行。云端的对应方案是Google MediaPipe或专有的健身科技API,该框架可以替代它们。
条形码与QR
VNDetectBarcodesRequest读取大多数零售和库存工作流所需的码制(QR、PDF417、Aztec、Code 128、Code 39、EAN-13、ITF14、Data Matrix、GS1 DataBar等),并返回原始载荷及边界矩形。检测在毫秒内完成,可在Apple相机应用已验证过的弱光条件下工作。
文档分割
VNDetectDocumentSegmentationRequest在画面中查找矩形文档并返回其角点,同时考虑透视变形。该请求是文档扫描应用用来裁剪并将文档校正为平面图像的方法。Apple自家的VisionKit框架封装了该请求并附带UI,但当应用需要自定义UI时,底层操作可直接调用。
显著性与美学
VNGenerateAttentionBasedSaliencyImageRequest返回热图,显示观看者注意力最可能聚焦的位置。VNGenerateObjectnessBasedSaliencyImageRequest返回物体所在位置的热图。VNCalculateImageAestheticsScoresRequest在iOS 181中作为公共API添加,返回美学质量分数,包括实用性分类(备忘、屏幕截图)和美学价值。Photos使用这些分数来呈现”回忆”候选项,自动裁剪决策也以此为依据。
图像分类与嵌入
VNClassifyImageRequest使用内置分类器(基于网络规模数据训练的模型,超过1000个类别)返回图像的Top-N类别标签。VNGenerateImageFeaturePrintRequest返回特征向量(模型嵌入),适用于图像相似性搜索。
嵌入是Photos应用、菜谱应用的”查找相似菜品”或情绪板应用的”按相似性去重”实际工作的方式。云端的对应方案是OpenAI CLIP嵌入或Google的Vertex AI;Vision在本地免费返回这些结果。
物体跟踪与轨迹
VNDetectTrajectoriesRequest跨帧跟踪移动物体,返回抛物线轨迹拟合(投掷的球、射出的箭)。VNTrackObjectRequest在视频序列中跟踪手动标定的物体。
轨迹是体育应用的底层基元(跟踪棒球、篮球、网球)。检测可在实时AVFoundation流上运行,并实时返回结果。
通过VNCoreMLRequest使用自定义模型
VNCoreMLRequest通过Vision流水线运行任意Core ML模型。该请求会根据模型的输入描述自动处理预处理(图像缩放、色彩空间转换、归一化)。应用在Create ML中训练自定义分类器(少量类别、每类约一百张样本图像、十分钟训练),或下载已发布的模型,将.mlpackage放入应用包,再用三行代码通过Vision运行。
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])
自定义分类器的云端对应方案是将模型托管在服务器上、为推理算力付费、管理API、并接受网络延迟。Vision将其转化为应用包中的一个.mlpackage和一个请求处理器。
云API真正胜出的地方
Vision的领域是像素级操作:找到这个东西、对这张图像分类、识别这段文本。该框架不提供对图像含义的复杂语义推理。云API在以下三种情况下是正确选择:
多模态LLM理解。 “图中这个人在做什么?” “这张图表是否有误导性?” “翻译这份菜单并告诉我哪些菜品是素食。” 这些都不是像素级问题。它们需要大型多模态模型将视觉感知与世界知识和语言相结合。Apple的Foundation Models(设备端LLM,详见Foundation Models设备端LLM)开始在设备上处理一些此类任务,但对于复杂推理,GPT-4o、Claude Sonnet或Gemini仍占优势。
没有训练数据的一次性自定义任务。 Vision的分类模型是固定的;自定义Core ML模型需要训练数据。多模态LLM无需任何带标签的训练样本就能回答”这是一张戴蝴蝶结的猫的照片吗?”。对于原型开发或收集训练数据成本过高的一次性任务,云LLM是合适的工具。
超越OCR的文档智能。 Vision的OCR返回文本。文档智能API(AWS Textract、Google Document AI、Azure Form Recognizer)返回结构化字段:发票号、日期、行项目、总额。结构化才是增值所在,而非OCR本身。对于高价值的文档工作流,云API通常是正确的;对于”读取这张收据并输出文本”,Vision就够了。
模式:云在推理和高度专业化的垂直API方面胜出;Vision在感知基元方面胜出。
实事求是的延迟与成本对比
在iPhone 16 Pro(A18 Pro芯片)上运行的代表性推理流水线:
| 操作 | Vision(设备端) | OpenAI Vision API | AWS Rekognition |
|---|---|---|---|
| OCR(1页收据) | 150-300毫秒 | 1-3秒往返+每图成本 | 200-500毫秒+每图成本 |
| 人脸检测(1帧) | 5-15毫秒 | 1-2秒+成本 | 100-300毫秒+成本 |
| 身体姿态(实时60fps) | <16毫秒 | 非实时 | 非实时 |
| 图像嵌入 | 20-40毫秒 | 200-500毫秒+成本 | 未直接提供 |
| 自定义分类器 | 取决于模型大小 | 需要托管模型 | 需要托管模型 |
上述数字源自Apple公开基准测试和开发者报告的测量结果;要传达的信息是数量级,而非精确数值。Vision的优势在于成本(每次调用为零)、尾部延迟(无网络抖动)以及隐私(数据从不离开设备)。
当应用频繁调用视觉操作时,成本会累积。每会话处理100张图像的照片编辑应用,通过云API每会话成本可达数美元,而通过Vision为零。
与代理工作流的连接
Vision可与已发布集群中的两个想法完美配合:
面向Apple Intelligence的App Intents工具。 当应用通过AppIntent暴露”在我的照片中查找人脸”或”从屏幕截图读取文本”等能力时,意图的perform方法在本地运行Vision并返回结构化结果。Apple Intelligence的编排器可以调用该意图,而无需将用户的照片发送到服务器。关于App Intents的文章介绍了表面契约。
Foundation Models设备端LLM。 同时需要感知和推理的流水线,先运行Vision(提取文本、查找人脸、定位物体),再运行Foundation Models(对所发现内容进行推理、生成摘要)。两个阶段都在设备上运行。网络调用总数:零。关于Foundation Models的文章解释了如何调用LLM;本文则论证了Vision是无需云端往返就能为其提供输入的部分。
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)"
)
整个流水线在设备上运行。无API密钥。无网络调用。无第三方数据暴露。
过去两个版本中的成熟之处
值得提及三项新增功能,根据Apple的发布说明2作保守标注:
美学评分作为公共API(iOS 18)。 VNCalculateImageAestheticsScoresRequest返回包括实用性分类和美学价值在内的分数,取代了照片整理应用此前必须用自定义Core ML模型来近似的功能。
改进的多语言OCR。 VNRecognizeTextRequest在近期版本中扩展了对非拉丁文字的支持,缩小了与历来在多语言覆盖方面更强的云端OCR服务的差距。Apple的文本识别文档列出了当前支持的语言3。
带VisionKit集成的文档分割。 VNDetectDocumentSegmentationRequest查找矩形文档并返回角点;VisionKit的DataScannerViewController将该请求封装在为实时文档扫描设计的UI中。
该框架的旗舰能力(人脸、文本、姿态、条形码、嵌入)已经成熟数个iOS版本。模式:扩展而非重新发明。
为什么大多数开发者跳过Vision
尽管理由很清楚,框架仍被跳过,原因有三:
云优先的习惯。 大多数现代AI开发首先针对云API进行。开发者知道如何调用OpenAI;VNRecognizeTextRequest加上VNImageRequestHandler再加上VNRecognizedTextObservation的接口面,对于实际上更少的代码行数而言,感觉是更多需要学习的API。
对能力的误判。 最近没有查看过该框架的开发者会假设它只覆盖OCR和条形码。上面列出的类别清单包含十几项能力,其中多项没有云原生对应方案,多项可与商业API匹敌且无成本。
原型与生产的偏离。 云API在早期原型设计中胜出(一条curl命令即可获得结果),而原型未经重新评估就被转化为生产流水线。正确的做法是用最快的方式做原型,并在工作流真正落地后重新评估感知层。
解决之道不是拒绝云API;解决之道是了解平台所包含的内容,从而让选择是真实的。
这种模式对iOS 26+应用意味着什么
三个要点。
-
感知基元默认使用Vision。 查找人脸、读取文本、检测条形码、运行姿态估计、获取图像嵌入。该框架在Neural Engine上以微秒级运行,成本为零,不留下任何第三方数据痕迹。对于像素级CV操作,该框架是合适的起点。
-
云API用于推理而非感知。 多模态LLM理解图像含义、垂直文档智能API提取结构化字段、没有训练数据的一次性自定义任务。这些是云的领域;将它们交给云是正确的。
-
将Vision与Foundation Models配对,构建完整的设备端流水线。 感知(Vision)输入推理(设备端LLM)。流水线端到端在本地运行,无API密钥、无网络抖动,也无遥测数据离开设备。本集群的Foundation Models文章涵盖LLM一半;Vision是输入一半。
完整的Apple生态系统集群:类型化App Intents;MCP服务器;路由问题;Foundation Models;运行时与工具LLM的区别;三个表面;单一事实来源模式;两个MCP服务器;面向Apple开发的钩子;Live Activities;watchOS运行时;SwiftUI内部机制;RealityKit的空间心智模型;SwiftData模式纪律;Liquid Glass模式;多平台发布;平台矩阵;我拒绝撰写的内容。中心枢纽位于Apple生态系统系列。关于更广泛的iOS与AI代理结合的背景,请参阅iOS代理开发指南。
FAQ
Apple Vision与visionOS有什么区别?
Vision框架是适用于iOS、macOS和visionOS的设备端计算机视觉API。visionOS是Apple Vision Pro的操作系统。命名重叠令人遗憾。Vision(框架)运行于每一台现代Apple设备上;visionOS(操作系统)专门运行于Vision Pro硬件。
我什么时候应该使用Vision而不是OpenAI Vision API或Google Cloud Vision?
对于像素级感知任务(查找人脸、读取文本、检测物体、统计数量、估计姿态、生成图像嵌入),Vision几乎总是合适的选择。它在毫秒内运行,每次推理成本为零,并将用户数据保留在设备上。当任务需要对图像含义进行复杂语义推理,或者垂直文档智能API能提供超越文本提取的结构化字段时,云API才是合适的选择。
我能通过Vision运行自己的Core ML模型吗?
可以。VNCoreMLRequest封装任意Core ML模型并自动处理预处理。将.mlpackage文件放入应用包,实例化模型,将其封装在VNCoreMLModel中,然后通过请求处理器运行。同一个处理器可以并行运行多个请求,包括内置的Vision请求和自定义Core ML模型。
Vision在Apple Silicon上是如何调度的?
Vision(及其运行的Core ML模型)在Neural Engine可用时自动调度到Neural Engine,否则回退到GPU,最后才回退到CPU。框架会根据设备和操作选择最快的路径。对于大多数现代iPhone(A12 Bionic及更高版本),Neural Engine承担大部分推理;开发者无需手动配置调度。
最近新增了什么?
根据Apple发布说明所作的保守总结:VNCalculateImageAestheticsScoresRequest在iOS 18中作为公共API添加;VNRecognizeTextRequest在近期版本中扩展了多语言支持;VisionKit的DataScannerViewController将文档扫描封装在专门设计的UI中。旗舰能力(文本、人脸、姿态、条形码、嵌入)已成熟数个iOS版本。
参考资料
-
Apple开发者文档:
VNCalculateImageAestheticsScoresRequest,在iOS 18.0+中引入。 ↩ -
Apple开发者文档:
VNHumanBodyPoseObservation.JointName,2D身体姿态请求返回的枚举关节名称。 ↩