1.将pt模型导出为onnx模型
在导出onnx库的时候,出现以下错误:
ONNX: export failure ❌ 15.3s: DLL load failed while importing onnx_cpp2py_export
这时候需要进入虚拟环境,安装onnx库
参考博客
1.1 安装ONNX库
首先,进入虚拟环境, 我建立的虚拟环境名称为:yolov8
打开Anacoda Prompt ,输入以下指令
conda activate yolov8
接着输入
conda install -c conda-forge onnx
输入yes
至此,库安装完成
1.2 导出代码(ONNX)
在yolov8的源码艮目录下,新建一个python文件,输入以下代码,执行
from ultralytics import YOLO #加载模型 注意.pt文件的路径 model=YOLO(model='yolov8n.pt') #导出模型 model.export(format="onnx")
1.3官方文档参考
2.导出为TensorRT模型
GITHUB地址
2.1 TensorRT-CSharp-API-TensorRtSharp编译
首先编译这个项目,参见附件,或者从GITHUB上下载最新的,使用最新的项目,要注意对应的编译方法,可能和附件的不一样
具体步骤参见博客:【TensorRT】TensorRT C# API 项目介绍:基于C#与TensorRT部署深度学习模型(上篇)-CSDN博客
【TensorRT】TensorRT C# API 项目介绍:基于C#与TensorRT部署深度学习模型(上篇)-CSDN博客
或者这个PDF文件
这里需要注意的是:在编译TensorRT-CSharp-API-TensorRtSharp时,可能会报错
2.2 YoloDeployCsharp-yolov1
这个是模型测试平台,编译注意以下:
这个问题已经解决,是缺少某个DLL文件, 到底是哪个我也不知道,暴力解决就是:将下载TensorRt下的LIB文件(TensorRT-8.6.1.6\lib里的文件)全部复制到生成的DEBUG目录下
需要将TensorRT-CSharp-API-TensorRtSharp2.0 C++工程生成的TensorRtExtern.dll也复制进去
2.3导出注意
1.时间比较久,慢慢等待
2.在哪个GPU上导出的就在哪个GPU上用,不同的GPU需要重新导出,同时需要重新编译TensorRT-CSharp-API-TensorRtSharp项目
3.编译源码下的openvino c++样例工程
在下载的源码里面,/ultralytics-main/examples 文件夹下下面有样例工程,本次以 YOLOv8-OpenVINO-CPP-Inference 这个工程为例,详细描述如何使用cmake 生产msvc源码
3.1 新建一个Build文件夹
这个文件夹就是要存放编译好的源码的地方,名称可以随意,路径可以随意,建议:放在和源码同级目录,以build命名。
如下图所示:
3.2打开cmake
按照图下步骤,执行
1.打开源码路径
2.选择编译路径
这里建议将bulid目录放在与源码同级目录下
3.清除缓存
3.3构建MSVC2019工程
3.3.1 cmake配置1
1.勾选高级
2.配置
3.下拉选择Visual Studio 16 2019
4.下拉选择x64
3.3.2 cmake配置2
这里需要着重关注的是:opencv的路径,关于opencv,可以查看另一篇关于opencv的学习记录 opencv 学习记录
3.3.3 生成MSVC2019源码
3.3.4查看源码
生成的源码在build目录下,如下图所示,yolov8_openvino_example.sln就是VS的解决方案,使用vs2019打开
3.4 VS2019调试源码
生成的解决方案,使用VS2019打开
3.4.1 重新生成
右击detect,重新生成
报错1 openvino/openvino.hpp
无法打开包括文件: “openvino/openvino.hpp”: No such file or directory detect
无法打开包括文件: “openvino/openvino.hpp”: No such file or directory detect
解决方法
openvino是需要自行安装的,详见另一篇学习笔记 1.QT6.5使用OpenVINO
找到openvino的安装路径,引用就可以了,
打开项目属性
配置属性-常规-C/C++ 附加包含目录
添加opnvino的include路径,
重新生产
查看gif
报错2:libopenvino.so“
无法打开文件“\path\to\intel\openvino\runtime\lib\intel64\libopenvino.so“
解决方法
右击detect项目,属性-链接器-常规-附加库目录-新建-D:\openvino_2024.3.0\runtime\lib\intel64\Debug
连接器-输入-附加依赖项- 删除\path\to\intel\openvino\runtime\lib\intel64\libopenvino.solibopvino.so
连接器-输入-附加依赖项 添加以下内容
openvinod.lib openvino_cd.lib openvino_onnx_frontendd.lib openvino_paddle_frontendd.lib openvino_pytorch_frontendd.lib openvino_tensorflow_frontendd.lib openvino_tensorflow_lite_frontendd.lib
重新生成
3.4.2 调试
3.4.2.1添加调试参数
源码生成成功后,项目detect右击-属性-配置属性-调试-命令参数 输入以下内容:
D:\yolov8n.onnx D:\bus.jpg
然后重新生成。
路径根据实际来
D:\yolov8n.onnx:模型文件路径 D:\bus.jpg:测试图片路径 两者中间用空格分开
3.4.2.2设定启动项目
项目detect右击-设定为启动项目
3.4.2.3 调试
点击 本地 Windows 调试器
3.4.2.4 报错 找不到openvinod.dll
由于找不到openvinod.dll,无法继续执行代码。重新安装程序可能会解决此问题。
解决方法:
目录根据实际来
将openvino安装目录下\runtime\bin\intel64\Debug的dll复制到生产的debug目录下
我这里是安装到了C盘,具体目录如下:
C:\Program Files (x86)\Intel\openvino_2024.3.0\runtime\bin\intel64\Debug 将这个目录下的dll文件复制到vs工程生成的 debug下
我这里是在
D:\8.yolo\3.yolov8Demo\ultralytics-main\examples\YOLOv8-OpenVINO-CPP-Inference\bulid\Debug
如图所示:
重新执行调试
3.4.2.5报错 找不到tbb12_debug.dll
由于找不到tbb12_debug.dll,无法继续执行代码。重新安装程序可能会解决。
解决方法:
目录根据实际来
将openvino安装目录下\runtime\3rdparty\tbb\bin目录下的 tbb12_debug.dll 复制到 vs生成的debug目录下
如图所示
3.4.2.6报错 帧不在模块中
经过断点调试,报错的代码位置:inference.cc ->
void Inference::RunInference(cv::Mat &frame) {
Preprocessing(frame); // Preprocess the input frame
inference_request_.infer(); // Run inference //执行这行代码的时候就报错
PostProcessing(frame); // Postprocess the inference results
}
这个报错原因很奇怪,我也没有研究,
解决方法:
将void Inference::RunInference 方法里面的代码改成付下所示:
void Inference::RunInference(cv::Mat &frame) {
//Preprocessing(frame); // Preprocess the input frame
cv::Mat resized_frame;
cv::resize(frame, resized_frame, model_input_shape_, 0, 0, cv::INTER_AREA); // Resize the frame to match the model input shape
// Calculate scaling factor
scale_factor_.x = static_cast<float>(frame.cols / model_input_shape_.width);
scale_factor_.y = static_cast<float>(frame.rows / model_input_shape_.height);
float* input_data = (float*)resized_frame.data; // Get pointer to resized frame data
const ov::Tensor input_tensor = ov::Tensor(compiled_model_.input().get_element_type(), compiled_model_.input().get_shape(), input_data); // Create input tensor
inference_request_.set_input_tensor(input_tensor); // Set input tensor for inference
inference_request_.infer(); // Run inference
PostProcessing(frame); // Postprocess the inference results
}
重新生成