博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PaddleX的C++使用
阅读量:3891 次
发布时间:2019-05-23

本文共 3453 字,大约阅读时间需要 11 分钟。

PaddleX的C++编译,C#调用dll实现预测

C++部署相关代码进行整理,并进行了如下工作:

1、 将官方C++预测代码在Visual Studio下生成解决方案(.sln)

2、 将C++预测代码进行生成dll
4、 使用C#调用生成的dll

将官方的C++预测代码在Visual Studio下生成解决方案

使用工具Cmake vs2019社区版 Git在这里插入图片描述

一、依赖库:

Opencv:选择3.4.6版本

https://sourceforge.net/projects/opencvlibrary/files/3.4.6/opencv-3.4.6-vc14_vc15.exe/download
Paddle预测库:选择win10下的cuda10版本。
https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/windows_cpp_inference.html
在这里插入图片描述

二、编译

这里我们选择使用cuda10.0 的,一定要和本地的cuda版本一致。之前使用本地的cudan10.2 编译,开启不了GPU预测。

一次点击按钮

在这里插入图片描述

编译需要的dll,这里我已经修改好了文件,并生成了dll文件。

在这里插入图片描述

改造了detector.ccp文件中代码,并在头文件中添加了接口文件。

namespace PaddleX {
//图片标签char res[50];PaddleX::Model* det;void* Loadmodel(char * model_dir_c) {
std::string model_dir = model_dir_c; std::string key = ""; int thread_num = 2; int gpu_id = 0; bool use_trt = 0; bool use_gpu = 0; bool use_ir_optim = 0; // bool use_trt = 0; bool use_mkl = 1; // PaddleX:Model model; (det = new PaddleX::Model) ->Init(model_dir, use_gpu, use_trt, use_mkl, thread_num, gpu_id, key, use_ir_optim); // PredictImage(image, result );}static PaddleX::DetResult result;char* PredictImage(char* input, int width, int height, int threshold) {
cv::Mat im(height, width, CV_8UC3, input); // cv::Mat im = cv::imread(image_path, 1); det->predict(im, &result); for (int i = 0; i < result.boxes.size(); ++i) {
strcpy_s(res, result.boxes[i].category.c_str()); } return res; result.clear();}}

三、C#调用

到这里基本上已经生成了dll,现在使用C#调用dll

#加载模型文件[DllImport("detector.dll", EntryPoint = "Loadmodel", CharSet = CharSet.Ansi)]public static extern void Loadmodel([MarshalAs(UnmanagedType.LPStr)] string modelPath );#加载图像(bitmap)[DllImport("detector.dll", EntryPoint = "PredictImage", CharSet = CharSet.Ansi)]public static extern IntPtr PredictImage( byte[] input, int width, int height, double,threshold);private void button4_Click(object sender, EventArgs e) {
#初始化模型文件 string models = @"F:\test\PaddleXdevelop\deploy\cpp\out\paddlex_inference\Release\inference"; Loadmodel(models); }private void button2_Click(object sender, EventArgs e) {
#开始预测,显示图像预测结果标签 string image_path = @"C:\Users\admin\Desktop\yuan\12345.jpg"; Bitmap bmp = new Bitmap(image_path); int stride; double threshold = 0.7; byte[] source = GetBGRValues(bmp, out stride); IntPtr seg_img = PredictImage(source, bmp.Width, bmp.Height, threshold); string result2 = Marshal.PtrToStringAnsi(seg_img); MessageBox.Show(result2);} public static byte[] GetBGRValues(Bitmap bmp, out int stride) {
var rect = new Rectangle(0, 0, bmp.Width, bmp.Height); var bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat); stride = bmpData.Stride; var rowBytes = bmpData.Width * Image.GetPixelFormatSize(bmp.PixelFormat) / 8; var imgBytes = bmp.Height * rowBytes; byte[] rgbValues = new byte[imgBytes]; IntPtr ptr = bmpData.Scan0; for (var i = 0; i < bmp.Height; i++) {
Marshal.Copy(ptr, rgbValues, i * rowBytes, rowBytes); ptr += bmpData.Stride; } bmp.UnlockBits(bmpData); return rgbValues; }

问题

1、dll 缺失,可以根据官网文档生成exe,去看缺失。

在这里插入图片描述
一般都是缺少 kldnn.dll,libiomp5md.dll,mkldnn.dll,mklml.dll, opencv_world346.dll

至此,我们生成dll,并且实现了成功的调用。

有问题,欢迎咨询,作者微信wxid_yzao1o7wi0wl22

转载地址:http://tpahn.baihongyu.com/

你可能感兴趣的文章
Linux之libevent的编译&测试
查看>>
Linux之kc.cfg文件参数详解
查看>>
MySql之简单SQL用法整理
查看>>
PHP之thinkphp的数据库操作代码段汇总
查看>>
Linux之tcpdump用法汇总整理
查看>>
Linux之tcp的结构分析
查看>>
WebKit之WebSocket模块的代码层初步分析
查看>>
WIFI之Agent调度关系
查看>>
WIFI之升级协议列表
查看>>
MCU之STM32可用硬件(外部接口)一览表
查看>>
MySql之设备管理的数据表设计列表
查看>>
WIFI之系统启动的脚本配置
查看>>
Python之服务器模块设计学习
查看>>
WIFI之3GControl模块调度草图
查看>>
WIFI之系统部署环境
查看>>
C++之UML关系说明图
查看>>
网络之Snmp的学习总结
查看>>
WIFI之服务器系统设计组成
查看>>
Linux之Arinc驱动设计草图
查看>>
Linux之grub.conf的内容介绍
查看>>