对于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训练的模型)相关推荐

  1. C#使用公共语言拓展(CLE)调用Python3(tensorflow)

    对于Python2来说,使用IronPython可以方便的实现C#调用Python,但是对于特定需求,比如使用TensorFlow(最低支持Python3.5),就没办法使用IronPython了,为 ...

  2. 【opencv】调用caffe、tensorflow、darknet模型

    本文参考自:opencv调用cCaffe.TensorFlow.Torch.PyTorch训练好的模型 往往,当我们训练好一个模型后,就可以通过OpenCV加载模型使用该模型,完成分类和实时预测的任务 ...

  3. 如何用java语言调用tensorflow训练好的模型

    1.TensorFlow的训练模型在Android和Java的应用及调用 2.tensorflow的python离线训练java在线预测方案 3.tensorflow训练的模型在java中的使用 4. ...

  4. Java如何跨语言调用Python/R训练的模型

    在 如何使用sklearn进行在线实时预测(构建真实世界中可用的模型) 这篇文章中,我们使用 sklearn + flask 构建了一个实时预测的模型应用.无论是 sklearn 还是 flask,都 ...

  5. go语言调用python_Golang中调用Python3

    最近有一个项目需要在服务端调用Python3.7写的算法,网上找了一圈,发现两个库都使用cgo特性调用了Python的C-API: 针对Python2:https://github.com/sbine ...

  6. C#使用CLE调用python

    C#使用CLE调用Python 项目相关 入门 运行官方Demo 初始化服务与退出服务 C#代码 Python代码 遇到的问题 其他 CLE Object 设置输出回调 项目相关 工作需要使用C#调用 ...

  7. phpcmsV9 首页调用全站最新文章(受模型限制)

    phpcmsV9 首页调用全站最新文章数据的办法 在很多使用phpcmsV9框架的项目中,都会经常遇到首页调用全站最新文章的情况.这里讲解一篇.仅供参考. 首页调用 · 全站最新文章 查找文件:www ...

  8. 『论文笔记』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. ...

  9. ML之分类预测之ElasticNet之PLoR:在二分类数据集上调用Glmnet库训练PLoR模型(T2)

    ML之分类预测之ElasticNet之PLoR:在二分类数据集上调用Glmnet库训练PLoR模型(T2) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 for iStep in ...

最新文章

  1. Google邮局可以实时开通了
  2. SAP UI5 的 sap-ui-bootstrap script 脚本标签各属性解析
  3. 男生的哪个“不要”是真的不要?
  4. 869. 重新排序得到 2 的幂
  5. 【面向对象】面向对象程序设计测试题9-对象之间的继承关系测试题
  6. Spring 4.3 的新功能和增强
  7. vs2017python配置opencv_关于VS2017配置OpenCV出现无法打开文件“opencv_ml249d.lib”的解决方案...
  8. 俄罗斯黑客被指攻击本国的工业组织机构
  9. 复合列NULL问题研究(转)
  10. OSG仿真案例(9)——JY61陀螺仪控制飞机姿态
  11. native method jvm
  12. contenttype类型_HTTP请求中,几种常见的ContentType类型解析
  13. 移动通信发展史及原理学习
  14. Oracle数据库阶段版本
  15. 干货|6个职场常用Excel技巧,千万不要错过呦!
  16. java 泰国_游记:泰国之旅
  17. 如何优雅地使用Sublime Text3
  18. 软件工程第五次作业——第二次结对编程
  19. 利用JavaScript生成点名册
  20. 前端HTML调用jQuery库,属性操作:更换图片、添加字体样式(前端:HTML搭配jQuery系列教程六)

热门文章

  1. NaN 是什么 NaN == NaN ?
  2. 科技感海报大合集,分分钟做出高端海报
  3. python实现自动打卡_python实现腾讯文档自动打卡教程
  4. 【硬盘】2021-希捷叠瓦盘(SMR)、垂直盘(CMR/PMR)型号、容量大全
  5. 基于石墨烯的光电探测传感器研究
  6. Delphi操作Word,Excel替换
  7. JVM 1.8 永久代---元空间 的变动
  8. Sybil_attack (女巫攻击)
  9. 正则中的()、[]、{}
  10. JAVA入门Hwork,HBase Java编程入门教程