Vision:iOS 中的计算机视觉框架

作者: IT Sectr 发布日期: 2026-07-19 阅读时间: 9 分钟

Vision — 是 Apple 的计算机视觉框架,于 2017 年在 iOS 11 中首次推出。Vision 提供现成的算法用于面部检测、文本识别 (OCR)、条形码检测、对象跟踪、图像分类和轮廓分析 — 所有操作均在设备上使用 Neural Engine 执行。根据 Apple WWDC 2023 的数据,Vision 在标准“照片”应用中用于面部识别,在“相机”中用于 iPhone 和 iPad 上的实时文本检测。

要点

  • Vision — Apple 的设备端计算机视觉框架,在设备上完成完整分析周期。
  • 支持面部检测、文本识别 (OCR)、条形码、分类和对象跟踪。
  • 通过统一的VNRequest机制工作 — 对图像或视频流的请求。
  • 通过 VNCoreMLRequest 与Core ML集成,用于自定义模型。
  • 框架针对 A12+ 芯片上的Neural Engine进行优化,实现实时处理。

iOS 中的 Vision 是什么?

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 中)。

swift
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,用于评估面部图像质量:光照、清晰度、旋转角度。这对于在用户注册或创建头像时选择最佳帧非常有用。

使用 Vision 进行文本识别 (OCR)

VNRecognizeTextRequest — 是 Apple 内置的 OCR 引擎,于 iOS 13 中推出。识别图像上的印刷文本,支持 13 种语言:英语、俄语、中文、日语、韩语、意大利语、德语、西班牙语、葡萄牙语、法语、阿拉伯语、越南语和泰语。

VNRecognizeTextRequest 支持两个精度级别:.fast(快速,适用于对比背景上的简单文本)和 .accurate(精确,适用于不同字体和角度的复杂场景)。.fast 速度快 3–5 倍,但在处理手写文本和非标准字体时效果较差。

swift
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速度精度(英语)俄语支持
.fast0.1–0.3 秒~85%
.accurate0.3–1.0 秒~96%

条形码和 QR 码检测

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,便于在找到的代码周围制作边框动画。

swift
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 数组为每个找到的代码包含一个对象。这对于扫描产品包或包含多个条形码的文档非常有用。

视频流中的对象跟踪

VNDetectObjectAtPointRequestVNSequenceRequestHandler — Vision 用于跟踪视频流中对象的工具。第一个根据用户的触摸点确定对象,第二个在视频帧之间跟踪对象。

VNSequenceRequestHandler 接收图像序列(视频帧),并为每个帧返回被跟踪对象的更新位置。这用于增强现实应用、视频编辑器和视频监控系统。

swift
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 执行图像的轮廓分析 — 提取对象的边界,这对于分割、轮廓绘制和识别前的预处理非常有用。请求返回一个描述图像上每个轮廓的点数组。

swift
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 和 Core ML 在计算机视觉方面有什么区别?

Vision 提供现成的算法(面部检测、OCR、条形码),无需训练模型。Core ML — 是执行自定义模型的引擎。Vision + VNCoreMLRequest 允许在 Vision 管道中运行 Core ML 模型,结合两者的最佳优势:Vision 的现成检测器 + Core ML 的自定义分类。

Vision 在视频上实时工作吗?

是,Vision 支持通过 VNSequenceRequestHandler 进行实时视频流处理以进行跟踪,以及通过 AVCaptureVideoDataOutput 进行逐帧处理。在配备 A12+ 和 Neural Engine 的设备上,Vision 每秒可处理多达 60 帧以进行面部检测。对于繁重任务(OCR、分类),建议每 5–10 帧处理一次。

VNRecognizeTextRequest 支持哪些语言?

VNRecognizeTextRequest 支持 13 种语言:英语、俄语、中文(简体和繁体)、日语、韩语、意大利语、德语、西班牙语、葡萄牙语、法语、阿拉伯语、越南语和泰语。要在一张图像上识别多种语言,请在 recognitionLanguages 属性中指定一个数组。

Vision 可以与 Core ML 模型一起使用吗?

是,通过VNCoreMLRequest。您创建包装在 VNCoreMLModel 中的 Core ML 模型,并将其传递给 VNCoreMLRequest。Vision 自动处理图像预处理(缩放、裁剪)并将其传递给 Core ML 模型。结果作为 VNCoreMLFeatureValueObservation 返回,包含模型的输出数据。

Vision 是否将图像发送到 Apple 服务器?

不,Vision 完全在设备上执行所有分析。图像不会离开用户设备。这是 Apple 的基本架构:所有 ML 框架(Vision、NaturalLanguage、Core ML、Speech)都在设备上运行以确保隐私。没有任何数据发送到 Apple 服务器。

总结

  • Vision — Apple 的设备端计算机视觉框架,基于 VNRequest 的 API,从 iOS 11 开始在所有 Apple 设备上可用。
  • VNDetectFaceRectanglesRequestVNDetectFaceLandmarksRequest 检测面部和关键点,用于滤镜、面具和动画。
  • VNRecognizeTextRequest — 内置 OCR,支持 13 种语言,具有 .fast 和 .accurate 级别,文档精度高达 96%。
  • VNDetectBarcodesRequest 解码所有流行的条形码和 QR 格式,无论是在照片中还是在视频流中。
  • VNTrackObjectRequest 通过光流在视频帧之间跟踪对象,无需重新训练检测器。
  • 通过 VNCoreMLRequest 实现的Core ML 集成允许在 Vision 管道中运行自定义分类和检测模型。
  • 所有计算在设备上使用 Neural Engine 执行 — 没有图像发送到服务器,确保完全数据隐私。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读