对于两个不同的 iOS 版本(如 iOS 16.0 和 iOS 17.0)中的两个图像,“VNFeaturePrintObservation”和视距计算是否不同?

Tam*_*ury 6 ios swift ios-vision

我想知道两个图像有多相似。为此,我使用VNGenerateImageFeaturePrintRequest并从图像生成VNFeaturePrintObservation 。然后,对于两个不同的图像,我使用它们的VNFeaturePrintObservation计算特征距离。不幸的是,iOS 16.0 和 iOS 17.0 的计算距离不同,因此未达到我的阈值。

我尝试获取如下图像的 featurePrintObservation,

let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])       
    let request = VNGenerateImageFeaturePrintRequest()
       do {               
          try requestHandler.perform([request])              
          self.feature = request.results?.first
        } catch {
            print("Vision error: \(error)")
       }
Run Code Online (Sandbox Code Playgroud)

然后我尝试计算两个特征之间的距离,如下所示,

try! feature1.computeDistance(&visionDistance, to: feature2)
Run Code Online (Sandbox Code Playgroud)

对于相同的两个图像,iOS 16.0 和 iOS 17.0 的输出结果“visionDistance”是不同的(例如,iOS 16.3.1 中为“ 22.66224 ”,iOS 17.0.1 中为“ 1.2178229 ”)。我想知道VNFeaturePrintObservation在 iOS 17.0 中是否发生了变化,如果发生变化,有什么方法可以通用两个 iPhone 操作系统的计算吗?

eve*_*erb 6

我和一个同事写了一篇详细的文章介绍VNGenerateImageFeaturePrintRequestiOS16和iOS17之间的区别(你可以在Medium上找到它)。

总结一下差异:

  • 在 iOS16 上, aVNFeaturePrintObservation是包含 2048 的非标准化Float向量。
  • 在 iOS17 上,它是长度为 768 的归一化向量。

此外,该computeDistance(_:to:)方法还计算这些向量之间的直接欧几里得距离。

作为结果:

  • 在 iOS17 上,两个观测值之间的距离始终小于 2.0。
  • 在iOS16上,距离可能会有很大变化;典型值范围在 0.0 到 40.0 之间。

所以,是的,这种变化可能会很烦人。revision请注意,您可以通过将实例的属性设置VNGenerateImageFeaturePrintRequestVNGenerateImageFeaturePrintRequestRevision1(距离值不会完全相同,但您会得到轻微的、不显着的差异)来在 iOS17 上重现 iOS16 的行为。

如果您只需要支持 iOS17,我建议您优先选择 iOS17VNGenerateImageFeaturePrintRequestRevision2算法,因为比较归一化向量更有意义(归一化向量之间的距离与其余弦距离密切相关,余弦距离是数据分析中向量相似度的流行度量)。