词袋训练样本

Posted

技术标签:

【中文标题】词袋训练样本【英文标题】:Bag of words training samples 【发布时间】:2013-04-19 08:35:00 【问题描述】:

我已经实现了 Bag Of Words,一切都很顺利。但是,我对一些步骤以及如何实现它感到困惑。

我可以创建弓形描述符作为词袋中的最后一步来创建样本,如此处所示bowDE.compute(img, keypoints, bow_descriptor); .. 事情是我对接下来的步骤感到困惑。

我知道在 BOW 中我必须用非类(可乐)训练和测试一个类(汽车),我在 bow_descriptor 向量中创建的仅用于类汽车,所以我有只属于样本的向量到车上。以下是我在训练和测试系统时遇到的问题。

1- 我应该将 bow_descriptor 的向量一半用于 class(cola) ,其余用于 non-class(cola) ,还是我必须为 non-class(cola) 创建一个新的 bow_descriptor ?

2-我需要做多类分类,在完成第一个类(汽车)系统后,我需要训练一个新类(巴士+火车等),我是否应该创建一个新的训练模型他们每个人,或 是否可以与之前的培训一起进行培训程序(即培训班BUS,在同一系统中与班车一起培训)?

【问题讨论】:

【参考方案1】:

你是为所有类创建一个对象还是为每个类创建一个对象都没有关系,只要你为所有类使用相同的字典即可。 只创建一个对象可能更经济。但是提取出来的图片描述符应该是一样的。

关于多类 SVM:

您使用了 SVM 标签。所以我假设你想使用 SVM。确实存在使用 SVM 显式进行多类分类的方法,更常见的是训练几个二进制 SVM 并将它们组合以获得多类结果。

您可以使用 1-vs-1 设置,每个类对训练一个 SVM。对于测试,您在每个 SVM 上评估您的测试示例。最常赢得这些决斗的班级将成为您的最终结果。

另一种流行的方法是 1-vs-all SVM。在这里,您为每个类训练一个 SVM,其中当前类的样本被标记为正样本,所有其他样本被标记为负样本。在测试中,得分最高的班级获胜。

因此,如果您想使用 1-vs-1 设置,您可以在添加新类时重用一些二进制 SVM。 1-vs-All 设置是不可能的,因为您需要将新类添加到每个 SVM 的负样本中。

【讨论】:

嘿@sietschie,所以你的意思是 bow_descriptor 可以包含所有 4 个类或只包含 2 个类(正和负)?另一个问题,在我的 SVM 中,我将如何训练它们?老实说,我现在有点困惑?我应该训练什么,应该测试什么? 当然。它所做的只是计算每个图像中每个单词的出现次数。无论您是一次处理所有图像还是每个班级都这样做并不重要。 通常在分类中,您将数据拆分为训练集和测试集。训练集用于计算 SVM。测试集仅用于评估系统的性能。这能回答你的问题吗? @sitchie,现在我明白了如何创建作为 bow_descriptor 的字典(它适用于所有图像,包括它们的负数)。下一步呢,我的意思是如何训练和测试,可以指导具体步骤吗? 这个answer 提供了一个很好的概述。还是您的意思是how to use OpenCVs SVM 上的详细信息?

以上是关于词袋训练样本的主要内容,如果未能解决你的问题,请参考以下文章

训练贷款模型时样本模型监控的一些点

训练样本集的制作

opencv 构造训练器

我应该删除与某些训练样本相同的测试样本吗?

对抗训练

为啥sklearn kNN分类器运行得这么快,而我的训练样本和测试样本的数量很大