程序介绍文档
项目概述
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项目文件
首次配置步骤
- 启动程序后,在"系统设置"选项卡配置以下路径:
- Anaconda3安装路径
- YOLOv5项目路径
- YOLOv8项目路径
- 权重文件路径
- 选择训练设备(GPU/CPU)
- 点击"保存配置"按钮完成初始化
使用指南
数据集准备
- 在V5/V8选项卡点击"选择数据集路径"
- 确保数据集目录包含images和labels子文件夹
- 程序自动检测类别数量和匹配的图像-标签对
- 如需修改类别名称,点击"编辑类别名称"按钮进行调整
模型训练
- 设置训练集/验证集/测试集比例
- 配置训练参数(隐含在UI操作中)
- 点击开始训练按钮(具体按钮名称需根据界面确定)
- 通过底部日志区域监控训练进度
模型转换
- 在Pt_onnx选项卡设置:
- PT文件所在位置
- ONNX激活项目集路径
- 点击"转换"按钮
- 查看转换进度和结果提示
版本历史
- v1.2.1.0 : 当前版本,支持YOLOv5/v8训练和模型转换
软件相关截图