博主你好哇,我看到你的关于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,可以问问你这里是怎么解决的嘛.
PaddleOCR在C++下部署TensorRT
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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. 调试和测试
在完成上述步骤后,编译并运行你的项目。检查是否有任何错误或警告,并进行调试。确保模型能够正确加载并执行推理。
希望这些步骤能帮助你解决问题!如果有更多问题,欢迎继续咨询。
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥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 微信的店铺小程序如何修改背景图