【问题标题】:OpenCV SVM Classifier not working across platformOpenCV SVM 分类器不能跨平台工作
【发布时间】:2021-11-30 18:01:09
【问题描述】:

使用 Python / OpenCV SVM + 局部二进制模式(统一为 59 个 bin)将图像训练为具有 ~600 个数据集的 -1 类(#1 类)和 ~250 个数据集的 1 类(#2 类)。还有一个测试/预测功能可以在保存的模型文件上测试图像。

在 C++ 方面,我只有一个测试接口,它加载上面创建的模型,计算图像的 LBP(均匀)并运行预测。

上述代码已完成并经过测试,可在两种语言/平台上统一工作。然后我用更多数据重新训练模型以提高模型准确性并在 Python 中重新运行测试,结果按预期工作。使用 C++ 中的(更新的)模型,所有测试数据都被预测为一个类(类 #1),而 Python 中的测试工作与预期相同。我已经交叉检查了 LBP 函数在 Python 和 C++ 中仍然返回相同的值。

这就是 SVM 文件可用的方式here

传递给预测的数据

Python ==> 返回 1

hist32=[[145. 0. 3. 4. 1. 1. 7. 3. 3. 14. 26. 0. 4. 12. 16. 9. 2. 3. 8. 24. 14. 3. 1. 5. 11. 13. 2. 1. 0. 3. 0. 9. 39. 9. 0. 1. 4. 14. 17. 3. 0. 0. 9. 32. 7. 1. 1. 25. 3. 0. 0. 10. 0. 0. 0. 1. 0. 0. 47.]] 

C++ ==> 返回-1(应该是+1)

[2.0318828e-43, 0, 4.2038954e-45, 5.6051939e-45, 1.4012985e-45, 1.4012985e-45, 9.8090893e-45, 4.2038954e-45, 4.2038954e-45, 1.9618179e-44, 3.643376e-44, 0, 5.6051939e-45, 1.6815582e-44, 2.2420775e-44, 1.2611686e-44, 2.8025969e-45, 4.2038954e-45, 1.1210388e-44, 3.3631163e-44, 1.9618179e-44, 4.2038954e-45, 1.4012985e-45, 7.0064923e-45, 1.5414283e-44, 1.821688e-44, 2.8025969e-45, 1.4012985e-45, 0, 4.2038954e-45, 0, 1.2611686e-44, 5.465064e-44, 1.2611686e-44, 0, 1.4012985e-45, 5.6051939e-45, 1.9618179e-44, 2.3822074e-44, 4.2038954e-45, 0, 0, 1.2611686e-44, 4.4841551e-44, 9.8090893e-45, 1.4012985e-45, 1.4012985e-45, 3.5032462e-44, 4.2038954e-45, 0, 0, 1.4012985e-44, 0, 0, 0, 1.4012985e-45, 0, 0, 6.5861028e-44]

【问题讨论】:

    标签: python c++ svm opencv4


    【解决方案1】:

    在重新提出问题时发现了问题。

    问题与 hist 的数据类型有关。由于我使用查找并手动计算直方图,浮点类型的值将与 int 完全不同。

    之前

     lbp = Mat::zeros(1, 59, CV_32F);
     // fill the mat
     lbp = lbp.reshape(1, 1);
    

    现在

     lbp = Mat::zeros(59, 1, CV_8U);
     // fill the mat
    
     lbp.convertTo(lbp, CV_32F);
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 2010-11-13
      相关资源
      最近更新 更多