我的目标是训练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
答案 0 :(得分:6)
cvSVM
可能无法提供),否则正负样本的数量应大致相同。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.html的hogDraw
函数会显示您的描述符。