【问题标题】:How to scale data in Open CV LibSVM如何在 Open CV LibSVM 中缩放数据
【发布时间】:2013-06-07 20:01:39
【问题描述】:

我正在使用 OpenCVVisual C++ 开发英文手写 OCR。我使用基于区域的方法进行特征提取。这里我使用64×64 图像。 所以我有一个示例图像的 64 个功能。我的 SVM 将是 Multi-class 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)

同样,我有 200 张图片 用于两个 52 类。在测试时,我当前的准确率仅为 35% - 40%。我已阅读缩放数据可提高预测的准确性。 但我有几件事要说清楚。

  1. 如何缩放这些特征值?

  2. OpenCV LibSVM中是否有任何函数可以获取每个测试特征向量的匹配概率(我搜索了OpenCV 2.4.5文档,但我不能'找不到这个)。

谁能解释一下这些? ,并且如果可能的话,还可以使用一些非常少的代码行

【问题讨论】:

    标签: opencv machine-learning


    【解决方案1】:
    1. 看看A Practical Guide to Support Vector Classification。基本上,您应该将特征向量的每个维度缩放为 [-1, 1] 或 [0, 1](所有维度都相同)。例如,对于第一维,如果你知道可能的最大值和最小值是v_maxv_min(如果是像素灰度值,那么它们是0和255)。然后你可以将新的特征值计算为new_val = (old_val-v_min)/(v_max-v_min);

    2. 这是 OpenCV SVM 预测函数的文档:predict

      float CvSVM::predict(const CvMat* sample, bool returnDFVal=false ) const

      如果您将returnDFVal 作为true 传递,那么您将获得到边距的距离作为返回值。这不是概率,但您可以将其用作您的分类好坏的指标。

    希望这会有所帮助。

    【讨论】:

    • 非常感谢您考虑我的问题和您的努力。我想使用纯 LibSVM 而不是 OpenCV 集成的。两者都是一样的,但我觉得使用 Pure LibSVM 可以解决我的问题。非常感谢
    【解决方案2】:
    1. 您的数据已经进行了一定程度的缩放,但 libsvm 人员会建议 (http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf) 线性缩放到 [0, 1] 或 [-1, 1]。如果你有像素数据 [0,1] 可能更有意义。

    2. 我也看不到。您可以链接到 C++ libsvm (http://www.csie.ntu.edu.tw/~cjlin/libsvm/),然后您有两个选择。 A) 训练类概率,在这种情况下你会得到这些概率,或者 B) 询问与决策边界的距离。

    【讨论】:

    • 关于数据“已经有所扩展”的优点。所以只下降了255;事实上,对于这种数据本质上是二进制的情况,并且最大值不是那么大,您可能会在没有缩放的情况下意识到这一点。
    • 如果除以 255,请确保转换为浮点表示。
    • @Josh S - 非常感谢您的努力并考虑我的问题。我的数据已经缩放(在 0 到 1 之间)。但我需要以某种方式找到匹配概率。我觉得纯粹的 LibSVM 适合我的目的,而不是 OpenCV 集成的。
    猜你喜欢
    • 2013-06-19
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2019-12-06
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多