cpu下onnx和libtorch部署速度对比

1. cpu结果图

1.1. onnx

1.2. libtorch

2. 使用工具版本

  • 系统:Windows10
  • visual studio 2019
  • CMake 3.28.1
  • opencv 4.9
  • onnxruntime 1.14.1
  • libtorch 1.8.1

3. 安装

3.1 安装cmake

CMake下载链接:https://cmake.org/download/

3.1.1 下载最新稳定版即可(Latest Release):

3.1.2 下载完成后,单击“Next”按钮,在下图中勾选“I accept the terms in the License Agreement”复选框接受许可协议:

3.1.3 选中“Add CMake to the system PATH for all users”单选按钮添加系统路径变量。也可以同时勾选“CreateCMakeDesktopIcon”复选框,以便在安装完成后在桌面上创建CMake的快捷方式图标。


点击Install进行安装。

3.2 安装opencv

地址:https://github.com/opencv/opencv/releases/download/4.9.0/opencv-4.9.0-windows.exe

3.2.1 安装到指定目录并添加系统环境变量

image.png
1707025746736.png

3.3 安装onnxruntime

地址:https://github.com/microsoft/onnxruntime/releases/download/v1.14.1/onnxruntime-win-x64-gpu-1.14.1.zip

3.3.1 解压到指定目录并添加系统环境变量

image.png
1707025508508.png

3.4 安装gflags

地址:https://github.com/gflags/gflags

3.4.1 下载以后用cmake编译

image.png

3.4.2 点进Open Project,选择Release,右边解决方案INSTALL右键,生成

1707025040900.png
image.png

3.4.3 加入系统环境变量

1707025131688.png

3.5 安装libtorch

地址:https://download.pytorch.org/libtorch/cu111/libtorch-win-shared-with-deps-1.8.1%2Bcu111.zip

3.5.1 解压到指定目录并添加系统环境变量

image.png
1707025911560.png

4. 基于onnxruntime部署编译

4.1 新建build文件夹,用来存放项目编译结果,并用cmake打开预编译image.png

4.2 vs打开编写属性页

1707026616464.png
1707026718169.png

4.3 编译

image.png
image.png

4.4 运行exe文件验证

image.png
image.png

5. 基于libtorch部署编译

5.1 cmake预编译

1707027480305.png

5.2 vs打开编写属性页

image.png
image.png

asmjit.lib
c10.lib
c10d.lib
c10_cuda.lib
caffe2_detectron_ops_gpu.lib
caffe2_module_test_dynamic.lib
caffe2_nvrtc.lib
clog.lib
cpuinfo.lib
dnnl.lib
fbgemm.lib
fbjni.lib
gloo.lib
gloo_cuda.lib
libprotobuf-lite.lib
libprotobuf.lib
libprotoc.lib
mkldnn.lib
pthreadpool.lib
pytorch_jni.lib
torch.lib
torch_cpu.lib
torch_cuda.lib
torch_cuda_cpp.lib
torch_cuda_cu.lib
XNNPACK.lib

image.png

5.3 编译运行

1707027898085.png
image.png

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于部署 YOLOv5 Segmentation 模型,可以通过以下步骤: 1. 将模型转换成 ONNX 格式 使用 PyTorch 软件包将 YOLOv5 Segmentation 模型训练并导出为 ONNX 格式。可以使用以下 Python 代码: ``` import torch model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True) model.eval() # Export the model to ONNX format torch.onnx.export(model, # PyTorch model torch.rand(1, 3, 640, 640), # Input tensor shape "yolov5s.onnx", # Output ONNX model name export_params=True) # Export weights and biases ``` 2. 使用 ONNX Runtime 部署模型 使用 ONNX Runtime C API,可以部署 ONNX 模型。可以使用以下 C++ 代码: ``` #include <stdio.h> #include <assert.h> #include <fstream> #include <iostream> #include <vector> #include "onnxruntime_c_api.h" int main() { OrtEnv* env; OrtCreateEnv(ORT_LOGGING_LEVEL_WARNING, "test", &env); OrtSession* session; OrtStatus* status; const char* model_path = "yolov5s.onnx"; OrtSessionOptions* session_options; OrtCreateSessionOptions(&session_options); status = OrtSessionOptionsAppendExecutionProvider_CPU(session_options, ORT_ENABLE_ALL); status = OrtCreateSession(env, model_path, session_options, &session); OrtMemoryInfo* memory_info; OrtCreateCpuMemoryInfo(OrtArenaAllocator, OrtMemTypeDefault, &memory_info); // Prepare input OrtValue* input_tensor = NULL; size_t input_size = 1 * 3 * 640 * 640; void* input_data = malloc(input_size); // TODO: Populate input_data with image data in BGR format status = OrtCreateTensorWithDataAsOrtValue(memory_info, input_data, input_size, {1, 3, 640, 640}, ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT, &input_tensor); // Prepare output OrtValue* output_tensor = NULL; const char* output_name = "output"; // TODO: Replace with the actual output name of the YOLOv5 Segmentation model status = OrtSessionGetOutputCount(session, &output_count); std::vector<const char*> output_names(output_count); std::vector<int64_t> output_shapes(output_count); for (int i = 0; i < output_count; i++) { char* output_name_temp; status = OrtSessionGetOutputName(session, i, memory_info, &output_name_temp); assert(status == NULL); output_names[i] = output_name_temp; OrtTensorTypeAndShapeInfo* output_info; OrtSessionGetOutputTypeInfo(session, i, &output_info); assert(status == NULL); size_t num_dims; OrtTensorTypeAndShapeInfoGetShape(output_info, &output_shapes[i], 1, &num_dims); assert(status == NULL); OrtReleaseTensorTypeAndShapeInfo(output_info); } status = OrtSessionRun(session, NULL, &input_names[0], &input_tensors[0], 1, &output_names[0], 1, &output_tensor); assert(status == NULL); // TODO: Process output_tensor // Clean up OrtReleaseValue(input_tensor); OrtReleaseValue(output_tensor); OrtReleaseSession(session); OrtReleaseSessionOptions(session_options); OrtReleaseMemoryInfo(memory_info); OrtReleaseEnv(env); free(input_data); return 0; } ``` 3. 处理输出张量 YOLOv5 Segmentation 模型的输出张量是一个 4 维的张量,形状为 `[batch_size, num_classes, height, width]`,其中 `batch_size` 表示批大小,`num_classes` 表示类别数量,`height` 和 `width` 表示图像中每个像素的标签。可以使用以下 C++ 代码来解析输出张量: ``` OrtStatus* status; float* output_data = OrtGetFloatPtr(output_tensor, &num_elements); status = OrtGetValueCount(output_tensor, &output_count); assert(status == NULL); const int num_classes = output_shapes[1]; const int height = output_shapes[2]; const int width = output_shapes[3]; std::vector<int> predictions(num_elements); for (int i = 0; i < num_elements; i++) { predictions[i] = (int) (output_data[i] * num_classes); } // TODO: Process predictions ``` 4. 可视化分割结果 可以使用 OpenCV C++ 库来可视化分割结果,代码如下: ``` #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> // TODO: Replace with the actual image path const char* image_path = "test.jpg"; // TODO: Replace with the actual output post-processing code std::vector<int> predictions = postprocess_output(output_data, output_shapes); cv::Mat image = cv::imread(image_path); cv::Mat seg_image(height, width, CV_8UC3, cv::Scalar(0, 0, 0)); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int prediction = predictions[y * width + x]; if (prediction == 0) { seg_image.at<cv::Vec3b>(y, x) = cv::Vec3b(255, 255, 255); // Background } else { seg_image.at<cv::Vec3b>(y, x) = cv::Vec3b(0, 0, 255); // Object } } } cv::Mat result; cv::addWeighted(image, 0.5, seg_image, 0.5, 0, result); cv::imshow("Result", result); cv::waitKey(0); cv::destroyAllWindows(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值