Opencv:使用FAST关键点和BRIEF特征训练SVM

3
我希望训练一个用于物体检测的SVM。目前我有一个python脚本,可以检测FAST关键点并在该位置提取BRIEF特征。
现在我不知道如何使用这些描述符来训练SVM。
请告诉我:
1. 如何使用这些描述符来训练SVM(据我所知,这些描述符应该是我的训练数据)?
2. 标签的作用是什么,我如何获取它们?

也许你可以适应SIFT特征的答案:https://dev59.com/vnfZa4cB1Zd3GeqPQVY_ 也许可以搜索SVM与SIFT或SURF的组合。它们似乎通常使用词袋方法。 - Micka
Sift和Surf是非免费算法,我不想使用它们。其他描述符是二进制的,我不能将它们与词袋一起使用。 - dephinera
1
等一下...词袋模型意味着对于每个对象类别使用多个代表,并从新输入中决定哪些类别组的“距离”(例如从代表测量或从所有组的所有代表的最小距离)最佳,是吗?这里展示了ORB的二进制词袋模型:http://imagelab.ing.unimore.it/imagelab/pubblicazioni/2013ElectronicImaging.pdf - Micka
1
“用BossaNova表示本地二进制描述符进行视觉识别”是由Carlos Caetano、Sandra Avila等人撰写的另一篇关于二进制词袋的论文。简单浏览了一下,他们似乎也引用了其他二进制词袋方法,因此阅读起来可能会有所收获。 - Micka
1
也许我应该放弃这种方法或选择SURF。我想问一下,你对HOG有什么看法? - dephinera
显示剩余4条评论
1个回答

3
要训练SVM,您需要一个带有特征的矩阵X和一个带有标签的向量y。对于3个图像和两个特征,它应该看起来像这样:
>>> from sklearn import svm
>>> X = [[0, 0],   <- negative 0
         [1, 3],   <- positive 1
          2, 5]]   <- negative 0
>>> y = [0,   
         1,
         0]
>>> model = svm.SVC()
>>> model.fit(X, y) 

训练集将由多个图像组成,每个图像都将是Xy的一行。
标签:y需要正面和负面的示例(0或1):
正样本:可以通过两种方式指定正样本。其中一种方法是在较大的图像中指定矩形区域,这些区域包含了感兴趣的对象。另一种方法是从图像中裁剪出感兴趣的对象并将其保存为单独的图像。然后,您可以将该区域指定为整个图像。还可以通过添加旋转或噪声,或改变亮度或对比度来从现有正样本生成更多正样本。
负样本:不包含感兴趣对象的图像。
特征矩阵X:

在这里,你可以发挥创意,但我会提供一个简单的想法。创建height * width个特征,每个图像的每个像素都有一个特征,但除了在FAST关键点周围的小区域之外,所有特征值都为0。最终,您的X矩阵将具有尺寸(n_imagesheight*width)。

另一个常用的想法是词袋(Bag of Words)。X矩阵必须具有固定数量的特征/列,而关键点的数量是可变的。这是一种表示问题,但可以通过将它们放入带有固定数量的箱子中的直方图中来解决。有关详细信息,请参见this paper

您需要查阅专业文献以找到更多将BRIEF特征纳入其中的方法,但我希望这会给您一个开始的想法。


他可以使用宽度乘以高度乘以BRIEF描述符维度,但不确定在SVM中是否会过度拟合。 - Micka
我不明白当我提取了特征后,为什么要“为每个图像的每个像素制作高度*宽度的特征”。此外,我无法使用二进制描述符进行BOW。 - dephinera
你必须以某种方式数值化地表示你的图像,将一个图像转换为一个长的“高度*宽度”向量是所有方法中最简单的方法。通过在关键点上使用掩码,你可以改善这种朴素的表示。 - elyase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接