cvSVM培训为HOGDescriptor带来了糟糕的结果

时间:2013-08-26 16:38:04

标签: c++ opencv svm

我的目标是训练SVM并获得支持向量,我可以插入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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

我在使用SVMLight获得成功结果时,在OpenCV培训时学习SVM模型,但未使用cvSVM,因此无法进行比较。

来自http://vision.ucsd.edu/~pdollar/toolbox/doc/index.htmlhogDraw函数会显示您的描述符。