【问题标题】:Python Bag of Words clusteringPython 词袋聚类
【发布时间】:2016-02-16 06:51:37
【问题描述】:

编辑:这里是任何有问题的人的完整代码github.com

我正在尝试使用 SIFT 和 BOW 进行图像识别项目。到目前为止,我正在尝试训练和构建我的字典。我已经从 5 个不同的类中读取了图像,计算了描述符并将它们并排添加到 python 列表 ([]) 中。现在,我正在尝试使用 Python 版本的 BOWMeansTrainer 将我的描述符与 k = 5 进行聚类(这是正确的吗?对于 5 个类?)。我试图通过 cluster() 我的描述符向量,但我得到了错误

Traceback (most recent call last):


File "C:\Python27\Project2\beginning.py", line 40, in <module>
    bow.cluster(des)
TypeError: descriptors data type = 17 is not supported

我不确定将我的 numpy 数组放入什么格式,有人知道吗?

sift = cv2.SIFT()

descriptors = []
for path in training_paths:
    image = cv2.imread(path)
    print path
    gray = cv2.cvtColor(image, cv2.CV_LOAD_IMAGE_GRAYSCALE)
    kp, dsc= sift.detectAndCompute(gray, None)
    descriptors.append(dsc)

des = np.array(descriptors)

k=5
bow = cv2.BOWKMeansTrainer(k)
bow.cluster(des)

如您所见,我一直在附加 sift 描述符,然后尝试转换为 numpy 数组(所需的格式)。

【问题讨论】:

  • BoW 算法的参数 k 与你要分类的类的数量无关,它是聚类的数量(即视觉词)。它基本上表示生成的特征向量的维数,5 太小了。我已经看到它成功地使用了从 500-1000 到 1M 的 k。看看here
  • 你说得对,这是一篇较早的帖子,但我记得我认为 5 个集群是合乎逻辑的,因为我有 5 个类,所以我想要 5 个质心。一个更现实的数字会更高

标签: python opencv k-means sift


【解决方案1】:

感谢opencv论坛才弄明白,而不是使用另一个列表(我在上面使用了描述符),只需使用 bow.add(dsc) 将您找到的描述符直接添加到您的包中

dictionarySize = 5

BOW = cv2.BOWKMeansTrainer(dictionarySize)

for p in training_paths:
    image = cv2.imread(p)
    gray = cv2.cvtColor(image, cv2.CV_LOAD_IMAGE_GRAYSCALE)
    kp, dsc= sift.detectAndCompute(gray, None)
    BOW.add(dsc)

#dictionary created
dictionary = BOW.cluster()

编辑:对于其他有问题的人,我已经上传了脚本的其余部分 here

【讨论】:

  • 嗨,我想做一个 10 类图像分类,我想在安卓智能手机上运行。你能告诉我你对 python 的发现吗??
  • @sau 你能澄清一下你在找什么吗?
  • 我想在智能手机上运行一个深度学习模型来将图像分类为一些类别。现在我希望该模型的尺寸非常非常小。
  • @briansrlsjust 赞成您的回答,因为由于缺乏有关如何执行此操作的明确文档,这很有帮助。您能否像在您的 OP 中一样编辑您的答案并添加您的完整代码?我不确定我明白在哪里放置bow.add(doc) -- thx
  • @pepe 抱歉花了这么长时间,我刚刚添加了代码。试图弄清楚这些东西真的很痛苦,所以我很高兴能帮上忙。
猜你喜欢
  • 2015-02-15
  • 2017-12-06
  • 2015-11-22
  • 2019-02-28
  • 2011-02-20
  • 2018-11-07
  • 2014-09-28
  • 2012-12-02
  • 2011-01-28
相关资源
最近更新 更多