我正在使用 OpenCV 和 Visual C ++ 开发英文手写OCR。我使用基于区域的方法进行特征提取。在这里,我使用64×64
图像。
所以我对一个样本图像有 64个功能。我的 SVM 将是多级SVM ,因为我对大写和简单字母都有 52个类。
这是特征向量的格式。
Class A image1 0:0.222000 1:0.0250222 ..... 63:0.000052
Class A image2 (some float values) ....
Class A image200 (some float values)
对于 52个课程,我同样拥有 200张图片。当测试我当前的准确率仅 35% - 40%时,我已阅读缩放数据,提高了预测的准确性。 但我有一些事情需要说清楚。
如何缩放这些功能值?
是否有任何功能可以获得 OpenCV LibSVM 中每个测试特征向量的匹配概率(我搜索 OpenCV 2.4.5 文档,但我不能找不到这个。
任何人都可以解释这些吗? ,如果可能的话,还有一些极少的代码行。
答案 0 :(得分:3)
看看A Practical Guide to Support Vector
Classification。基本上,您应该将要素向量的每个维度缩放到[-1,1]或[0,1](所有维度都相同)。例如,对于第一维,如果您知道可能的最大值和最小值为v_max
和v_min
(如果它是像素灰度值,那么它们是0和255)。然后,您可以将新要素值计算为new_val = (old_val-v_min)/(v_max-v_min);
这是OpenCV SVM预测函数的文档:predict
。
float CvSVM::predict(const CvMat* sample, bool returnDFVal=false ) const
如果您将returnDFVal
传递为true,那么您将获得距离边距的距离作为返回值。这不是一个概率,但你可以用它作为你的分类有多好的指标。
希望这有帮助。
答案 1 :(得分:2)
您的数据已经有所缩放,但libsvm人会建议(http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf)线性缩放到[0,1]或[-1,1]。如果您有像素数据[0,1]可能更有意义。
我也没看到。您可以链接到C ++ libsvm(http://www.csie.ntu.edu.tw/~cjlin/libsvm/),然后您有两个选项。 A)列车类概率,在这种情况下,你得到那些或B)要求距离决策边界的距离。