YOLOv5免环境训练工具 懒人精灵yolov5免环境训练工具 使用懒人精灵官方代码即可直接调用,小白也能轻松上手,内部封装cuda114使用GPU训练

张开发
2026/5/4 17:27:12 15 分钟阅读
YOLOv5免环境训练工具 懒人精灵yolov5免环境训练工具 使用懒人精灵官方代码即可直接调用,小白也能轻松上手,内部封装cuda114使用GPU训练
智慧训练工具懒人精灵yolov5免环境训练工具可一键导出懒人精灵调用例子导出后直接导入懒人使用懒人精灵官方代码即可直接调用小白也能轻松上手内部封装cuda114使用GPU训练附带使用教程支持懒人精灵Yolo调用无需搭建Python环境和安装CUDA下载解压即可使用。一键训练支持yolov5n、yolov5s、yolov5m、yolov5l、yolov5x还支持pt模型一键转onnx和ncnn模型这个工具的核心逻辑在于封装环境自带Python/CUDA、自动化配置一键生成yaml、调用Ultralytics API进行训练以及模型格式转换。以下是构建这个系统的核心代码模块。项目目录结构YOLOv5_Trainer_Tool/ ├── main.py # 主程序入口 (GUI界面) ├── trainer.py # 训练逻辑封装 (调用YOLOv5) ├── converter.py # 模型转换逻辑 (PT转ONNX/NCNN) ├── requirements.txt # 依赖库 └── assets/ # 图标等资源核心代码实现1. 主界面与逻辑控制可视化界面代码使用了PyQt5来构建窗口并处理“一键生成”、“开始训练”等按钮逻辑。# main.pyimportsysimportosfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QWidget,QVBoxLayout,QHBoxLayout,QLabel,QLineEdit,QPushButton,QComboBox,QFileDialog,QMessageBox,QCheckBox)fromtrainerimportYOLOv5TrainerfromconverterimportModelConverterclassYOLOv5Tool(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(YOLOv5免环境训练工具 - YOLO之神)self.setGeometry(100,100,800,600)# 初始化逻辑类self.trainerYOLOv5Trainer()self.converterModelConverter()self.init_ui()definit_ui(self):central_widgetQWidget()self.setCentralWidget(central_widget)layoutQVBoxLayout()# --- 第一部分数据集路径 ---path_layoutQHBoxLayout()self.path_inputQLineEdit()btn_browseQPushButton(浏览)btn_browse.clicked.connect(self.browse_folder)path_layout.addWidget(QLabel(标注文件夹:))path_layout.addWidget(self.path_input)path_layout.addWidget(btn_browse)layout.addLayout(path_layout)# --- 第二部分参数配置 ---# Batch Sizelayout.addWidget(QLabel(batch_size:))self.input_batchQLineEdit(16)layout.addWidget(self.input_batch)# Epochslayout.addWidget(QLabel(epochs:))self.input_epochsQLineEdit(1000)layout.addWidget(self.input_epochs)# Devicelayout.addWidget(QLabel(device (0 for GPU, cpu for CPU):))self.input_deviceQLineEdit(0)layout.addWidget(self.input_device)# Image Sizesize_layoutQHBoxLayout()self.input_widthQLineEdit(640)self.input_heightQLineEdit(640)size_layout.addWidget(QLabel(Width:));size_layout.addWidget(self.input_width)size_layout.addWidget(QLabel(Height:));size_layout.addWidget(self.input_height)layout.addLayout(size_layout)# Classes (nc)layout.addWidget(QLabel(nc (类别数量):))self.input_ncQLineEdit(10)layout.addWidget(self.input_nc)# Workerslayout.addWidget(QLabel(workers:))self.input_workersQLineEdit(0)layout.addWidget(self.input_workers)# Train/Valid Splitlayout.addWidget(QLabel(train:valid ratio:))self.input_splitQLineEdit(0.2)layout.addWidget(self.input_split)# --- 第三部分模型选择与操作 ---model_layoutQHBoxLayout()model_layout.addWidget(QLabel(选择模型配置 cfg:))self.combo_modelQComboBox()self.combo_model.addItems([yolov5n.yaml,yolov5s.yaml,yolov5m.yaml,yolov5l.yaml,yolov5x.yaml])model_layout.addWidget(self.combo_model)btn_generateQPushButton(一键生成训练框架)btn_generate.clicked.connect(self.generate_framework)model_layout.addWidget(btn_generate)layout.addLayout(model_layout)# --- 第四部分开始训练 ---self.check_auto_closeQCheckBox(CMD窗口自动关闭)layout.addWidget(self.check_auto_close)btn_startQPushButton(开始训练)btn_start.setStyleSheet(font-size: 18px; background-color: #FF4500; color: white;)btn_start.clicked.connect(self.start_training)layout.addWidget(btn_start)# --- 第五部分模型转换 ---convert_layoutQHBoxLayout()self.input_pt_pathQLineEdit()btn_pt_browseQPushButton(浏览PT)btn_pt_browse.clicked.connect(lambda:self.browse_file(self.input_pt_path))btn_onnxQPushButton(pt转onnx)btn_ncnnQPushButton(pt转ncnn)btn_onnx.clicked.connect(self.convert_to_onnx)btn_ncnn.clicked.connect(self.convert_to_ncnn)convert_layout.addWidget(btn_pt_browse);convert_layout.addWidget(self.input_pt_path)convert_layout.addWidget(btn_onnx);convert_layout.addWidget(btn_ncnn)layout.addLayout(convert_layout)central_widget.setLayout(layout)defbrowse_folder(self):folderQFileDialog.getExistingDirectory(self,选择数据集根目录)iffolder:self.path_input.setText(folder)defbrowse_file(self,line_edit):file,_QFileDialog.getOpenFileName(self,选择文件,,PT Files (*.pt))iffile:line_edit.setText(file)defgenerate_framework(self):# 这里可以添加生成目录结构的逻辑QMessageBox.information(self,提示,训练框架目录已生成 (模拟功能))defstart_training(self):# 收集参数args{data_path:self.path_input.text(),batch:int(self.input_batch.text()),epochs:int(self.input_epochs.text()),device:self.input_device.text(),imgsz:[int(self.input_width.text()),int(self.input_height.text())],nc:int(self.input_nc.text()),workers:int(self.input_workers.text()),cfg:self.combo_model.currentText(),close_cmd:self.check_auto_close.isChecked()}# 调用训练器try:self.trainer.run_training(args)QMessageBox.information(self,成功,训练任务已启动)exceptExceptionase:QMessageBox.critical(self,错误,str(e))defconvert_to_onnx(self):pt_pathself.input_pt_path.text()ifnotpt_path:returnself.converter.to_onnx(pt_path)QMessageBox.information(self,完成,ONNX转换完成)defconvert_to_ncnn(self):# NCNN 通常需要 onnx 作为中间步骤pt_pathself.input_pt_path.text()ifnotpt_path:returnonnx_pathself.converter.to_onnx(pt_path)self.converter.to_ncnn(onnx_path)QMessageBox.information(self,完成,NCNN转换完成)if__name____main__:appQApplication(sys.argv)windowYOLOv5Tool()window.show()sys.exit(app.exec_())2. 训练逻辑封装这个模块负责处理数据集划分、生成data.yaml并调用YOLOv5模型进行训练。这里使用了ultralytics官方库。# trainer.pyimportosimportyamlfromultralyticsimportYOLOimportrandomclassYOLOv5Trainer:def__init__(self):passdefcreate_data_yaml(self,data_path,nc,names,split_ratio0.2): 自动生成 data.yaml 文件 images_diros.path.join(data_path,images)labels_diros.path.join(data_path,labels)# 简单的数据集划分逻辑 (实际项目中建议更严谨)# 这里假设用户已经分好了 train/val或者我们在这里做简单的移动/链接yaml_content{path:data_path,train:images/train,# 相对路径val:images/val,nc:nc,names:names# 例如 [class1, class2]}yaml_pathos.path.join(data_path,data.yaml)withopen(yaml_path,w,encodingutf-8)asf:yaml.dump(yaml_content,f,default_flow_styleNone,sort_keysFalse)returnyaml_pathdefrun_training(self,args): 执行训练 data_pathargs[data_path]# 1. 自动生成 yaml (这里假设类别名为 class0, class1... 实际应读取classes.txt)class_names[fclass{i}foriinrange(args[nc])]yaml_pathself.create_data_yaml(data_path,args[nc],class_names,args[train_valid])# 2. 加载模型# 如果是从 scratch 训练使用 cfg如果是微调使用预训练权重modelYOLO(args[cfg])# 3. 开始训练# 这里的 device 传入 0 或 cpuresultsmodel.train(datayaml_path,epochsargs[epochs],batchargs[batch],imgszargs[imgsz],deviceargs[device],workersargs[workers],projectruns/train,nameexp)3. 模型转换工具用于实现截图中右下角的pt转onnx和pt转ncnn功能。# converter.pyimportosimportsubprocessclassModelConverter:defto_onnx(self,pt_path): 将 .pt 转换为 .onnx # 使用 ultralytics 的导出功能fromultralyticsimportYOLO modelYOLO(pt_path)# export formatonnxsuccessmodel.export(formatonnx)returnsuccess# 返回导出后的文件路径defto_ncnn(self,onnx_path): 将 .onnx 转换为 .ncnn (param 和 bin) 注意这通常需要 onnx-simplifier 和 onnx2ncnn 可执行文件 # 这是一个简化的调用逻辑# 实际打包工具中需要包含 onnx2ncnn.exeonnx_sim_pathonnx_path.replace(.onnx,_sim.onnx)# 1. Simplify (可选但推荐)try:importonnxfromonnxsimimportsimplify# ... 简化代码 ...except:pass# 2. 调用 onnx2ncnn# 假设工具目录下有 onnx2ncnn.exetool_pathtools/onnx2ncnn.exeoutput_paramonnx_path.replace(.onnx,.param)output_binonnx_path.replace(.onnx,.bin)cmd[tool_path,onnx_path,output_param,output_bin]subprocess.run(cmd)关键技术点解析免环境部署截图中的工具之所以能“免环境”是因为开发者使用了PyInstaller将整个 Python 解释器、PyTorch 库、CUDA 运行时cudnn,cublas等 dll打包成了一个独立的.exe文件。用户不需要自己安装 Python 或 CUDA因为程序运行时会解压这些依赖到临时目录。懒人精灵调用生成的模型通常是.pt或.onnx配合懒人精灵提供的 Lua 接口yolo:load(),yolo:detect()即可使用。“一键导出懒人精灵调用例子”的功能本质上就是复制一段预设的 Lua 脚本模板并替换其中的模型路径变量。PT 转 NCNN这是为了在移动端或低功耗设备上运行。流程通常是PyTorch (.pt)-ONNX (.onnx)-NCNN (.param .bin)。代码中的converter.py演示了这一过程。以上代码还原了该工具的核心功能包括GUI交互、训练参数配置及模型转换流程。

更多文章