C#版本的训练AI模型软件

程序介绍文档

项目概述

HL.AI.train 是由深圳海蓝智能开发的AI模型训练与转换工具,版本号1.2.1.0。该程序基于Windows Forms构建,提供图形化界面支持YOLOv5和YOLOv8模型的训练配置、数据集管理以及PyTorch模型到ONNX格式的转换功能。程序支持CUDA GPU加速,并提供详细的日志系统以便监控训练过程 AssemblyInfo.cs

主页面

在这里插入图片描述
在这里插入图片描述

功能模块

1. 主界面与导航

程序主界面采用选项卡式布局,包含以下核心功能区域:

  • 系统设置(Formset) : 配置Anaconda环境、YOLOv5/v8路径、权重文件路径及训练设备(GPU/CPU)
  • YOLOv5训练(V5) : 数据集管理、类别编辑和训练参数配置
  • YOLOv8训练(V8) : 与V5模块功能类似,针对YOLOv8模型优化
  • 模型转换(Pt_onnx) : 将PyTorch模型(.pt)转换为ONNX格式
    主界面实现位于 Index.cs ,通过TabControl控件组织各个功能模块。
   public partial class Index : Form{private V5 V5 { get; set; } = new V5();private V8 V8 { get; set; } = new V8();private Formset Formset { get; set; } = new Formset();private Pt_onnx Pt_onnx { get; set; } = new Pt_onnx();public Index(){InitializeComponent();CheckForIllegalCrossThreadCalls = false; // 允许跨线程访问控件LssTools.MetroRichTextBox = richTextBox1;MyTraceListener myTraceListener = new MyTraceListener(richTextBox1);Debug.Listeners.Add(myTraceListener);}private void Index_Load(object sender, EventArgs e){Formset.Dock = DockStyle.Fill;TabPageset.Controls.Add(Formset);V5.Dock = DockStyle.Fill;TabPageV5.Controls.Add(V5);V8.Dock = DockStyle.Fill;TabPageV8.Controls.Add(V8);Pt_onnx.Dock = DockStyle.Fill;TabPagePT_ONNX.Controls.Add(Pt_onnx);poisonTabControl1.SelectedIndex = 0;}}

2. 数据集管理

Dataset.cs 提供数据集处理核心功能:

  • 支持COCO格式数据集,自动检测images和labels文件夹结构
  • 实现训练集/验证集/测试集自动分割(默认比例可通过滑块调整)
  • 内置80种常见物体类别名称映射(person, bicycle, car等)
  • 提供类别名称编辑功能,可通过 Edit_ini.cs 修改标签文件中的类别ID
  public partial class Edit_ini : Form{private string Paths { set; get; }public List<int> Ints { set; get; } = new List<int>();public Edit_ini(List<int> ints, string path){Paths = path;Ints = ints;InitializeComponent();int k = 0;dataGridView1.Rows.Clear();foreach (int i in ints){dataGridView1.Rows.Add(k++, i.ToString());}}private void button2_Click(object sender, EventArgs e){this.DialogResult = DialogResult.Cancel;this.Close();}private void button1_Click(object sender, EventArgs e){for (int i = 0; i < Ints.Count; i++){if (dataGridView1.Rows[i].Cells[1].Value.ToString() == Ints[i].ToString()){continue;}else{foreach (string filePath in Directory.EnumerateFiles(Paths, "*.*", SearchOption.AllDirectories)){string fileExtension = Path.GetExtension(filePath).ToLower();if (fileExtension == ".txt"){string[] lines = File.ReadAllLines(filePath);int index = 0;foreach (string line in lines){string[] parts = line.Split(' ');if (int.Parse(parts[0]) == Ints[i]){lines[index] = line.Replace(Ints[i].ToString(), dataGridView1.Rows[i].Cells[1].Value.ToString());}index++;}File.WriteAllLines(filePath, lines);}}}}this.DialogResult = DialogResult.OK;this.Close();}}

3. 模型训练配置

V5和V8模块分别对应YOLOv5和YOLOv8模型的训练配置:

  • 数据集路径选择与有效性验证
  • 类别数量自动检测与显示
  • 训练参数可视化配置
  • 支持GPU/CPU训练设备自动检测与切换 Formset.cs
  public Formset(){InitializeComponent();}private void Formset_Load(object sender, EventArgs e){var temp = LssTools.Read_json("Setsystem.json");if (temp.Item1 == false){LssTools.LSSMessageTip.Showwaing("读取配置文件失败,可能是文件不存在或格式错误。");return;}var Setfile = temp.Item3;if (Setfile.Count != 0){LssTools.Anacondapath = Setfile["Anacondapath"].ToString();LssTools.Yolov5path = Setfile["Yolov5path"].ToString();LssTools.Weightsv5path = Setfile["Weightsv5path"].ToString();LssTools.Yolov8path = Setfile["Yolov8path"].ToString();LssTools.Weightsv8path = Setfile["Weightsv8path"].ToString();LssTools.DOS = Setfile["DOS"].ToString();TextBoxEditA3.Text = LssTools.Anacondapath;TextBoxEditY5.Text = LssTools.Yolov5path;TextBoxEditY8.Text = LssTools.Yolov8path;TextBoxEditWEIV5.Text = LssTools.Weightsv5path;TextBoxEditWEIV8.Text = LssTools.Weightsv8path;ComboBoxDOS.SelectedIndex = LssTools.DOS.Equals("activate") ? 0 : 1; // 默认选择第一个选项,如果DOS为空则选择第二个选项}else{LssTools.LSSMessageTip.Showwaing("读取配置文件失败,可能是文件不存在或格式错误。");}if (LssTools.HasCudaGPU()){LssTools.WriteLine("检测到CUDA GPU,默认使用GPU进行训练。");GPU_CPU.SelectedIndex = 0; // 如果有CUDA GPU,默认选择GPULssTools.CPU_GPUV5 = "--device 0 "; // 使用GPULssTools.CPU_GPUV8 = ""; // 使用GPU}else{LssTools.WriteLine("未检测到CUDA GPU,默认使用CPU进行训练。");GPU_CPU.SelectedIndex = 1; // 如果没有CUDA GPU,默认选择CPULssTools.CPU_GPUV5 = ""; // 使用CPULssTools.CPU_GPUV8 = "#"; // 使用CPU}   }private void ButtonAPPID_Click(object sender, EventArgs e){if (string.IsNullOrEmpty(TextBoxEditA3.Text) || string.IsNullOrEmpty(TextBoxEditY5.Text) || string.IsNullOrEmpty(TextBoxEditWEIV5.Text) || string.IsNullOrEmpty(TextBoxEditY8.Text) || string.IsNullOrEmpty(TextBoxEditWEIV8.Text)){LssTools.LSSMessageTip.Showwaing("请先设置Anaconda3、yolov和weights路径,不能为空");return;}LssTools.WriteLine("正在保存配置文件...");if (GPU_CPU.Text.Equals("GPU")){LssTools.CPU_GPUV5 = "--device 0 "; // 使用GPULssTools.CPU_GPUV8 = ""; // 使用GPU}else{LssTools.CPU_GPUV5 = ""; // 使用CPULssTools.CPU_GPUV8 = "#"; // 使用CPU}var result = LssTools.Writer_json("Anacondapath#Yolov5path#Weightsv5path#Yolov8path#Weightsv8path#DOS",$"{TextBoxEditA3.Text}#{TextBoxEditY5.Text}#{TextBoxEditWEIV5.Text}#{TextBoxEditY8.Text}#{TextBoxEditWEIV8.Text}#{ComboBoxDOS.Text}", true, "Setsystem.json");if (result.Item1 == false){LssTools.LSSMessageTip.Showwaing("保存路径失败:" + result.Item2);LssTools.WriteLine("保存路径失败:" + result.Item2);return;}else{LssTools.LSSMessageTip.Showok("配置文件保存成功!");LssTools.WriteLine("配置文件保存成功...");}}private void Button_open_Click(object sender, EventArgs e){using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog()){if (folderBrowserDialog.ShowDialog() == DialogResult.OK){var button = sender as MaterialButton;if (button == null){LssTools.LSSMessageTip.Showwaing("按钮类型错误,请检查代码。");LssTools.WriteLine("按钮类型错误,请检查代码。");return;}switch (button.Name){case "materialButton1":LssTools.Anacondapath = folderBrowserDialog.SelectedPath;TextBoxEditA3.Text = LssTools.Anacondapath;LssTools.LSSMessageTip.Showok("Anaconda3路径设置成功!");LssTools.WriteLine("Anaconda3路径设置成功");break;case "materialButton2":LssTools.Yolov5path = folderBrowserDialog.SelectedPath;TextBoxEditY5.Text = LssTools.Yolov5path;LssTools.LSSMessageTip.Showok("yolov5路径设置成功!");LssTools.WriteLine("yolov5路径设置成功");break;case "materialButton3":LssTools.Yolov8path = folderBrowserDialog.SelectedPath;TextBoxEditY8.Text = LssTools.Yolov8path;LssTools.LSSMessageTip.Showok("yolov8路径设置成功!");LssTools.WriteLine("yolov8路径设置成功");break;case "materialButton4":LssTools.Weightsv5path = folderBrowserDialog.SelectedPath;TextBoxEditWEIV5.Text = LssTools.Weightsv5path;LssTools.LSSMessageTip.Showok("yolov5权重路径设置成功!");LssTools.WriteLine("yolov5权重路径设置成功");break;case "materialButton5":LssTools.Weightsv8path = folderBrowserDialog.SelectedPath;TextBoxEditWEIV8.Text = LssTools.Weightsv8path;LssTools.LSSMessageTip.Showok("yolov8权重路径设置成功!");LssTools.WriteLine("yolov8权重路径设置成功");break;default:LssTools.LSSMessageTip.Showok("未知按钮,请检查代码。");LssTools.WriteLine("未知按钮,请检查代码");break;}}else{LssTools.LSSMessageTip.Showwaing("您取消了,选择路径操作");}}}}

4. 模型格式转换

Pt_onnx.cs 实现PyTorch模型到ONNX格式的转换:

  • 通过命令行调用Python脚本执行转换
  • 实时进度显示与结果提示
  • 支持自定义模型路径和输出目录
    转换脚本示例:
    from ultralytics import YOLO model = YOLO(r'{path}') model.export(format='onnx')

5. 系统工具与日志

LssTools.cs 提供核心工具功能:

  • JSON配置文件读写(Setsystem.json)
  • CUDA GPU检测与信息显示
  • 日志输出与RichTextBox控件绑定
  • 跨线程安全的UI操作
    MyTraceListener.cs 实现自定义日志监听,将调试信息实时输出到界面。

技术架构

开发环境

  • 框架 : .NET Framework 4.8.1 App.config
  • UI组件 : ReaLTaiizor 3.8.1.2(现代化Windows Forms控件库)
  • 数据处理 : Newtonsoft.Json 13.0.3(JSON序列化/反序列化)
  • CUDA支持 : ManagedCuda-100 10.0.31(GPU加速训练)

项目结构

HL.AI.train/
├── Model/              # YOLOv5/v8模型
相关实现
│   ├── V5.cs           # YOLOv5训练模块
│   └── V8.cs           # YOLOv8训练模块
├── Properties/         # 程序集信息
├── App.config          # 应用配置
├── Dataset.cs          # 数据集处理
├── Formset.cs          # 系统设置界面
├── LssTools.cs         # 工具类库
├── Pt_onnx.cs          # 模型转换模块
└── Program.cs          # 应用入口

安装与配置

环境要求

  • Windows操作系统
  • .NET Framework 4.8.1运行时
  • Anaconda3环境(用于Python脚本执行)
  • CUDA Toolkit(可选,用于GPU加速)
  • YOLOv5/v8项目文件

首次配置步骤

  1. 启动程序后,在"系统设置"选项卡配置以下路径:
    • Anaconda3安装路径
    • YOLOv5项目路径
    • YOLOv8项目路径
    • 权重文件路径
  2. 选择训练设备(GPU/CPU)
  3. 点击"保存配置"按钮完成初始化

使用指南

数据集准备

  1. 在V5/V8选项卡点击"选择数据集路径"
  2. 确保数据集目录包含images和labels子文件夹
  3. 程序自动检测类别数量和匹配的图像-标签对
  4. 如需修改类别名称,点击"编辑类别名称"按钮进行调整

模型训练

  1. 设置训练集/验证集/测试集比例
  2. 配置训练参数(隐含在UI操作中)
  3. 点击开始训练按钮(具体按钮名称需根据界面确定)
  4. 通过底部日志区域监控训练进度

模型转换

  1. 在Pt_onnx选项卡设置:
    • PT文件所在位置
    • ONNX激活项目集路径
  2. 点击"转换"按钮
  3. 查看转换进度和结果提示

版本历史

  • v1.2.1.0 : 当前版本,支持YOLOv5/v8训练和模型转换

软件相关截图

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

新手向:从零理解LTP中文文本处理

如果你想了解计算机如何处理中文文本&#xff0c;这篇博客就是为你准备的。我们将通过一个真实的代码案例&#xff0c;深入浅出地解析中文分词技术&#xff0c;保证每一步都讲得明明白白&#xff01; 什么是中文分词&#xff1f; 想象你读英文句子时&#xff0c;单词之间有空…

图像采集卡选型详细指南

选择图像采集卡是构建机器视觉或图像处理系统的关键一步&#xff0c;需要综合考虑硬件接口、性能需求、软件兼容性、应用场景等多个维度。以下是详细的选型指南&#xff0c;帮助你做出明智决策&#xff1a;一、核心选型因素1. 相机接口匹配常见工业相机接口&#xff1a;GigE Vi…

核心网络协议的深度解析

1. IP协议&#xff08;网际层核心&#xff09;&#xff08;1&#xff09;IPv4 vs IPv6特性IPv4IPv6地址长度32位&#xff08;约42亿地址&#xff09;128位&#xff08;3.410⁸地址&#xff09;表示方法点分十进制&#xff08;如192.168.1.1&#xff09;冒号分隔十六进制&#x…

Nexus zkVM 3.0 及未来:迈向模块化、分布式的零知识证明

1. 引言 2025年3月&#xff0c;Nexus团队发布了 Nexus zkVM 3.0&#xff0c;本文将更详细地介绍其设计意图与功能。 零知识虚拟机&#xff08;zkVM&#xff09;领域正在迅速演进&#xff0c;推动力来自于对可扩展、高效且可靠的系统的需求——这些系统应能够在不受计算规模、…

thinkphp使用redis抢单实例

问题&#xff1a;当客户预约时产生一个订单&#xff0c;该订单需要业务人员抢单后跟进一&#xff0c;产生订单时设置redis$redis new Redis(); $ydkey "yyqd_".$insertId; $exptime 600;//过期时间 600秒 $redis->lpush($ydkey,$$data);//压入订单ID $redis-&g…

Java SE--继承

一.为什么要继承呢&#xff1f;可以保持原有类的功能上扩展新功能&#xff0c;继承主要解决的问题是共性的抽取&#xff0c;实现代码的复用二.继承的语法举例&#xff1a;相关图像&#xff1a;三.父类成员访问1.子类中&#xff08;注意&#xff09;访问父类的成员变量了解原因&…

掌握 Winget 安装:从 Microsoft Store 到 winget-install 脚本的完整方案

掌握 Winget 安装&#xff1a;从 Microsoft Store 到 winget-install 脚本的完整方案 Winget 作为 Windows 官方推出的命令行包管理工具&#xff0c;能极大简化软件的安装、升级与卸载流程。本文将系统梳理从官方渠道到第三方工具的多种安装方式&#xff0c;涵盖普通用户、开发…

简单来说:Redis的增量同步是怎么一回事

简单来说&#xff1a; 增量同步就是Master 只把比 Slave 新的数据发给 Slave&#xff0c;而不是发送全部数据。它像一个持续更新的直播流&#xff0c;或者我之前比喻的“每日更新期刊”。Slave 不用重新加载所有数据&#xff0c;只需要接收和应用这些新的更新。 这就像&#xf…

MySQL 安全优化指南:保护你的数据库免受攻击

在当今高度互联的数字世界中,数据是企业的核心资产,而数据库则是存储这些资产的堡垒。作为最流行的开源关系型数据库之一,MySQL 被广泛应用于各种业务场景。然而,其普及性也使其成为网络攻击者青睐的目标。一旦数据库被攻破,可能导致敏感数据泄露、业务中断、声誉受损,甚…

界面控件Telerik UI for WinForms 2025 Q2亮点 - 支持.NET 10 Preview

随着2025年第二季度新版本的发布&#xff0c;Progress Telerik通过流行的集成IDE的AI编码助手&#xff0c;基于提示的样式和基于GenAI的报表见解重新定义了开发人员的工作效率&#xff01; Telerik和Kendo UI在构建尖端应用程序时继续推动开发人员工作效率提升&#xff0c;202…

DVWA靶场通关笔记-验证码绕过reCAPTCHA(Medium级别)

目录 一、reCAPTCHA 二、代码审计&#xff08;Medium级别&#xff09; 1、渗透准备 &#xff08;1&#xff09;配置security为Medium级别。 &#xff08;2&#xff09;配置RECAPTCHA参数 &#xff08;3&#xff09;再次打开靶场 2、源码分析 &#xff08;1&#xff09;…

人工智能安全基础复习用:对抗样本检测与防御

一、对抗样本&#xff08;Adversarial Examples&#xff09;定义&#xff1a;对输入样本添加人眼无法察觉的细微干扰&#xff0c;导致模型以高置信度输出错误结果。对抗样本的分布通常偏离自然数据分布&#xff0c;与正常样本在模型中间层/输出层的分布存在差异。核心目标&…

[数学基础] 矩阵的秩及其应用

深入浅出&#xff1a;矩阵的秩及其应用 文章目录深入浅出&#xff1a;矩阵的秩及其应用一、数学定义二、核心作用三、计算方法与步骤方法1&#xff1a;高斯消元法&#xff08;最常用&#xff09;方法2&#xff1a;奇异值分解&#xff08;SVD&#xff09;方法3&#xff1a;行列式…

LKH-3算法求解TSP问题基本原理与应用

通俗理解LKH-3算法 LKH-3&#xff08;Lin-Kernighan-Helsgaun&#xff09;是求解**旅行商问题&#xff08;TSP&#xff09;**的最强启发式算法之一&#xff0c;由丹麦计算机科学家Keld Helsgaun在LKH-2基础上改进而来。它的核心思想是&#xff1a;通过智能的“局部破坏与修复”…

游戏开发学习记录

初始化只是第一次实例化的时候调用&#xff0c;show和unshow是打开界面和关闭界面的时候&#xff0c;会多次调用 在一个脚本里面show是每一次打开界面的时候需要做的事情&#xff0c;而Init是初始化。UIMgr里面的数据结构&#xff1a;为什么我要先从数据结构入手呢&#xff1f;…

一级缓存与二级缓存深度剖析:作用域、配置与同步方案全解析

引言 在分布式系统与高并发场景下&#xff0c;缓存机制已成为提升系统性能的关键技术。本文从作用域、失效机制、配置实践到同步方案&#xff0c;系统化解析一级缓存与二级缓存的核心差异与工程实践。 一、一级缓存&#xff1a;会话级数据加速器 1.1 作用域与生命周期 作用域&a…

OneCode MQTT插件开发实战:基于Paho.Client的物联网通信解决方案

引言 在物联网应用开发中&#xff0c;MQTT协议因其轻量、低带宽占用的特性被广泛采用。OneCode平台提供的xui.MQTT插件基于Eclipse Paho.Client实现了完整的MQTT通信能力&#xff0c;本文将从插件用途、核心实现、开发要点和功能扩展四个维度&#xff0c;详解如何基于该插件构建…

1.1_5_1 计算机网络的性能指标(上)

在这个小节中我们要学习计算机网络的性能指标&#xff0c;我们在考研当中主要掌握这样的七个性能指标&#xff0c;分别是速率、带宽、吞吐量、时延、时延带宽积、往返时延和信道利用率。我会把相关性比较紧密的性能指标放在一起讲解。在这个视频中&#xff0c;我们先来学习前三…

Python 性能优化指南:深入剖析代码分析与优化工具

Python 性能优化指南:深入剖析代码分析与优化工具 在 Python 的广泛应用场景中,性能优化既是挑战,也是机遇。无论是构建 Web 应用还是处理数据分析,理解代码性能瓶颈并有效优化至关重要。本文将探讨 Python 代码性能分析的核心方法,并逐步解析关键工具的使用技巧,带您从…

力扣打卡第二十一天 中后遍历+中前遍历 构造二叉树

106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postor…