我的目标是训练SVM并获取支持 vector ,我可以将其插入opencv的HOGdescriptor中以进行对象检测。

我收集了4000个正值和15000个负值,并使用opencv提供的SVM进行了训练。结果会给我带来太多误报。(每张图片最多20个)我会裁剪掉误报,然后将其添加到否定库中以进行重新训练。有时我甚至会得到更多的误报!我试图将我的hogdescriptor的L2HysThreshold向上调整至300,而没有明显改善。我的正面和负面观点足够大吗?

SVM培训也比预期的要快得多。我尝试使用2916和12996的特征向量,分别尝试使用灰度图像和彩色图像。 SVM培训从未花费超过20分钟的时间。我使用auto_train。我是机器学习的新手,但是从我听到的关于像我一样大的数据集的培训来看,至少应该花费一天的时间吗?

我相信cvSVM并没有做太多的学习,并且根据http://opencv-users.1802565.n2.nabble.com/training-a-HOG-descriptor-td6363437.html,它不适合此目的。有cvSVM经验的人对此有更多意见吗?

我正在考虑使用SVMLight http://svmlight.joachims.org/,但似乎没有办法可视化SVM超平面。我有什么选择?

我使用opencv2.4.3,并尝试了以下hogdescriptor设置

hog.winSize = cv::Size(100,100);
hog.cellSize = cv::Size(5,5);
hog.blockSize = cv::Size(10,10);
hog.blockStride = cv::Size(5,5); //12996 feature vector

hog.winSize = cv::Size(100,100);
hog.cellSize = cv::Size(10,10);
hog.blockSize = cv::Size(20,20);
hog.blockStride = cv::Size(10,10); //2916 feature vector

最佳答案

  • 您的第一个描述符维太大而无用。要形成任何可靠的SVM超平面,您需要至少数量与描述符维数相同的正样本和负样本。这是因为理想情况下,您需要在超平面的每个维度上分离信息。
  • 除非您为SVM训练器提供了偏差参数,否则正样本和负样本的数量应大致相同(在cvSVM中可能不可用)。
  • 无法保证HOG是您要解决的问题类型的良好描述符。您可以在视觉上 来确认您要检测的对象在所有样本中均具有相似取向的不同形状吗?例如,单一类型的花朵可能具有独特的形状,但是许多类型的花朵在一起却没有相同的独特形状。竹子具有独特的形状,但是可能无法轻易与其他物体区分开,或者在所有样本图像中可能没有相同的方向。
  • cvSVM通常不是用于为OpenCV HOG训练SVM的工具。使用二进制形式的SVMLight(用于商业目的不是免费的)或libSVM(用于商业目的是好的)。使用C++/OpenCV代码计算所有样本的HOG,并将其以SVMLight/libSVM的正确输入格式写入文本文件。使用这两个程序中的任何一个,使用带有最佳C的线性核来训练模型。通过在循环中更改C时搜索最佳准确性来找到最佳C。通过找到所有支持 vector ,将alpha值乘以每个对应的支持 vector ,然后为每个维度添加所有结果alpha *值,计算检测器 vector (一个N+1维度 vector ,其中N是描述符的维度)。 D vector 。作为最后一个元素,添加N,其中-b是超平面偏差(您可以在SVMLight/libSVM训练产生的模型文件中找到它)。将此b维度检测器输入N+1,并使用HOGDescriptor::setSVMDetector()HOGDescriptor::detect()进行检测。
  • 关于c++ - cvSVM培训对于HOGDescriptor产生的效果不佳,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18448842/

    10-11 15:33