iOS16与iOS17中VNFeaturePrintObservation及特征距离计算是否有差异?
iOS17中VNFeaturePrintObservation的变更及跨版本兼容方案
一、iOS17中VNFeaturePrintObservation的变更
苹果在iOS17中更新了VNGenerateImageFeaturePrintRequest默认使用的图像特征提取模型,导致生成的VNFeaturePrintObservation特征向量与iOS16及之前版本完全不兼容,这就是同一组图像在两个系统下距离计算结果差异极大的核心原因。
二、跨iOS16/17的通用计算方案
方案1:强制使用旧版本特征模型(推荐)
通过VNGenerateImageFeaturePrintRequest的revision参数指定使用iOS16及之前的模型版本,这样所有系统版本生成的特征向量一致,距离计算结果也会统一。
修改后的特征获取代码:
let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:]) // 指定使用版本1的模型(对应iOS16及之前的旧模型,iOS17仍支持) let request = VNGenerateImageFeaturePrintRequest(revision: VNGenerateImageFeaturePrintRequestRevision1) do { try requestHandler.perform([request]) self.feature = request.results?.first } catch { print("Vision error: \(error)") }
使用该方案后,iOS16和iOS17下生成的特征完全兼容,距离计算结果会保持一致,无需调整阈值。
方案2:根据系统版本设置不同阈值
如果不想修改特征生成逻辑,可以在计算距离后,根据当前系统版本使用对应的阈值判断相似度:
try! feature1.computeDistance(&visionDistance, to: feature2) let isSimilar: Bool if #available(iOS 17.0, *) { // iOS17下的阈值(根据你的实际测试数据调整) isSimilar = visionDistance < 1.5 } else { // iOS16及以下的阈值(根据你的实际测试数据调整) isSimilar = visionDistance < 23 }
该方案需要针对不同系统版本单独测试并维护阈值,长期维护成本较高,仅适合无法修改特征生成逻辑的场景。
内容的提问来源于stack exchange,提问作者Tamim Dari Chowdhury
相关产品推荐
相关产品推荐

