在两个不同的iOS版本(如iOS 16.0和iOS 17.0)中,两张图像的“VNSure PrintObservation”和视觉距离计算是否不同?

3npbholx  于 2023-10-21  发布在  iOS
关注(0)|答案(1)|浏览(95)

我想知道两张照片有多相似。为此,我使用了VNGenerateImagePrintRequest并从图像生成了VNGeneratePrintObservation。然后,对于两个不同的图像,我使用它们的VNatriurePrintObservation计算特征距离。不幸的是,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)")
       }

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

try! feature1.computeDistance(&visionDistance, to: feature2)

对于相同的两个图像,iOS 16.0和iOS 17.0的输出结果“visionDistance”不同(例如,iOS 16.3.1中的“2.66224”和iOS 17.0.1中的“1.2178229”)。我想知道在iOS 17.0中是否有VNSockurePrintObservation更改,如果更改,是否有任何方法可以将计算结果推广到两个iPhone操作系统?

sqxo8psd

sqxo8psd1#

我和一个同事写了一篇关于VNGenerateImageFeaturePrintRequest以及iOS 16和iOS 17之间差异的详细文章(你可以找到on Medium)。
总结一下这些差异:

  • 在iOS 16上,VNFeaturePrintObservation是一个非归一化向量,包含2048个Float
  • 在iOS 17上,它是一个长度为768的归一化向量。

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

  • 在iOS 17上,两个观测值之间的距离始终小于2.0。
  • 在iOS 16上,距离可以变化很大;典型值在0.0和40.0之间。

所以,是的,这种变化可能会很烦人。请注意,您可以通过将VNGenerateImageFeaturePrintRequest示例的revision属性设置为VNGenerateImageFeaturePrintRequestRevision1来在iOS 17上重现iOS 16的行为(尽管距离值不会完全相同,但您会得到轻微的非显著差异)。
如果你只能支持iOS 17,我建议你选择iOS 17 VNGenerateImageFeaturePrintRequestRevision2算法,因为比较归一化向量更有意义(归一化向量之间的距离与它们的余弦距离密切相关,余弦距离是数据分析中向量相似性的一种常用度量)。

相关问题