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,默认选择GPU
                LssTools.CPU_GPUV5 = "--device 0 "; // 使用GPU
                LssTools.CPU_GPUV8 = ""; // 使用GPU
            }
            else
            {
                LssTools.WriteLine("未检测到CUDA GPU,默认使用CPU进行训练。");
                GPU_CPU.SelectedIndex = 1; // 如果没有CUDA GPU,默认选择CPU
                LssTools.CPU_GPUV5 = ""; // 使用CPU
                LssTools.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 "; // 使用GPU
                LssTools.CPU_GPUV8 = ""; // 使用GPU
            }
            else
            {
                LssTools.CPU_GPUV5 = ""; // 使用CPU
                LssTools.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训练和模型转换

软件相关截图

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

️公子

有帮助的,请多支持我哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值