cvSVM训练对HOGDescriptionr产生较差的结果
cvSVM training produces poor results for HOGDescriptor
我的目标是训练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
- 您的第一个描述符维度太大,没有任何用处。要形成任何可靠的SVM超平面,您需要至少与描述符维度相同数量的正样本和负样本。这是因为理想情况下,需要在超平面的每个维度上分离信息
- 阳性和阴性样本的数量应该或多或少相同,除非您向SVM培训师提供偏差参数(可能在
cvSVM
中不可用) - 不能保证HOG是您试图解决的问题类型的良好描述符。您能否通过视觉确认您试图检测的对象在所有样本中具有不同的形状和相似的方向?例如,一种类型的花可能有独特的形状,但许多类型的花加在一起并没有相同的独特形状。竹子具有独特的形状,但可能不容易与其他物体区分,或者在所有样本图像中可能不具有相同的方向
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将可视化您的描述符。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 如何让C++'tally up'结果并制定计划?
- 为什么这个程序的结果是3 "born"?和 4 死
- 尝试将字符串/字符转换为整数会产生意外结果