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

tzl*_*tzl 5 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
Run Code Online (Sandbox Code Playgroud)

Bee*_*Bee 6

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