搜索

查看: 3112|回复: 11

[Python] C++ ncnn模型验证精度实现代码

[复制链接]
发表于 2023-5-4 17:18:45 | 显示全部楼层 |阅读模式
Editor 2023-5-4 17:18:45 3112 11 看全部
目录
  • 验证ncnn模型的精度
  • 1、进行pth模型的验证
  • 2、转为onnx后的精度验证
  • 3、ncnn精度验证
  • 4、结果确认
    验证ncnn模型的精度
    1、进行pth模型的验证
    得到ncnn模型的顺序为:.pth–>.onnx–>ncnn
    .pth的精度验证如下:
    如进行的是二分类:
        model = init_model(model, data_cfg, device=device, mode='eval')
        ###.pth转.onnx模型
        # #---
        # input_names = ["x"]
        # output_names = ["y"]
        # inp = torch.randn(1, 3, 256, 128) ##错误示例
        inp = np.full((1, 3, 160, 320), 0.5).astype(np.float) #(160,320) = (h,w)
        inp = torch.FloatTensor(inp)
        out = model(inp)
        print(out)
    没有经过softmax层,out输出为±1的两个值。

    2、转为onnx后的精度验证
       sess = onnxruntime.InferenceSession("G:\\pycharm_pytorch171\\pytorch_classification\\main\\sim.onnx", providers=["CUDAExecutionProvider"])  # use gpu
        input_name = sess.get_inputs()[0].name
        print("input_name: ", input_name)
        output_name = sess.get_outputs()[0].name
        print("output_name: ", output_name)
        # test_images = torch.rand([1, 3, 256, 128])
        test_images = np.full((1, 3, 160, 320), 0.5).astype(np.float) #(160,320) = (h,w)
        test_images = torch.FloatTensor(test_images)
        print("test_image", test_images)
        prediction = sess.run([output_name], {input_name: test_images.numpy()})
        print(prediction)

    3、ncnn精度验证
    首先保证mean、norm输出的值与onnx保持一致,因为onnx直接输入值0.5,ncnn模型经过mean、norm计算后的结果与0.5一致就行。
    然后就是ncnn模型的计算输出
    - 查看输出结果是否是0.5,首先得将输入值1给到img
    ```cpp
         constexpr int w = 320;
         constexpr int h = 160;
         float cbuf[h][w];
         cv::Mat img(h, w, CV_8UC3,(float *)cbuf);
         //BYTE* iPtr = new BYTE[128 * 256 * 3];
         BYTE* iPtr = new BYTE[h * w * 3];
         for (int i = 0; i (i, j)[k];
                     img.at(i, j)[k] = 1;
                 }
             }
         }
    ```
    - 经过上面的赋值,通过了mean、norm计算后,得到的结果进行查看,值为0.5则正确转换。得到的结果送入下面的代码进行输出。
    ncnn结果为mat,因此采用该方法进行遍历查看。
    ```cpp
    //输出ncnn mat
    void ncnn_mat_print(const ncnn::Mat& m)
    {
         for (int q = 0; q
    4、结果确认
    一般情况下,pth模型与onnx模型结果相差不大,ncnn会有点点损失,千分位上的损失,这样精度基本上是一致的。
    若不一致,看哪一步结果相差太大,如果是ncnn这一步相差太大,检查是否是值输入有问题,或者是输入的(h,w)弄反了。
    到此这篇关于C++ ncnn模型验证精度实现代码的文章就介绍到这了,更多相关C++ ncnn验证精度内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛
  • 回复

    使用道具 举报

    发表于 2023-6-29 01:52:02 | 显示全部楼层
    123456868 2023-6-29 01:52:02 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-29 14:25:25 | 显示全部楼层
    dxf17 2023-6-29 14:25:25 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 21:26:01 | 显示全部楼层
    十二音阶囤 2023-6-29 21:26:01 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 22:06:47 | 显示全部楼层
    知足常乐77 2023-6-29 22:06:47 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 22:48:48 | 显示全部楼层
    计划你大爷计j 2023-6-29 22:48:48 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-29 22:57:42 | 显示全部楼层
    永远就三年疗 2023-6-29 22:57:42 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    发表于 2023-6-30 01:35:20 | 显示全部楼层
    123456809 2023-6-30 01:35:20 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-6-30 04:04:14 | 显示全部楼层
    心随674 2023-6-30 04:04:14 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-6-30 10:29:37 | 显示全部楼层
    贰十岁装成熟装s 2023-6-30 10:29:37 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表