程序介紹文檔
項目概述
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訓練和模型轉換
軟件相關截圖