WaterMirror1 2024-07-18 11:08 采纳率: 0%
浏览 31

PaddleOCR在C++下部署TensorRT

博主你好哇,我看到你的关于PaddleOCR本地部署的那篇博客,写的真的很详细!
我这里也在本地部署paddleOCR到自己的C++项目上做图像的文本识别,已经成功用GPU执行了,不过我现在想要使用TensoRT来对模型进行加速,我把原本使用的inference.pdmodel模型通过飞浆官方提供的线上平台转换成了ch_ppocr_mobile_v2.0_cls_infer.onnx模型,但是我发现在ocr_cls.cpp中修改config.SetModel函数中的模型名称以后就会报错:ch_ppocr_mobile_v2.0_cls_infer.onnx/model, please confirm whether the file is normal,可以问问你这里是怎么解决的嘛.

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-07-18 11:08
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    你好!很高兴你在尝试将PaddleOCR部署到C++项目中,并使用TensorRT进行加速。以下是一些建议和步骤,希望能帮助你解决遇到的问题:

    1. 确认模型文件是否正常

    首先,确保你的ch_ppocr_mobile_v2.0_cls_infer.onnx模型文件是完整无损的,并且路径正确。你可以执行以下步骤:

    • 检查文件完整性:确保文件没有损坏。你可以通过重新下载或转换模型文件来验证这一点。
    • 检查文件路径:确保在代码中引用的模型文件路径是正确的。路径应该是相对于你的项目目录的相对路径或绝对路径。

    2. 修改模型加载代码

    ocr_cls.cpp文件中,确保你正确地设置了模型文件的路径。以下是一些可能的修改:

    #include "paddleocr.h"
    
    int main() {
        PaddleOCR paddleOCR;
        paddleOCR.SetModel("ch_ppocr_mobile_v2.0_cls_infer.onnx");
        paddleOCR.SetConfidenceThreshold(0.5);
    
        // 加载图片并进行OCR识别
        cv::Mat image = cv::imread("test.jpg");
        auto result = paddleOCR.DetectText(image);
    
        // 输出识别结果
        for (auto& line : result) {
            std::cout << line << std::endl;
        }
    
        return 0;
    }
    

    确保SetModel函数中的路径正确指向你的.onnx文件。

    3. 集成TensorRT

    要在C++项目中集成TensorRT并加速PaddleOCR模型,你可以按照以下步骤操作:

    3.1 安装TensorRT

    确保你的系统已经安装了TensorRT。你可以从NVIDIA的官方网站下载并安装适合你系统的TensorRT版本。

    3.2 配置项目

    在你的C++项目中,确保正确配置了TensorRT的头文件和库文件。通常,你需要在编译器的包含路径和库路径中添加TensorRT的路径。

    3.3 编写代码

    你需要编写代码来加载TensorRT引擎并使用它来加速你的模型。以下是一个基本的示例:

    #include <iostream>
    #include <fstream>
    #include <memory>
    #include <NvInfer.h>
    #include <NvOnnxParser.h>
    #include <cuda_runtime_api.h>
    
    using namespace nvinfer1;
    
    int main() {
        const char* modelPath = "ch_ppocr_mobile_v2.0_cls_infer.onnx";
        const int maxBatchSize = 1;
    
        // 创建TensorRT引擎
        IBuilder* builder = createInferBuilder(gLogger);
        INetworkDefinition* network = builder->createNetworkV2(0);
        IBuilderConfig* config = builder->createBuilderConfig();
    
        // 解析ONNX模型
        IOnnxParser* parser = nvonnxparser::createParser(*network, gLogger);
        if (!parser->parseFromFile(modelPath, static_cast<int>(ILogger::Severity::kWARNING))) {
            std::cerr << "Failed to parse ONNX model" << std::endl;
            return -1;
        }
    
        // 构建并序列化TensorRT引擎
        builder->setMaxBatchSize(maxBatchSize);
        builder->setMaxWorkspaceSize(1 << 20); // 1GB
        ICudaEngine* engine = builder->buildEngineWithConfig(*network, *config);
        std::string serializedEngine = engine->serialize();
    
        // 释放资源
        parser->destroy();
        network->destroy();
        config->destroy();
        builder->destroy();
    
        // 加载序列化的TensorRT引擎
        std::ifstream engineFile("ch_ppocr_mobile_v2.0_cls_infer.trt", std::ios::binary);
        engineFile.seekg(0, std::ios::end);
        size_t fsize = engineFile.tellg();
        engineFile.seekg(0, std::ios::beg);
    
        std::vector<char> engineData(fsize);
        engineFile.read(engineData.data(), fsize);
        engineFile.close();
    
        IRuntime* runtime = createInferRuntime(gLogger);
        ICudaEngine* engine = runtime->deserializeCudaEngine(engineData.data(), fsize, nullptr);
    
        // 创建执行上下文
        IExecutionContext* context = engine->createExecutionContext();
    
        // 准备输入和输出
        void* deviceBuffers[2];
        cudaMalloc(&deviceBuffers[0], maxBatchSize * inputSize);
        cudaMalloc(&deviceBuffers[1], maxBatchSize * outputSize);
    
        // 运行推理
        cudaMemset(deviceBuffers[0], 0, maxBatchSize * inputSize);
        context->executeV2(deviceBuffers);
    
        // 获取输出
        cudaMemcpy(outputData, deviceBuffers[1], maxBatchSize * outputSize, cudaMemcpyDeviceToHost);
    
        // 释放资源
        cudaFree(deviceBuffers[0]);
        cudaFree(deviceBuffers[1]);
        context->destroy();
        engine->destroy();
        runtime->destroy();
    
        return 0;
    }
    

    4. 调试和测试

    在完成上述步骤后,编译并运行你的项目。检查是否有任何错误或警告,并进行调试。确保模型能够正确加载并执行推理。

    希望这些步骤能帮助你解决问题!如果有更多问题,欢迎继续咨询。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月18日

悬赏问题

  • ¥15 Windows Script Host 无法找到脚本文件"C:\ProgramData\Player800\Cotrl.vbs”
  • ¥15 matlab自定义损失函数
  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图