Vision — 是 Apple 的计算机视觉框架,于 2017 年在 iOS 11 中首次推出。Vision 提供现成的算法用于面部检测、文本识别 (OCR)、条形码检测、对象跟踪、图像分类和轮廓分析 — 所有操作均在设备上使用 Neural Engine 执行。根据 Apple WWDC 2023 的数据,Vision 在标准“照片”应用中用于面部识别,在“相机”中用于 iPhone 和 iPad 上的实时文本检测。
要点
Vision — 是一个高级计算机视觉框架,将复杂的机器学习算法抽象在简单的请求 API (VNRequest) 之后。开发人员无需了解卷积神经网络 — 只需创建适当类型的请求,传递图像并获取结果。
Vision 的架构基于Request → Handler → Result原则构建:VNImageRequestHandler 接收图像,执行 VNRequest,并返回包含结果的 VNObservation 数组。这允许将多个请求组合到一张图像 — 例如,同时检测照片中的面部和文本。
Vision 支持iOS 11+ 和 macOS 10.13+。通过 Neural Engine 进行硬件加速需要 A12 Bionic 芯片或更新型号。在配备 A17 Pro 和 M 系列芯片的设备上,Vision 每秒可处理多达 60 帧的流式视频。
主要优势Vision — 完全隐私:所有计算均在设备上执行,图像不会发送到服务器。这允许在处理敏感数据的应用程序中使用该框架,例如医疗或银行应用程序。
VNDetectFaceRectanglesRequest — Vision 的基本请求,用于检测图像中的面部。返回限制每个面部的矩形坐标,而不识别具体个人。
要进行更详细的分析,请使用VNDetectFaceLandmarksRequest,它确定面部的关键点:眼睛、眉毛、鼻子、嘴巴、下巴轮廓。这些数据用于实时应用面具、表情符号动画和滤镜(如 FaceTime 和 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 不仅包含 boundingBox,还包含 confidence(从 0 到 1 的置信度)和 landmarks — 如果请求是 VNDetectFaceLandmarksRequest,则为面部点的数组。低于 0.5 的 confidence 通常表示误检 — 建议丢弃此类结果。
Vision 还支持VNDetectFaceCaptureQualityRequest,用于评估面部图像质量:光照、清晰度、旋转角度。这对于在用户注册或创建头像时选择最佳帧非常有用。
VNRecognizeTextRequest — 是 Apple 内置的 OCR 引擎,于 iOS 13 中推出。识别图像上的印刷文本,支持 13 种语言:英语、俄语、中文、日语、韩语、意大利语、德语、西班牙语、葡萄牙语、法语、阿拉伯语、越南语和泰语。
VNRecognizeTextRequest 支持两个精度级别:.fast(快速,适用于对比背景上的简单文本)和 .accurate(精确,适用于不同字体和角度的复杂场景)。.fast 速度快 3–5 倍,但在处理手写文本和非标准字体时效果较差。
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
usesLanguageCorrection属性使用语言模型激活识别文本的校正。这可将英语的精度提高 10–15%,但会延长处理时间。如果指定了相应的识别,俄语也可以进行校正。
根据Apple ML Research 2022的数据,VNRecognizeTextRequest 在 .accurate 级别上的精度对于清晰英文文档照片为 96%,对于俄语约为 88%。对于包装、标牌和屏幕上的文本,精度降至 75–85%。
| Recognition Level | 速度 | 精度(英语) | 俄语支持 |
|---|---|---|---|
| .fast | 0.1–0.3 秒 | ~85% | 是 |
| .accurate | 0.3–1.0 秒 | ~96% | 是 |
VNDetectBarcodesRequest — Vision 的请求,用于检测和解码图像上的条形码和 QR 码。支持所有主要格式:EAN-8、EAN-13、UPC-A、UPC-E、Code 39、Code 93、Code 128、PDF417、Aztec 和 QR。
与 AVFoundation (AVCaptureMetadataOutput) 不同,Vision 不仅适用于视频流,也适用于静态图像 — 这允许从已拍摄的照片或屏幕截图中扫描代码。Vision 还以像素精度确定代码的boundingBox,便于在找到的代码周围制作边框动画。
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 包含 payloadStringValue(解码内容)、symbology(代码类型)和 confidence。对于 QR 码,payload 可以是 URL、文本或 JSON。对于 EAN/UPC,返回产品的数字代码,可用于在数据库中搜索商品。
Vision 可以在一张图像上处理多个条形码 — observations 数组为每个找到的代码包含一个对象。这对于扫描产品包或包含多个条形码的文档非常有用。
VNDetectObjectAtPointRequest 和VNSequenceRequestHandler — Vision 用于跟踪视频流中对象的工具。第一个根据用户的触摸点确定对象,第二个在视频帧之间跟踪对象。
VNSequenceRequestHandler 接收图像序列(视频帧),并为每个帧返回被跟踪对象的更新位置。这用于增强现实应用、视频编辑器和视频监控系统。
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
// 更新屏幕上对象的位置
}
VNTrackObjectRequest 使用基于光流的跟踪算法 — 不在每个帧上重新训练检测器,而是计算对象相对于先前位置的位移。这允许在即使没有 Neural Engine 的设备上也能实时工作。
限制:跟踪可能会在快速运动、遮挡或光照突然变化时丢失对象。Apple 建议每 10–15 帧重新启动检测 (VNDetectObjectAtPointRequest) 以校正跟踪。
VNClassifyImageRequest — 是 Vision 内置的图像分类模型,支持 1000 个类别(ResNet-50 模型,在 ImageNet 上训练)。请求返回带有类别名称和置信度的 VNClassificationObservation 数组。
VNDetectContoursRequest 执行图像的轮廓分析 — 提取对象的边界,这对于分割、轮廓绘制和识别前的预处理非常有用。请求返回一个描述图像上每个轮廓的点数组。
import Vision
// 图像分类
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 适用于通用类别(猫、狗、汽车、食物),但不适用于特定对象 — 对于这些对象,需要训练自定义 Core ML 模型并使用 VNCoreMLRequest。Apple 的模型针对移动设备进行了优化,仅占用 5 MB 空间。
VNDetectContoursRequest 以点数组形式返回轮廓,并指明轮廓类型(外部、内部、孔洞)。此请求用于 OCR 前的图像预处理(改善文本对比度)、绘制效果(对象轮廓)和形状分析。
| Vision 请求 | 用途 | iOS 版本 |
|---|---|---|
| VNDetectFaceRectanglesRequest | 在图像中查找面部 | iOS 11 |
| VNRecognizeTextRequest | 文本识别 (OCR) | iOS 13 |
| VNDetectBarcodesRequest | 条形码和 QR 码检测 | iOS 11 |
| VNClassifyImageRequest | 图像分类 | iOS 13 |
| VNDetectContoursRequest | 轮廓分析 | iOS 14 |
| VNTrackObjectRequest | 对象跟踪 | iOS 11 |
常见问题
Vision 提供现成的算法(面部检测、OCR、条形码),无需训练模型。Core ML — 是执行自定义模型的引擎。Vision + VNCoreMLRequest 允许在 Vision 管道中运行 Core ML 模型,结合两者的最佳优势:Vision 的现成检测器 + Core ML 的自定义分类。
是,Vision 支持通过 VNSequenceRequestHandler 进行实时视频流处理以进行跟踪,以及通过 AVCaptureVideoDataOutput 进行逐帧处理。在配备 A12+ 和 Neural Engine 的设备上,Vision 每秒可处理多达 60 帧以进行面部检测。对于繁重任务(OCR、分类),建议每 5–10 帧处理一次。
VNRecognizeTextRequest 支持 13 种语言:英语、俄语、中文(简体和繁体)、日语、韩语、意大利语、德语、西班牙语、葡萄牙语、法语、阿拉伯语、越南语和泰语。要在一张图像上识别多种语言,请在 recognitionLanguages 属性中指定一个数组。
是,通过VNCoreMLRequest。您创建包装在 VNCoreMLModel 中的 Core ML 模型,并将其传递给 VNCoreMLRequest。Vision 自动处理图像预处理(缩放、裁剪)并将其传递给 Core ML 模型。结果作为 VNCoreMLFeatureValueObservation 返回,包含模型的输出数据。
不,Vision 完全在设备上执行所有分析。图像不会离开用户设备。这是 Apple 的基本架构:所有 ML 框架(Vision、NaturalLanguage、Core ML、Speech)都在设备上运行以确保隐私。没有任何数据发送到 Apple 服务器。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。