Explore Computer Vision APIs
Machine Learning & AI 入门 18m

探索计算机视觉 API

Explore Computer Vision APIs

2020年6月24日

在 Apple 官方观看视频

一句话判断

这是一场 Vision 框架的全面导览——从人脸检测到文字识别、从物体追踪到姿态估计,把 Vision 的全部能力用场景串联起来,适合作为 Vision 入门的起点。

这场 Session 讲了什么

这场 Session 是 Vision 框架在 iOS 14 中能力的全景介绍。Vision 是苹果的计算机视觉框架,提供了设备端的视觉分析能力。

Session 把 Vision 的 API 分为四个大类:

Detection(检测)。包括人脸检测(VNDetectFaceRectanglesRequest)、人脸关键点(VNDetectFaceLandmarksRequest)、文字检测(VNDetectTextRectanglesRequest)、条形码/二维码检测(VNDetectBarcodesRequest)、以及新增的人体和手部姿态检测。

Recognition(识别)。包括文字识别(VNRecognizeTextRequest,支持中英文等多语言)、物体分类(基于 Core ML 模型)、人脸识别(VNDetectFaceCaptionsRequest)。

Tracking(追踪)。包括物体追踪(VNTrackObjectRequest)和矩形追踪(VNTrackRectangleRequest),适用于视频流中的持续目标追踪。

Analysis(分析)。包括图像相似度比较(VNFeaturePrintObservation)和图像配准(VNTranslationalImageRegistrationRequest)。

值得深挖的点

VNRecognizeTextRequest 的语言支持

iOS 14 的文字识别大幅提升了中文识别能力。VNRecognizeTextRequest 支持 recognitionLevel 设置:.fast 速度快但精度稍低,.accurate 精度高但耗时更长。中文识别推荐用 .accurate 模式。识别结果返回 VNRecognizedTextObservation,每个候选文本带置信度,你可以选择 top-1 或 top-3 结果。

Vision 与 Core ML 的配合

Vision 可以作为 Core ML 模型的预处理管道。用 VNCoreMLRequest 把图像缩放、裁剪、格式转换等预处理工作交给 Vision,然后把处理后的数据送入 Core ML 模型。这比你自己写预处理代码更高效,因为 Vision 可以利用 GPU 和 Neural Engine 加速。

代码片段

import Vision

// 文字识别(支持中文)
func recognizeText(in image: UIImage) {
    guard let cgImage = image.cgImage else { return }
    
    let request = VNRecognizeTextRequest { request, error in
        guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
        
        for observation in observations {
            // 取置信度最高的识别结果
            if let candidate = observation.topCandidates(1).first {
                print("识别文字: \(candidate.string), 置信度: \(candidate.confidence)")
                // 获取文字在图片中的位置
                let bbox = observation.boundingBox
                print("位置: \(bbox)")
            }
        }
    }
    
    // 设置识别语言和精度
    request.recognitionLanguages = ["zh-Hans", "en"]  // 中文和英文
    request.recognitionLevel = .accurate
    request.usesLanguageCorrection = true  // 启用语言模型纠错
    
    let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
    try? handler.perform([request])
}
// 物体追踪(在视频流中追踪选定区域)
class ObjectTracker {
    var trackingRequest: VNTrackObjectRequest?
    
    // 开始追踪用户选中的区域
    func startTracking(in pixelBuffer: CVPixelBuffer, at rect: CGRect) {
        let observation = VNDetectedObjectObservation(boundingBox: rect)
        trackingRequest = VNTrackObjectRequest(detectedObjectObservation: observation)
        trackingRequest?.trackingLevel = .accurate
        
        processFrame(pixelBuffer)
    }
    
    // 每帧更新追踪位置
    func processFrame(_ pixelBuffer: CVPixelBuffer) {
        guard let request = trackingRequest else { return }
        
        let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer)
        try? handler.perform([request])
        
        if let result = request.results?.first as? VNDetectedObjectObservation {
            let bbox = result.boundingBox
            let confidence = result.confidence
            
            if confidence > 0.5 {
                // 追踪成功,更新 UI 中的选择框位置
                print("追踪位置: \(bbox), 置信度: \(confidence)")
            } else {
                // 追踪丢失
                print("目标丢失")
            }
        }
    }
}

最佳实践

  1. 多个 Vision 请求可以组合执行。在同一个 VNImageRequestHandler 上可以同时执行多个请求(比如同时检测人脸和文字)。Vision 内部会优化计算图的共享,比分别执行多个 handler 效率高。
  2. 视频流场景用 VNImageRequestHandlercvPixelBuffer 初始化。不要先把 CVPixelBuffer 转成 UIImage 再传给 Vision,这个转换本身就很耗性能。
  3. 文字识别结果要做后处理。识别结果可能包含错别字,特别是手写体。结合上下文做简单的纠错(比如检查识别出的文字是否在预期词汇表中)能提升实际使用体验。

还有什么值得关注

  • iOS 14 的 Vision 新增了 Animal Detection(动物检测),可以检测猫、狗等常见动物的面部。
  • VNFeaturePrintObservation 可以计算两张图片的相似度,用于以图搜图场景。
  • Vision 的所有检测都支持 regionOfInterest 属性,你可以限制检测区域来提升性能。
WWDC 2020