C#使用公共语言拓展(CLE)调用Python3(使用TensorFlow训练的模型)
对于Python2来说,使用IronPython可以方便的实现C#调用Python,但是对于特定需求,比如使用TensorFlow(最低支持Python3.5),就没办法使用IronPython了,为了解决这个问题,一个方法就是使用TensorflowSharp,简单使用可以看我的这篇文章:TensorflowSharp安装和使用入门,或者自行百度。还有一个方法就是用公共语言拓展(CLE),这个在Java上面似乎挺多人使用的,但是C#貌似没有很多相关的信息,官方文档也有使用方法,比较容易使用,不过我还是遇到了一些小问题,干脆直接记录下来。
首先是安装,根据自己的需要选择地址安装后,(Windows)实际上库文件是在C盘下面的srplab文件夹,而不是选择的安装路径,然后根据自己的.NET版本导入合适的版本,我的是AMD64平台,使用的是.NET Framework4.5.2,因此在项目中导入:
记得将VS编译选择去掉“首选32位”选项,不然无法正确导入。然后使用using Star_csharp完成环境安装。
干脆截取一段我自己的代码做一下说明,代码所创建的类是用来导入TensorFlow训练好的模型做预测:
using Star_csharp;namespace C_Python
{class useTF{//将模型导入和预测分开,这样可以多次调用预测函数private StarObjectClass model;private StarObjectClass processor;private StarCoreFactory starcore;private StarServiceClass Service;private StarSrvGroupClass SrvGroup;private StarObjectClass python;private string path;private string prediction;public useTF(string path){this.path = path;this.prediction = "";}public string getPred(){tryPred();return prediction;}public int modelPre(int[][] data){//将灰度数组转为python数组然后作为预测值python._Call("eval", "input = list()");for(int i = 0; i < 64; i++){for(int j = 0; j < 64; j++){python._Call("eval", "input.append(" + data[i][j] + ")");}}python._Call("eval", "input = np.array(input)");python._Call("eval", "input = input.reshape(1,64,64,1)");python._Call("eval", "prediction = pd.test_image(input)");//使用强制转换获得数据int result = (int)model._Get("num_class");int prediction = (int)python._Get("prediction");return prediction;}public void modelImport(){string path = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;path = path.Substring(0, path.LastIndexOf("\\"));path = path + "/pythonModel";path = path.Replace('\\','/');//这里是官方给出的初始化过程starcore = StarCoreFactory.GetFactory();Service = starcore._InitSimple("test", "123", 0, 0, null);SrvGroup = (StarSrvGroupClass)Service._Get("_ServiceGroup");//--init python raw interface,我这里用的是python3.6SrvGroup._InitRaw("python36", Service);python = Service._ImportRawContext("python", "", false, "");//个人推荐使用这种写法,看起来比较直观,不容易带给自己误解python._Call("eval", "import sys");python._Call("eval", "sys.path.append(r'" + path + "')");python._Call("eval", "import numpy as np");python._Call("eval", "import pred as pd");//这里在导入tensorflow模型后获得模块接口,可以使用model._Call("func")//相当于python._Call("eval", "pd.func()"),但是前一种方法没法保存返回结果model = python._GetObject("pd");python._Call("eval", "import operate_data as processor");processor = python._GetObject("processor");}public void modelClose(){SrvGroup._ClearService();starcore._ModuleExit();}public int imgProcess(string file){//将原始图片转换为灰度图片,通过下面的get_img获得结果processor._Call("operate_face", file);//对于非基本类型没法直接强制转换,比如这里返回的二维数组只能这样一个一个读int[][] img = new int[64][];for (int i = 0; i < 64; i++)img[i] = new int[64];for (int i = 0; i < 64; i++){for (int j = 0; j < 64; j++)img[i][j] = (int)processor._Call("get_img", i, j);}//将灰度图片的数据直接作为预测模型的输入int result = modelPre(img);return result;}}
}
除此之外,因为我使用了多线程来调用该类的实例,不知道什么原因,如果在主进程中导入模型,在子线程中没法使用某些方法,解决方法:导入模型和方法调用放在同一个子线程下进行。
补充一个问题:在使用tensorFlow做预测的时候发现一个严重的问题,对于导入的模型,在正常的python项目下,对第一批输入数据做预测的时候,一般会比较慢,但是后面预测速度会很快(不知道是不是因为python的缓冲机制),但是在使用CLE的时候无论第几次预测,速度都和第一次是一样的,对时间有要求的可能需要自行寻找一下解决方案,最好也能告诉我怎么解决的,先谢谢啦~
C#使用公共语言拓展(CLE)调用Python3(使用TensorFlow训练的模型)相关推荐
- C#使用公共语言拓展(CLE)调用Python3(tensorflow)
对于Python2来说,使用IronPython可以方便的实现C#调用Python,但是对于特定需求,比如使用TensorFlow(最低支持Python3.5),就没办法使用IronPython了,为 ...
- 【opencv】调用caffe、tensorflow、darknet模型
本文参考自:opencv调用cCaffe.TensorFlow.Torch.PyTorch训练好的模型 往往,当我们训练好一个模型后,就可以通过OpenCV加载模型使用该模型,完成分类和实时预测的任务 ...
- 如何用java语言调用tensorflow训练好的模型
1.TensorFlow的训练模型在Android和Java的应用及调用 2.tensorflow的python离线训练java在线预测方案 3.tensorflow训练的模型在java中的使用 4. ...
- Java如何跨语言调用Python/R训练的模型
在 如何使用sklearn进行在线实时预测(构建真实世界中可用的模型) 这篇文章中,我们使用 sklearn + flask 构建了一个实时预测的模型应用.无论是 sklearn 还是 flask,都 ...
- go语言调用python_Golang中调用Python3
最近有一个项目需要在服务端调用Python3.7写的算法,网上找了一圈,发现两个库都使用cgo特性调用了Python的C-API: 针对Python2:https://github.com/sbine ...
- C#使用CLE调用python
C#使用CLE调用Python 项目相关 入门 运行官方Demo 初始化服务与退出服务 C#代码 Python代码 遇到的问题 其他 CLE Object 设置输出回调 项目相关 工作需要使用C#调用 ...
- phpcmsV9 首页调用全站最新文章(受模型限制)
phpcmsV9 首页调用全站最新文章数据的办法 在很多使用phpcmsV9框架的项目中,都会经常遇到首页调用全站最新文章的情况.这里讲解一篇.仅供参考. 首页调用 · 全站最新文章 查找文件:www ...
- 『论文笔记』TensorFlow1.6.0+Keras 2.1.5+Python3.5+Yolov3训练自己的数据集!
TensorFlow1.6.0+Keras 2.1.5+Python3.5+Yolov3训练自己的数据集! 文章目录 前期准备 一. Yolov3简要介绍 1.1. Yolov3网络结构图 1.2. ...
- ML之分类预测之ElasticNet之PLoR:在二分类数据集上调用Glmnet库训练PLoR模型(T2)
ML之分类预测之ElasticNet之PLoR:在二分类数据集上调用Glmnet库训练PLoR模型(T2) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 for iStep in ...
最新文章
- Google邮局可以实时开通了
- SAP UI5 的 sap-ui-bootstrap script 脚本标签各属性解析
- 男生的哪个“不要”是真的不要?
- 869. 重新排序得到 2 的幂
- 【面向对象】面向对象程序设计测试题9-对象之间的继承关系测试题
- Spring 4.3 的新功能和增强
- vs2017python配置opencv_关于VS2017配置OpenCV出现无法打开文件“opencv_ml249d.lib”的解决方案...
- 俄罗斯黑客被指攻击本国的工业组织机构
- 复合列NULL问题研究(转)
- OSG仿真案例(9)——JY61陀螺仪控制飞机姿态
- native method jvm
- contenttype类型_HTTP请求中,几种常见的ContentType类型解析
- 移动通信发展史及原理学习
- Oracle数据库阶段版本
- 干货|6个职场常用Excel技巧,千万不要错过呦!
- java 泰国_游记:泰国之旅
- 如何优雅地使用Sublime Text3
- 软件工程第五次作业——第二次结对编程
- 利用JavaScript生成点名册
- 前端HTML调用jQuery库,属性操作:更换图片、添加字体样式(前端:HTML搭配jQuery系列教程六)
热门文章
- NaN 是什么 NaN == NaN ?
- 科技感海报大合集,分分钟做出高端海报
- python实现自动打卡_python实现腾讯文档自动打卡教程
- 【硬盘】2021-希捷叠瓦盘(SMR)、垂直盘(CMR/PMR)型号、容量大全
- 基于石墨烯的光电探测传感器研究
- Delphi操作Word,Excel替换
- JVM 1.8 永久代---元空间 的变动
- Sybil_attack (女巫攻击)
- 正则中的()、[]、{}
- JAVA入门Hwork,HBase Java编程入门教程