C++下如何将TensorFlow模型封装成DLL供C#调用
目录
- 生成dll
- 使用C#调用dll
生成dll
IDE使用visual studio 2015。
首先新建一个C++win32工程,选择dll,包括导出符号,但不要预编译头。
模板会提供一个工程同名的头文件和一个源文件。
在源文件中将TensorFlow头文件和其他需要使用的头文件引用进来。
在源文件中定义需要export的函数。
在头文件中给出需导出函数的声明。
extern 关键字后加“C”保证在C#调用时不生成中间函数名。
编译环境选择X64,配置好include、lib目录以及附加依赖项文件,生成解决方案。
在输出目录会看见生成了dll文件。
使用C#调用dll
new project,创建一个C#控制台程序进行测试,将C#工程添加到当前solution中,右键设为工程第一启动项。打开C#工程属性,将build选项中的平台设置为x64(很关键)
在C#的cs文件中首先include 头文件system.runtime.interopservices。将dll工程的输出目录设置为C#的debug目录,与EXE文件同级。
重新生成解决方案,此时生成的tfdll.dll会出现在C#的debug目录下。
使用DllImport导入dll文件,如下图所示代码即可调用dll中的函数。
若出现badimage报错,试图加载不正确的dll,可能是由于位数选择出错,dll和C#冲突。
若出现找不到dll报错,可能是由于未将此dll所需的依赖dll一同拷入debug文件夹下。
下图中的TensorFlow的dll即是tfdll的依赖库。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
C++ 封装 DLL 供 C# 调用详细介绍
目录 1.VLC代码封装 1.1 QT(C++)工程 1.2static 声明 m_instance 优化效率 1.3封装 DLL 1.4应用程序的导出函数 1.5 vlc 简单封装的具体实现 2.C# 调用 2.1C# 回调函数声明与定义 2.2C# 导出普通函数调用 1.VLC代码封装 1.1 QT(C++)工程 首先需要配置可使用 VLC 正常播放的 QT(C++)工程,获取VLC每一帧并渲染到Qwidget Libvlcapi public static class LIBVLCAPI
-
C#调用C++dll方法步骤
C#调用C++dll的方法和步骤 其他分享涉及到的概念和方法对于像我这样比较菜的选手看起来比较费劲并且很难抓住重点,这里我总结了一段时间的研究成果供初学者救济之用,简单明了. 1.新建项目->Visual C++->Win32项目 MyDLL 注意:C++编写的dll一般是不能直接拿来C#调用,需要先新建个C++的工程把dll里的方法重新封装成可被C#外部调用的函数. 2.MyDLL.cpp里的代码如下: extern "C" _declspec(dllexport)int
-
C++调用C#的DLL程序实现方法
把C#编译成DLL或者Axtive控件,再由C调用!比如使用C++调用C#的DLL. SwfDotNet是.net下输出flash的类库.SwfDotNet是C#编写的,作者的C#水平,真是令我佩服.这是个特别好的读写Swf文件的库.但是,我要用在C++项目中,怎么让C++调用C#的DLL呢.今天一上午都在琢磨这个问题,耽误了很多时间,原因是编译是出现:warning C4819: 该文件包含不能在当前代码页(936)中表示的字符.请将该文件保存为 Unicode 格式以防止数据丢失. 接着就是
-
C++调用C#的DLL实现方法
SwfDotNet是C#编写的,这是个特别好的读写Swf文件的库.本文讲述了在C++项目中,怎么让C++调用C#的DLL动态链接库文件. 具体的实现步骤如下: 一.创建C# DLL,需要指定应用类型为"类库",代码: namespace CSLib { public class Class1 { private string name; public string Name { get { return name; } set { name = "Your Name: &qu
-
C++下如何将TensorFlow模型封装成DLL供C#调用
目录 生成dll 使用C#调用dll 生成dll IDE使用visual studio 2015. 首先新建一个C++win32工程,选择dll,包括导出符号,但不要预编译头. 模板会提供一个工程同名的头文件和一个源文件. 在源文件中将TensorFlow头文件和其他需要使用的头文件引用进来. 在源文件中定义需要export的函数. 在头文件中给出需导出函数的声明. extern 关键字后加“C”保证在C#调用时不生成中间函数名. 编译环境选择X64,配置好include.lib目录以及附加依赖
-
把js文件编译成dll供页面调用的方法
1. 在解决方案中添加一个项目:JSControl 2. 在这个项目添加一个js文件(JScript1.js) 脚本的内容: function showAlert(){ alert('Today is a good dary'); } 3. 改变JScript1.js的属性,Build Action为Embedded Resource(嵌入的资源) 4. 在JSControl项目的AssemblyInfo.cs文件中添加一行:(注意JSControl.JScript1.js,JSControl是
-
将tensorflow模型打包成PB文件及PB文件读取方式
1. tensorflow模型文件打包成PB文件 import tensorflow as tf from tensorflow.python.tools import freeze_graph with tf.Graph().as_default(): with tf.device("/cpu:0"): config = tf.ConfigProto(allow_soft_placement=True) with tf.Session(config=config).as_defaul
-
通过VB6将ASP编译封装成DLL组件最简教程 附全部工程源文件
1.新建DLL打开VB6-->文件-->新建工程-->选择ActiveX DLL-->确定 2.将默认工程.类重命名工程重命名:工程-->工程1 属性(此名称对应窗体内工程项目名称)-->在打开对话框中将"工程名称"重命名为ASP2DLL(当DLL组件在系统中注册后,在asp中默认的调用方法是"工程名.类名")-->确定 类重命名在属性窗口中将名称重命名为Demo 3.定义ASP基本对象添加模块:工程-->添加模块--
-
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
升级到tf 2.0后, 训练的模型想转成1.x版本的.pb模型, 但之前提供的通过ckpt转pb模型的方法都不可用(因为保存的ckpt不再有.meta)文件, 尝试了好久, 终于找到了一个方法可以迂回转到1.x版本的pb模型. Note: 本方法首先有些要求需要满足: 可以拿的到模型的网络结构定义源码 网络结构里面的所有操作都是通过tf.keras完成的, 不能出现类似tf.nn 的tensorflow自己的操作符 tf2.0下保存的模型是.h5格式的,并且仅保存了weights, 即通过mod
-
Keras模型转成tensorflow的.pb操作
Keras的.h5模型转成tensorflow的.pb格式模型,方便后期的前端部署.直接上代码 from keras.models import Model from keras.layers import Dense, Dropout from keras.applications.mobilenet import MobileNet from keras.applications.mobilenet import preprocess_input from keras.preprocessi
-
关于Tensorflow 模型持久化详解
当我们使用 tensorflow 训练神经网络的时候,模型持久化对于我们的训练有很重要的作用. 如果我们的神经网络比较复杂,训练数据比较多,那么我们的模型训练就会耗时很长,如果在训练过程中出现某些不可预计的错误,导致我们的训练意外终止,那么我们将会前功尽弃.为了避免这个问题,我们就可以通过模型持久化(保存为CKPT格式)来暂存我们训练过程中的临时数据. 如果我们训练的模型需要提供给用户做离线的预测,那么我们只需要前向传播的过程,只需得到预测值就可以了,这个时候我们就可以通过模型持久化(保存为PB
-
tensorflow模型转ncnn的操作方式
第一步把tensorflow保存的.ckpt模型转为pb模型, 并记下模型的输入输出名字. 第二步去ncnn的github上把仓库clone下来, 按照上面的要求装好依赖并make. 第三步是修改ncnn的CMakeList, 具体修改的位置有: ncnn/CMakeList.txt 文件, 在文件开头处加入add_definitions(-std=c++11), 末尾处加上add_subdirectory(examples), 如果ncnn没有examples文件夹,就新建一个, 并加上CMa
-
浅谈tensorflow模型保存为pb的各种姿势
一,直接保存pb 1, 首先我们当然可以直接在tensorflow训练中直接保存为pb为格式,保存pb的好处就是使用场景是实现创建模型与使用模型的解耦,使得创建模型与使用模型的解耦,使得前向推导inference代码统一.另外的好处就是保存为pb的时候,模型的变量会变成固定的,导致模型的大小会大大减小. 这里稍稍解释下pb:是MetaGraph的protocol buffer格式的文件,MetaGraph包括计算图,数据流,以及相关的变量和输入输出 主要使用tf.SavedModelBuilde
随机推荐
- AngularJS中关于ng-class指令的几种实现方式详解
- Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
- mongodb安装_动力节点Java学院整理
- 使用Vue.js创建一个时间跟踪的单页应用
- js 使FORM表单的所有元素不可编辑的示例代码
- MAC下安装docker教程
- Android获取手机屏幕宽高、状态栏高度以及字符串宽高信息的方法
- javascript实现表单验证
- CentOS 6.3下给PHP添加mssql扩展模块教程
- 用v-html解决Vue.js渲染中html标签不被解析的问题
- 求PHP数组最大值,最小值的代码
- BootStrap Progressbar 实现大文件上传的进度条的实例代码
- 详解Mysql自动备份与恢复的几种方法(图文教程)
- C#窗体传值实例汇总
- jQuery Html控件基本操作(日常收集整理)
- javascript删除Table中的一行的脚本代码
- JDO 2.0查询语言的特点
- Java的Spring框架中bean的继承与内部bean的注入
- Java位运算和逻辑运算的区别实例
- 解析MySql与Java的时间类型