cvSVM训练对HOGDescriptionr产生较差的结果

cvSVM training produces poor results for HOGDescriptor

本文关键字:结果 HOGDescriptionr cvSVM      更新时间:2023-10-16

我的目标是训练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经验的人对此有更多意见吗?

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

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

在从OpenCV进行训练时,我使用SVMLight学习SVM模型取得了成功,但没有使用cvSVM,因此无法进行比较。

hogDraw函数来自http://vision.ucsd.edu/~pdollar/toolbox/doc/index.html将可视化您的描述符。