对象分类,何时使用完整图像或提取对象?

时间:2016-09-29 13:51:08

标签: opencv image-processing classification image-recognition object-recognition

我正在尝试使用OpenCV建立一个对象分类系统。当我在场景中检测到一个新对象时,我想知道新对象是否属于一个已知的对象类(它是一个盒子,一个bottel,一些未知的东西等)。

到目前为止我的步骤:

  • 将图像缩小到可以显示新对象的roi
  • 计算每个图像的关键点(cv :: SurfFeatureDetector)
  • 计算每个关键点的描述符(cv :: SurfDescriptorExtractor)
  • 使用Bag of Words(cv :: BOWKMeansTrainer)生成词汇
  • 计算响应直方图(cv :: BOWImgDescriptorExtractor)
  • 使用响应直方图为每个对象类训练cv :: SVM
  • 再次使用同一组图像测试分类

我知道我的代码仍有问题,因为分类还不行。

但我真的不知道,我应该在哪里使用完整的图像(剪切到roi),或者我应该从图像中提取新对象并仅使用对象本身。

这是我进入对象识别/分类的第一步,我看到人们同时使用完整的图像和提取的对象,但我只是不知道何时使用它。

我希望woneone可以为我澄清这一点。

1 个答案:

答案 0 :(得分:0)

您不应该使用相同的图像进行测试和培训。

在训练中,理想情况下,您需要提取仅包含一个主要对象的ROI,因为算法将假设从正样本中提取的代码字是应该在测试图像中呈现的代码字,以将其标记为正数。但是,如果你有像ImageNet这样的大数据集,算法应该进行推广。

在测试中,您不需要提取ROI,因为SIFT / SURF是比例不变的功能。但是,在测试集中也有一个主要对象是好的。

我认为你应该为每个对象类训练1个分类器。这称为one-vs-all分类器。

如果你不想担心这个问题并拥有大数据集,请注意一点。只需使用卷积神经网络。它们具有非常好的泛化能力,并且由于其完全连接的最后一层,因此具有固有的多标签。