公司业务需要集成机器学习算法到上位机软件中,将仪器采集到的谱图和分析得到的数据进行建模,在新的样本到来时,进行目标值的预测。在大批量、检测精度要求不高、检测速度快的场合具有较高应用价值。C#在传统工控行业应用案例较多,机器学习主要用python语言。将python和C#混合编程在算法落地方面具有重要意义。
C#调用python代码主要有脚本调用、RPC远程调用、借助pythonnet库调用。脚本调用主要就是通过控制台启动python脚本,通过arg传入参数,之后再获取打印的字符,转化为我们需要的结果。缺点是可传递的参数有限、调用开销较大,使用场景有限。本文主要调研了三个RPC框架,分别是 GRPC,XMLRPC。其中 GRPC 是由 google开发的高性能通用的开源 RPC框架,主要面向移动应用开发目基于 HTTP/2协议标准而设计,支持大多数流行的编程语言。缺点是功能复杂,调用困难,框架占用体积较大,在小型软件中部署比较麻烦。XML-RPC 是基于 XII标准的RPC 协议,在 C#端Horizon XmlRpc 通讯包,Python 自带 SimpleXMLRPC 通讯包。现有XML-RPC协议较为简单,易于部署。综合比较,选择XML-RPC作为通讯框架。
详细代码
public interface IAddServiceProxy:IXmlRpcProxy, IPredict
{
}
public interface IPredict
{
///
/// Adds the numbers.
///
/// Sum of the numbers .
/// Summand a.
/// Summand b.
[XmlRpcMethod("Server.Predict")]
XmlRpcStruct Predict(double[] xAxis, double[] val);
[XmlRpcMethod("Server.Test")]
string Test(string input);
[XmlRpcMethod("Server.AutoModeling")]
string AutoModeling(string sampleInfo);
}
创建RPC Client
_proxy = XmlRpcProxyGen.Create<IAddServiceProxy>();
_proxy.Url = textBox1.Text;
def rpc_predict(xAyyay:[],yArray:[]) -> dict:
print('start measure')
data=np.array([xAyyay,yArray],dtype='float64')
predicts=Predict(data=data).predict_values()
result=dict()
for k,v in predicts.items():
result[str(k)]=str(v)
return result
if __name__ == '__main__':
server = SimpleXMLRPCServer(('localhost', 666))
server.register_function(rpc_predict, "getHelloWorld")
print('services start!')
server.serve_forever()
感想,这里的格式转换是个很麻烦的问题,只能传输double格式的数据,float是不行的,另外返回结果最好也是字符串化。数据格式支持string,int,double,数组,XmlRpcStruct,等基本类型。