我想知道两张照片有多相似。为此,我使用了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操作系统?
1条答案
按热度按时间sqxo8psd1#
我和一个同事写了一篇关于
VNGenerateImageFeaturePrintRequest
以及iOS 16和iOS 17之间差异的详细文章(你可以找到on Medium)。总结一下这些差异:
VNFeaturePrintObservation
是一个非归一化向量,包含2048个Float
。此外,
computeDistance(_:to:)
方法计算这些向量之间的直接欧几里得距离。因此:
所以,是的,这种变化可能会很烦人。请注意,您可以通过将
VNGenerateImageFeaturePrintRequest
示例的revision
属性设置为VNGenerateImageFeaturePrintRequestRevision1
来在iOS 17上重现iOS 16的行为(尽管距离值不会完全相同,但您会得到轻微的非显著差异)。如果你只能支持iOS 17,我建议你选择iOS 17
VNGenerateImageFeaturePrintRequestRevision2
算法,因为比较归一化向量更有意义(归一化向量之间的距离与它们的余弦距离密切相关,余弦距离是数据分析中向量相似性的一种常用度量)。