• c++/c#实现mnist手写字符识别,包括模型训练、推理预测


    利用c++/c#实现mnist手写字符识别,包括模型训练、推理预测,依赖简单,开箱即用,全部通过代码实现,支持二次开发,以及gpu加速。

    GitHub - nonday/YileCV

    1.准备工作

    • 环境:win10+vs2015/x64(≥vs2015均可以)+cuda(optional)
    • 下载相关的依赖库yilecv.zip和mnist数据,下载地址见后

    2.C++实现训练、推理

    • 新建vc++空项目

    • 新建源文件(用于训练或者推理)

       训练代码

    1. // train.cpp
    2. #include
    3. #include
    4. #include "trainer.hpp"
    5. int main(int argc, char** argv)
    6. {
    7. yilecv::Trainer trainer;
    8. std::string model_file = "lenet_train_test.prototxt";
    9. std::string solver_file = "lenet_solver.prototxt";
    10. trainer.Init(model_file, solver_file, 0, "mnist_output");
    11. trainer.SetMetricBlobName("accuracy", true);
    12. trainer.Train();
    13. std::cout << "trainer.BestMetricValue=" << trainer.BestMetricValue() << std::endl;
    14. }

      推理代码

    1. // predict.cpp
    2. #include
    3. #include
    4. #include
    5. #include "predictor.hpp"
    6. int main(int argc, char** argv)
    7. {
    8. yilecv::Predictor predictor;
    9. std::string model_file = "lenet_deploy.prototxt";
    10. predictor.Init(model_file, "mnist_output/best.bin", 0);
    11. predictor.SetNormScaleCoeff({0.00390625,0.00390625,0.00390625});
    12. std::vector<float> out = predictor.Predict("dataset/mnist_images/test/test_0_7.jpg");
    13. std::vector<int> maxN = predictor.PredictMaxN(out, 1);
    14. for (int i = 0; i < maxN.size(); ++i)
    15. {
    16. std::cout << maxN[i] << ":" << out[maxN[i]] << std::endl;
    17. }
    18. }

    • 配置yilecv库

        右键项目,选择属性=>c/c++=>常规=>附加包含目录,设置为yilecv库下的include目录

        右键项目,选择属性=>链接器=>常规=>附加库目录,设置为yilecv库下的lib目录

        右键项目,选择属性=>链接器=>输入=>附加依赖项,设置为yilecv.lib

    • 拷贝yilecv/lib目录下的dll和网络模型相关文件到对应源文件目录,选择release/x64,运行即可

    3.C#实现训练、推理

    • 新建c#项目

    • 添加YileCVSharp.cs文件到项目中

    • 新建源文件,拷贝yilecv/lib目录下的dll和网络模型相关文件到对应bin目录下,选择release/x64,运行即可

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using YileCVSharp;
    7. namespace YileCVSharpExample
    8. {
    9. class Program
    10. {
    11. static void Main(string[] args)
    12. {
    13. // 训练
    14. //Trainer trainer = new Trainer();
    15. //string model_file = "lenet_train_test.prototxt";
    16. //string solver_file = "lenet_solver.prototxt";
    17. //trainer.Init(model_file, solver_file, 0, "mnist_output");
    18. //trainer.SetMetricBlobName("accuracy", true);
    19. //trainer.Train();
    20. //System.Console.WriteLine("trainer.BestMetricValue =" + ": " + trainer.BestMetricValue());
    21. // 推理预测
    22. Predictor predictor = new Predictor();
    23. predictor.Init("lenet_deploy.prototxt", "mnist_output/best.bin", 0);
    24. VectorFloat scale = new VectorFloat();
    25. scale.Add(0.00390625f);
    26. scale.Add(0.00390625f);
    27. scale.Add(0.00390625f);
    28. predictor.SetNormScaleCoeff(scale);
    29. VectorFloat output = predictor.Predict("mnist_images/test/test_0_7.jpg");
    30. VectorInt maxN = predictor.PredictMaxN(output, 1);
    31. for (int i = 0; i < maxN.Capacity; ++i)
    32. {
    33. System.Console.WriteLine(maxN[i] + ": " + output[maxN[i]]);
    34. }
    35. System.Console.ReadKey();
    36. }
    37. }
    38. }

    4.下载地址

    GitHub - nonday/YileCV

    配置好的c#工程(包含mnist数据):https://download.csdn.net/download/u012594175/89165417

    配置好的c++工程(包含mnis数据):https://download.csdn.net/download/u012594175/89165559

    交流QQ群

  • 相关阅读:
    【Linux】进程控制
    算法题9.11
    浅谈木材加工企业的电气火灾隐患及电气火灾监控系统的应用
    vue 使用Html2Canvas对元素截图 下载
    六、C++ 运算符重载
    第8章:系统质量属性与架构评估
    过拟合在测试集上的表现,利用卷积性质求卷积
    产品经理基础-10运营平台端产品设计(完结~撒花~)
    没有可用软件包和yum源问题
    【零基础入门MyBatis系列】第二篇——MyBatis入门程序
  • 原文地址:https://blog.csdn.net/u012594175/article/details/137289835