C#调用Python脚本训练并生成AI模型(以Paddle框架为例)

news2024/9/24 7:15:57

目录

  • 一. IronPython语言移植
    • 1.1 IronPython安装
    • 1.2 示例代码
    • 1.3 运行结果
    • 1.4 特点
  • 二. C#调用Python文件打包dll
    • 2.1 步骤
    • 2.2 限制
  • 三. C#命令行调用.py文件执行
    • 3.1 代码
    • 3.3 运行结果
    • 3.4 特点
  • 四. C#调用Python可执行exe
  • 4.1 步骤
      • 4.1.1 使用pyinstaller打包python程序
      • 4.1.2 在c#中调用此exe文件
  • 4.2 特点

在平常工程项目开发过程中常常会涉及到机器学习、深度学习算法方面的开发任务,但是受限于C#等语言官方并没有提供预编译包,因此需要通过嵌入代码、调用dll、调用exe等方式。本文总结C#调用Python脚本训练并生成AI模型的各种方法。
环境说明:

CPU:AMD5800 8core 16Thread
GPU:NVIDIA GTX1080Ti
OS:Windows10 专业版
Visual Studio 2019 : .NET SDK 6.0.402(x64)
Windows SDK:Windows 10.0.19041.685

一. IronPython语言移植

1.1 IronPython安装

IronPython 是一种在 NET 和 Mono 上实现的 Python 语言,用于将更多的动态语音移植到NET Framework上。
需要从Visual Studio上打开,安装方式:工具-> NuGet包管理器->管理解决方案的NuGet程序包->搜索框输入IronPython ->选择项目后电点击安装在这里插入图片描述

1.2 示例代码

CSharpCallPython.cs(C#控制台程序)

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System;
 
namespace CSharpCallPython
{
    class Program
    {
        static void Main(string[] args)
        {
            ScriptEngine pyEngine = Python.CreateEngine();//创建Python解释器对象
            dynamic py = pyEngine.ExecuteFile(@"test.py");//读取脚本文件
            int[] array = new int[9] { 9, 3, 5, 7, 2, 1, 3, 6, 8 };
            string reStr = py.main(array);//调用脚本文件中对应的函数
            Console.WriteLine(reStr);
 
            Console.ReadKey();
        }
    }
}

Python文件test.py需要放在项目的bin/Debug也就是生成exe的目录下:
在这里插入图片描述
test.py

def main(arr):
    try:
        arr = set(arr)
        arr = sorted(arr)
        arr = arr[0:]
        return str(arr)
    except Exception as err:
        return str(err)

1.3 运行结果

在这里插入图片描述

1.4 特点

ironPython安装包仅适用于python脚本中不包含第三方模块的情况,且需要客户机上有Python环境

二. C#调用Python文件打包dll

2.1 步骤

2.2 限制

实现方式很复杂,并且受python版本、(python/vs)32/64位影响,而且要求用户必须有python运行环境

三. C#命令行调用.py文件执行

3.1 代码

AI模型这里使用Paddle框架的PaddleX工具快速训练并生成模型文件(以蔬菜分类为例),有关PaddleX的使用详见我的《深度学习》专栏。
Test.cs(C#控制台程序)

using System;
using System.Collections;
using System.Diagnostics;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Process p = new Process();
            string path = @"E:\Fileresipority\project\LeiKe\Demo02\Demo02\bin\Debug\reset_ipc.py";//待处理python文件的路径,本例中放在debug文件夹下
            string sArguments = path;
            p.StartInfo.FileName = @"D:\Anaconda\envs\paddle2.2\python.exe"; //PaddleX环境中对应python3.7的安装路径
            p.StartInfo.Arguments = sArguments;//python命令的参数
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();//启动进程

            Console.WriteLine("执行完毕!");

            Console.ReadKey();
        }
    }
}

reset_ipc.py

import paddle
import paddlex as pdx
from paddlex import transforms as T



# 定义训练和验证时的transforms
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/transforms/transforms.md
train_transforms = T.Compose(
    [T.RandomCrop(crop_size=224), T.RandomHorizontalFlip(), T.Normalize()])

eval_transforms = T.Compose([
    T.ResizeByShort(short_size=256), T.CenterCrop(crop_size=224), T.Normalize()
])

# 定义训练和验证所用的数据集
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/datasets.md
train_dataset = pdx.datasets.ImageNet(
    data_dir='../vegetables_cls/',
    file_list='../vegetables_cls/train_list.txt',
    label_list='../vegetables_cls/labels.txt',
    transforms=train_transforms,
    shuffle=True)

eval_dataset = pdx.datasets.ImageNet(
    data_dir='../vegetables_cls/',
    file_list='../vegetables_cls/val_list.txt',
    label_list='../vegetables_cls/labels.txt',
    transforms=eval_transforms)

# 初始化模型,并进行训练
# 可使用VisualDL查看训练指标,参考https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/visualdl.md
num_classes = len(train_dataset.labels)
model = pdx.cls.MobileNetV3_large(num_classes=num_classes)

# 自定义优化器:使用CosineAnnealingDecay
train_batch_size = 32
num_steps_each_epoch = len(train_dataset) // train_batch_size
num_epochs = 10
scheduler = paddle.optimizer.lr.CosineAnnealingDecay(
    learning_rate=.001, T_max=num_steps_each_epoch * num_epochs)
warmup_epoch = 5
warmup_steps = warmup_epoch * num_steps_each_epoch
scheduler = paddle.optimizer.lr.LinearWarmup(
    learning_rate=scheduler,
    warmup_steps=warmup_steps,
    start_lr=0.0,
    end_lr=.001)
custom_optimizer = paddle.optimizer.Momentum(
    learning_rate=scheduler,
    momentum=.9,
    weight_decay=paddle.regularizer.L2Decay(coeff=.00002),
    parameters=model.net.parameters())

# API说明:https://github.com/PaddlePaddle/PaddleX/blob/95c53dec89ab0f3769330fa445c6d9213986ca5f/paddlex/cv/models/classifier.py#L153
# 各参数介绍与调整说明:https://paddlex.readthedocs.io/zh_CN/develop/appendix/parameters.html
model.train(
    num_epochs=num_epochs,
    train_dataset=train_dataset,
    train_batch_size=train_batch_size,
    eval_dataset=eval_dataset,
    optimizer=custom_optimizer,
    save_dir='output/mobilenetv3_large',
    use_vdl=True)

3.3 运行结果

在这里插入图片描述

3.4 特点

优点:适用于python脚本中包含第三方模块的情况,且执行速度只比在python本身环境中慢一点,步骤也相对简单。
缺点:需要用户有python环境

四. C#调用Python可执行exe

4.1 步骤

使用命令行进行传参取返回值

4.1.1 使用pyinstaller打包python程序

4.1.2 在c#中调用此exe文件

4.2 特点

优点:无需安装python运行环境
缺点:
1、可能是因为要展开exe中包含的python环境,执行速度很慢
2、因为是命令行传参形式,需要手动传参:。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98250.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

入门:手动构建镜像

前面我们已经了解了Docker镜像的结构,实际上所有常用的应用程序都有对应的镜像,我们只需要下载这些镜像然后就可以使用了,而不需要自己去手动安装,顶多需要进行一些特别的配置。当然要是遇到某些冷门的应用,可能没有提…

【细胞分割】中值滤波+分水岭法细胞计数【含Matlab源码 640期】

⛄一、图像分割简介 理论知识参考:【基础教程】基于matlab图像处理图像分割【含Matlab源码 191期】 ⛄二、部分源代码 clear; close all; %------------------ %程序中定义图像变量说明 %Image->原图变量; %Image_BW->二值化图象; %Image_BW_medfilt->中…

【实时数仓】DWM层跳出明细计算之需求分析、读取数据、通过Flink的CEP完成跳出判断、写回kafka、测试

文章目录一 DWM层-跳出明细计算1 需求分析与思路(1)什么是跳出(2)计算跳出行为的思路(3)实现思路2 读取数据(1)代码编写(2)测试3 通过Flink的CEP完成跳出判断…

【MATLAB100个实用小技巧】——数值分析(85-100)

文章目录前言系列文章85.86. 三次样条插值法87. NEWTON 插值88. hermite 插值89. newton 形式的 hermite 插值90. 平方根法91. gauss 消去法92. 三角分解法93. jacobi 迭代法94. gauss 迭代法95. sor 迭代法96. 最速下降法97. 共额梯度法98. newton 迭代法99. broyden 迭代法10…

前端媒体查询@media示例详解和calc()函数的使用

媒体查询media media 可以针对不同的屏幕尺寸设置不同的样式,特别是如果需要设置设计响应式的页面,media 是非常有用的。当重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面。 eg:如果文档宽度小于 500 像素…

pytorch 自编码器实现图像的降噪

自编码器 自动编码器是一种无监督的深度学习算法,它学习输入数据的编码表示,然后重新构造与输出相同的输入。它由编码器和解码器两个网络组成。编码器将高维输入压缩成低维潜在(也称为潜在代码或编码空间) ,以从中提取最相关的信息&#xff…

SpringCloud之Hystrix

复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免失败! 服务雪崩 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的“…

HttpRunner3.x 安装与使用

HttpRunner3.x 安装与使用HttpRunner3.x 安装与使用安装使用运行脚手架项目方式一:录制生成用例步骤1:导出har文件步骤2:转化成测试用例文件har2casehmake步骤3:执行测试用例方式二:手工编写测试用例HttpRunner3.x 安装…

Jenkins自动部署springboot的Docker镜像,解决Status [1]问题

Jenkins凡是要指定路径的命令,一定要写绝对路径,不能写相对路径!不要以为配置了Remote directory,那么命令就会在Remote directory下执行!这种想法是错误的!!! 《jenkins自动化发布到…

机器学习实战教程(五):朴素贝叶斯实战篇

一、前言 上篇文章机器学习实战教程(四):朴素贝叶斯基础篇_M_Q_T的博客-CSDN博客讲解了朴素贝叶斯的基础知识。本篇文章将在此基础上进行扩展,你将看到以下内容: 拉普拉斯平滑垃圾邮件过滤(Python3)新浪新闻分类(skle…

毕业设计 - 基于Java的敬老院管理系统设计与实现【源码+论文】

文章目录前言一、项目设计1. 模块设计系统的主要功能性需求2. 实现效果二、部分源码项目源码前言 今天学长向大家分享一个 java web项目: 基于Java的敬老院管理系统设计与实现 一、项目设计 1. 模块设计 站在护工角度来看,他们迫切希望,在运用该系统…

【Flink】Flink Starting Offset 启动消费位置 指定时间消费

文章目录 1.概述2.测试3.源码1.概述 首先参考文章:【Flink】Flink 1.14.0 全新的 Kafka Connector Kafka Source 能够通过指定 OffsetsInitializer来消费从不同偏移量开始的消息。内置的初始值设定项包括: KafkaSource.builder()// Start from committed offset of the co…

【YOLOv7-环境搭建③】PyCharm安装和环境、解释器配置

下载链接: 来源:(博主)唐三. 链接:https://pan.baidu.com/s/1y6s_EScOqvraFcx7iPSy1g 提取码:m1oa 安装: 以管理员身份打开安装完成后,打开软件到达以下界面,框框全选到达以下界面&#xf…

【指纹识别】指纹识别匹配门禁系统【含GUI Matlab源码 587期】

⛄一、指纹识别简介 1 指纹识别的引入和原理 1.1 指纹的基本知识 指纹,由于其具有终身不变性、唯一性和方便性,已几乎成为生物特征识别的代名词。指纹是指人的手指末端正面皮肤上凸凹不平产生的纹线。纹线有规律的排列形成不同的纹型。纹线的起点、终点…

kotlin基础学习笔记第九章——泛型

实化类型参数允许你在运行时的内联函数中引用作为类型实参的具体类型(对普通的类和函数来说,这样行不通,因为类型实参在运行时会被擦除)。 声明点变型可以说明一个带类型参数的泛型类型,是否是另一个泛型类型的子类型或…

什么是MySQL插入意向锁?

Insert Intention Lock,中文我们也称之为插入意向锁。 这个可以算是对我们之前所讲的 Gap Lock 的一个补充,关于 Gap Lock,如果还有小伙伴不懂,可以参考:记录锁、间隙锁与 Next-Key Locks。 1. 为什么需要插入意向锁…

吃透Chisel语言.40.Chisel实战之单周期RISC-V处理器实现(下)——具体实现和最终测试

Chisel实战之单周期RISC-V处理器实现(下)——具体实现和最终测试 上一篇文章中我们对本项目的需求进行了分析,并得到了初步的设计,这一篇文章我们就可以基于该设计来实现我们的单周期RISC-V处理器了。实现之后也必须用实际代码来…

[ 数据结构 -- 手撕排序算法第三篇 ] 希尔排序

文章目录前言一、常见的排序算法二、希尔排序2.1 希尔排序(缩小增量排序)2.1.1 预排序阶段2.1.2 插入排序阶段2.2 单趟希尔排序2.2.1 思路分析三、希尔排序实现代码四、希尔排序的时间复杂度五、希尔排序和直接插入排序效率测试5.1 测试5.2 结论5.2.1 随机数比较5.2.2 有序数组…

【二维码识别】灰度+二值化+校正二维码生成与识别【含GUI Matlab源码 635期】

⛄一、二维码生成与识别简介 如今,移动互联网技术日新月异,随着5G时代的来临,广泛应用于数据处理过程中的二维码信息安全日益成为人们越来越关注的问题。以QR码为代表的二维码,以其在信息存储、传输和识别技术领域优异的表现,成为信息共享、移动支付等领域的宠儿。不可避免地,…

利用深度学习生成数据的时间序列预测(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 数据分析研究目前仍是行业热点,相关学者从数据分析关键技术中的异常检测、入侵检测、时间序列预测等角度展开研究。然而,现有研…