5

我的目标是训练一个 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
4

2 回答 2

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

我在从 OpenCV 训练时使用 SVMLight 学习 SVM 模型取得了成功的结果,但没有使用过cvSVM,所以无法比较。

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

于 2013-08-26T18:32:12.070 回答