公寓照片的图像相似度

时间:2015-12-28 15:59:42

标签: image-processing computer-vision image-recognition

我想设计一种算法,当不同的房地产经纪人提出时,在同一公寓的图像中找到匹配

照片是在相似的时间内拍摄的,所以房间内部不应该变化那么多,但当然每个人都会从不同角度拍摄不同的照片等。

(TLDR;一个公寓出售,不同的房地产人进来制作自己的照片,我想知道各个人的照片是否在同一个地方)

我知道图像处理和识别算法的选择在很大程度上取决于用例,所以考虑到我的用例,你能指出我正确的方向吗?

image one image two

http://reality.bazos.sk/inzerat/56232813/Prenajom-1-izb-bytu-v-sirsom-centre.php http://reality.bazos.sk/inzerat/56371292/-PRENAJOM-krasny-1i-byt-rekonstr-Kupeckeho-Ruzinov-BA-II.php

3 个答案:

答案 0 :(得分:2)

您实际上可以使用Clarifai的Custom Training API端点,非常简单明了。您所要做的就是训练初始图像,然后将第二个图像进行比较。如果概率很高,那很可能是同一套公寓。例如:

在javascript中,要声明它是肯定的:

clarifai.positive('http://example.com/apartment1.jpg', 'firstapartment', callback);

否定的是:

clarifai.negative('http://example.com/notapartment1.jpg', 'firstapartment', callback);

你不一定要做否定,但它只会有所帮助。然后,当您将图像与第一个aparment进行比较时,您可以:

clarifai.predict('http://example.com/someotherapartment.jpg', 'firstapartment', callback);

这将为您提供有关照片与您训练过的内容('第一部')的概率。这个API基本上是在没有实际机器的麻烦的情况下进行机器学习。 Clarifai的API还有一个标记输入,使用一些基本标签非常准确。 API /月可以免费拨打一定数量的电话。绝对值得一试这个案例。

答案 1 :(得分:1)

正如Shaked用户在评论中提到的,这是一个难题。即使您知道每个摄像机在空间中的位置和方向,以及每个摄像机的特性,匹配图像也不是一个小问题。

这里可以使用“一袋文字”(BoW)方法。您可以确定“特征描述符”可以在图像集中区分对象,而不是尝试识别特定对象和/或推断原始3D场景。

https://en.wikipedia.org/wiki/Bag-of-words_model_in_computer_vision

想象一下,您可以通过纹理和颜色的相对位置来描述这两个图像:

  • 最左边的水平线段
  • 左边中心附近的
  • 红色斑点
  • 左下方的绿色块状物
  • 靠近左上方的明亮圆形物体
  • ...

然后对于合理约束的图像集(例如,在某个邮政编码内的照片),您可以在上面的两个图像之间产生良好的匹配。

关于BoW的维基百科文章可能看起来有点令人生畏,但我想如果你在你周围寻找,你会发现一篇文章,用于描述图像处理的“词袋”。我已经看到了一个非常好的BoW方法演示,用于识别任意视频流中的船只和送货车等物体,并且效果非常好。我希望我有一份传单的副本。

答案 2 :(得分:0)

如果您不怀疑图像变化很大,您可以尝试任何标准的运动结构算法的标准第一步,以建立一对图像之间的相似性概念。如果任何一对图像包含大于满足场景的几何约束的阈值的多个匹配图像特征,则它们是相似的。对于一般场景,该几何约束由使用匹配特征子集计算的基本矩阵F给出。

以下是步骤。我已经为每一步插入了opencv方法,但你也可以编写你的方法:

  1. 阅读这对图像。使用img = cv2.imread(filename)
  2. 使用SIFT / SURF检测两个图像中的图像特征/描述符。 sift = cv2.xfeatures2d.SIFT_create() kp, des = sift.detectAndCompute(img,None)
  3. 使用描述符匹配要素。 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) matches = bf.match(des1,des2)
  4. 使用RANSAC计算基本矩阵。 cv2.findFundamentalMatrix(pts1, pts2, cv2.FM_RANSAC, 3, 0.99, mask)
  5. mask包含所有内容。只需计算它们以确定满足几何约束的匹配数是否足够大。
  6. 注意:在平面场景的情况下,我们使用单应性而不是基本矩阵,并且上述步骤非常好,因为单应性将一个点指向另一个图像中的对应点。然而,基本矩阵将一个点指向另一个图像中的相应极线,这使得整个过程不太稳定。所以我建议再尝试这些步骤几次,对功能位置进行一点点抖动,并在多个试验中对证据进行整理以做出决定。您还可以使用更高级的步骤为此过程引入稳健性,但前提是上述步骤不会产生您需要的结果。