【问题标题】:Error when training k-NN using SURF Features使用 SURF 特征训练 k-NN 时出错
【发布时间】:2017-10-22 16:19:17
【问题描述】:

我正在尝试根据输入图像检索一组相似的图像。我正在使用带有序列的数组元素。使用序列设置数组元素。 OpenCV 顺便说一下 Python。我的策略是获取图像数据库的SURF 特征,然后将其放入k-NN 模型中,这样每当我使用 SURF 特征查询图像并查找相似的项目集时,我就可以只需使用k-NN 即可获得最近的邻居。问题是,我尝试通过放置SURF 描述符然后将其展平来在scikit-learn 中训练k-NN 模型。但是,每当我尝试训练模型时,这个错误就会不断出现。 setting an array element with a sequence.setting an array element with a sequence.

我做错了什么?我应该如何表示这些功能,以便我可以将它与k-NN一起使用

更新:这是我的代码

SURFObject = cv2.SURF(hessianThreshold = 400, extended = 0)
image_names = []
image_descriptors = []
for i in range(1, 4001):
    print("Image Number: " + str(i))
    filename = 'cat.'+ str(i) +'.jpg'
    img = cv2.imread(filepath + filename)
    keypoints, descriptors = SURFObject.detectAndCompute(img, None)
    image_descriptors.append(descriptors.tolist())
    image_names.append(filename)

neighbors = NearestNeighbors(10, 0.5)
neighbors.fit(np.array(image_descriptors).reshape(-1,1))

【问题讨论】:

  • 请发布您的代码。
  • @LakshyaKejriwal 我更新了帖子。谢谢

标签: python opencv model similarity knn


【解决方案1】:

我不太确定您收到的错误消息,但可以肯定的是您的描述符尺寸有问题。

Surf 首先找到图像的关键点,然后为每个关键点生成一个固定大小的描述符。 问题是,对于每个图像,您将获得不同数量的关键点,然后当您执行“descriptors.tolist()”时,它会连接该关键点的所有描述符,但您将获得每个图像的不同大小

尝试阅读有关词袋甚至更好的费希尔向量来处理此类问题

【讨论】:

  • 这是否意味着 SURF 和 k-NN 在检索相似图像方面不可行?
  • 您可以为每张图像选择固定数量的关键点,这也是可行的,但根据图像的性质,它可能不会给出好的结果
  • 词袋与这些描述词的匹配度如何?
  • 关于词袋的工作原理有很多话要说,你可以很容易地找到很多参考资料
  • 但简而言之,您需要从图片训练集中生成一个码本(使用 k-means 对原始描述符进行聚类),然后对于每个新图像,描述符是所有图像的直方图您已经拥有的冲浪描述符
猜你喜欢
  • 2016-06-16
  • 2020-03-29
  • 2021-05-09
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 2021-08-20
相关资源
最近更新 更多