探索计算机视觉 API
Explore Computer Vision APIs
2020年6月24日
一句话判断
这是一场 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("目标丢失")
}
}
}
}
最佳实践
- 多个 Vision 请求可以组合执行。在同一个
VNImageRequestHandler上可以同时执行多个请求(比如同时检测人脸和文字)。Vision 内部会优化计算图的共享,比分别执行多个 handler 效率高。 - 视频流场景用
VNImageRequestHandler的cvPixelBuffer初始化。不要先把CVPixelBuffer转成UIImage再传给 Vision,这个转换本身就很耗性能。 - 文字识别结果要做后处理。识别结果可能包含错别字,特别是手写体。结合上下文做简单的纠错(比如检查识别出的文字是否在预期词汇表中)能提升实际使用体验。
还有什么值得关注
- iOS 14 的 Vision 新增了 Animal Detection(动物检测),可以检测猫、狗等常见动物的面部。
VNFeaturePrintObservation可以计算两张图片的相似度,用于以图搜图场景。- Vision 的所有检测都支持
regionOfInterest属性,你可以限制检测区域来提升性能。