我的目标是训练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
最佳答案
cvSVM
中可能不可用)。 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/