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