OpenCV SVM分类器不能跨平台工作



使用Python/OpenCV SVM + Local Binary Pattern(统一为59个bin)将图像训练为-1(类#1)和1(类#2)(类# 250)。还有一个测试/预测功能来测试保存的模型文件上的图像。

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

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

这就是SVM文件在这里可用的方式

传递给预测的数据

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]

在重新构建问题时发现问题

问题与历史的数据类型有关。由于我使用查找并手动计算直方图,float类型的值将与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);

最新更新