Yolo迁移训练-带训练源码

目录

下载Git

拉下yolo模型

下载labelimg

准备训练集

迁移训练

继续训练


下载Git

Git - Downloading Package

拉下yolo模型

然后用克隆脚本拉下yolo模型

python clone_yolo.py
import os
import subprocess
import sys
import shutildef check_git_installed():"""检查Git是否已安装"""try:result = subprocess.run(['git', '--version'], capture_output=True, text=True)if result.returncode == 0:print(f"Git已安装: {result.stdout.strip()}")return Truereturn Falseexcept:return Falsedef clone_yolo():"""克隆YOLOv5仓库"""# 获取当前工作目录work_dir = os.path.dirname(os.path.abspath(__file__))# 检查是否已存在yolov5目录yolo_dir = os.path.join(work_dir, 'yolov5')if (os.path.exists(yolo_dir)):print(f"YOLO目录已存在({yolo_dir})。自动删除并重新克隆...")shutil.rmtree(yolo_dir, ignore_errors=True)# 克隆YOLOv5仓库 - 使用实时输出而不是捕获输出print("正在克隆YOLOv5仓库,这可能需要几分钟时间...")print("(下载进度将实时显示,请耐心等待)")try:# 使用实时输出方式运行git cloneresult = subprocess.run(['git', 'clone', 'https://github.com/ultralytics/yolov5.git'],cwd=work_dir,capture_output=False,  # 不捕获输出,让它直接显示在控制台text=True)if result.returncode == 0:print("YOLOv5仓库克隆成功!")# 安装依赖print("\n正在安装YOLOv5依赖...")requirements_file = os.path.join(yolo_dir, 'requirements.txt')if os.path.exists(requirements_file):try:subprocess.run([sys.executable, '-m', 'pip', 'install', '-r', requirements_file],check=True,capture_output=False  # 实时显示安装进度)print("YOLOv5依赖安装完成!")except subprocess.CalledProcessError as e:print(f"警告: 安装依赖时出错: {str(e)}")print("您可能需要手动安装依赖。")else:print(f"警告: 找不到requirements.txt文件({requirements_file})。")return Trueelse:print(f"克隆YOLOv5仓库失败,返回代码: {result.returncode}")return Falseexcept Exception as e:print(f"执行Git命令时出错: {e}")return Falseif __name__ == "__main__":if not check_git_installed():print("Git尚未安装或无法在PATH中找到。")print("请先运行 install_git.py 脚本安装Git,然后重新运行此脚本。")sys.exit(1)print("开始克隆YOLOv5仓库,请确保网络连接正常...")if clone_yolo():print("\nYOLOv5克隆和设置完成!")print("您现在可以使用 train_fruits.py 脚本进行水果识别的迁移学习。")else:print("\n克隆YOLO仓库失败,请检查错误信息并重试。")

下载labelimg

在下载yolo的过程中可以先去https://github.com/tzutalin/labelImg/releases下载给图像打标签的工具 labelimg

准备训练集

在 label 完后会生成 txt 文件(注意同一个水果图片的 .jpg和 .txt前面的名称要一样,比如apple_01.jpg 和 apple_01.txt )

建立一个 dataset 文件夹,并在该目录下建立 images 和 labels 文件夹,并在这两个文件夹下面创建两个子文件夹,一个叫 train 用于存储训练集,一个叫 val 用于存储验证集

比如标签的训练集.txt文件就放在 label\val

接着我们就用labelimg框选训练集

🧭 一、启动软件

  1. 如果你是通过命令行运行的,输入:

    python labelImg.py
  2. 或者直接运行 labelImg.exe(Windows 下)。

🖼 二、打开图片文件夹

点击左上角的按钮:

  • Open Dir:选择你存放图像的文件夹(比如 images/)

  • 如果 Open Dir 找不到的话,也可以直接 Open 打开图片

🧩 三、选择保存标注的格式

点击:

  •  YOLO(保存为 .txt 格式,适用于 YOLO 模型)

✏️ 四、开始标注步骤

  1. 点击工具栏上的 Create RectBox 按钮(或快捷键 w)

  2. 用鼠标在图片上 点击并拖动,画出一个框框(比如把猫框住)

  3. 系统会弹出一个窗口,输入标签名(如:cat) → 回车

  4. 你可以继续框其他对象,每个对象一个框

💾 五、保存标注

点击左上角的:

  • Save 按钮(或快捷键 Ctrl+S),系统会把标注保存为 .xml 或 .txt 文件,放在和图像同目录下。

⏭ 六、切换到下一张图像

  • 点箭头按钮 ▶ 或按 d 切换到下一张图像继续标注

  • 按 a 切换上一张图像

  • 按 Ctrl + S 随时保存标注结果

⌨️ 常用快捷键:

w                框选

Ctrl + s       保存

d                下一张

a                上一张

Delete        删除框

Crtl + e      修改标签名

然后我们写 fruits.yaml # 水果识别数据集配置(注意是文件中写的是相对路径)

# 训练和验证数据集路径(相对于YOLOv5目录)
path: ../dataset  # 数据集根目录
train: images/train  # 训练图像路径(相对于path)
val: images/val  # 验证图像路径(相对于path)# 类别
nc: 5  # 类别数量
names: ['apple', 'banana', 'orange', 'strawberry', 'kiwi']  # 类别名称

迁移训练

运行训练脚本 train_fruis.py

import os
import argparse
import torch
import shutildef train_yolo(epochs=100, batch_size=16, img_size=640, weights='yolov5s.pt'):"""使用YOLOv5进行水果识别的迁移学习"""print(f"开始训练水果识别模型,训练轮次:{epochs},批次大小:{batch_size},图像尺寸:{img_size}")# 确保我们在正确的工作目录os.chdir(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'yolov5'))# 训练命令train_cmd = f"python train.py --img {img_size} --batch {batch_size} --epochs {epochs} --data ../dataset/fruits.yaml --weights {weights} --cache"# 执行训练print(f"执行命令: {train_cmd}")os.system(train_cmd)# 复制训练结果到models目录last_model = os.path.join('runs', 'train', 'exp', 'weights', 'last.pt')best_model = os.path.join('runs', 'train', 'exp', 'weights', 'best.pt')if os.path.exists(last_model):print("复制模型到models目录...")os.makedirs('../models', exist_ok=True)shutil.copy(last_model, '../models/fruits_last.pt')if os.path.exists(best_model):shutil.copy(best_model, '../models/fruits_best.pt')print("训练完成!模型已保存到models目录。")def parse_arguments():parser = argparse.ArgumentParser(description='YOLO水果识别迁移学习')parser.add_argument('--epochs', type=int, default=100, help='训练轮次')parser.add_argument('--batch-size', type=int, default=16, help='批次大小')parser.add_argument('--img-size', type=int, default=640, help='图像尺寸')parser.add_argument('--weights', type=str, default='yolov5s.pt', help='预训练权重 (yolov5s.pt, yolov5m.pt, yolov5l.pt, yolov5x.pt)')return parser.parse_args()if __name__ == "__main__":args = parse_arguments()train_yolo(epochs=args.epochs, batch_size=args.batch_size, img_size=args.img_size, weights=args.weights)

继续训练

如果新增了训练集的话,直接运行上面的 train_fruits.py 会生成新的模型

如果我们想继续训练我们之前的模型

import os
import argparse
import shutildef continue_training(epochs=50, batch_size=16, img_size=640, weights='models/fruits_best.pt'):"""使用已训练的水果模型继续训练(增量学习)"""print(f"使用已训练的模型继续训练水果识别模型,训练轮次:{epochs},批次大小:{batch_size}")# 确保我们在正确的工作目录os.chdir(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'yolov5'))# 检查指定的权重文件是否存在weights_path = os.path.join('..', weights) if not os.path.isabs(weights) else weightsif not os.path.exists(weights_path):print(f"错误:找不到指定的权重文件:{weights_path}")print("如果这是您第一次训练,请使用train_fruits.py脚本,或者指定yolov5s.pt作为起点")return False# 训练命令 - 使用之前训练的模型继续训练train_cmd = f"python train.py --img {img_size} --batch {batch_size} --epochs {epochs} --data ../dataset/fruits.yaml --weights {weights_path} --cache"# 执行训练print(f"执行命令: {train_cmd}")os.system(train_cmd)# 复制训练结果到models目录last_model = os.path.join('runs', 'train', 'exp', 'weights', 'last.pt')best_model = os.path.join('runs', 'train', 'exp', 'weights', 'best.pt')if os.path.exists(last_model):print("复制更新后的模型到models目录...")os.makedirs('../models', exist_ok=True)shutil.copy(last_model, '../models/fruits_continued_last.pt')if os.path.exists(best_model):shutil.copy(best_model, '../models/fruits_continued_best.pt')print("增量训练完成!更新后的模型已保存到models目录。")return Truedef parse_arguments():parser = argparse.ArgumentParser(description='YOLO水果识别增量训练')parser.add_argument('--epochs', type=int, default=50, help='训练轮次')parser.add_argument('--batch-size', type=int, default=16, help='批次大小')parser.add_argument('--img-size', type=int, default=640, help='图像尺寸')parser.add_argument('--weights', type=str, default='models/fruits_best.pt', help='之前训练好的模型权重文件路径')return parser.parse_args()if __name__ == "__main__":args = parse_arguments()continue_training(epochs=args.epochs, batch_size=args.batch_size, img_size=args.img_size, weights=args.weights)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LangChain框架-PromptTemplate 详解

摘要 本文聚焦于 LangChain 框架中PromptTemplate提示词模板模块的深度解析,主要参考langchain_core.prompts源码模块与官方文档。系统梳理 LangChain 对提示词模板的封装逻辑与设计思路,旨在帮助读者构建全面、深入的知识体系,为高效运用LangChain 框架的提示词模板开发应用…

中小企业设备预测性维护三步构建法:从零到精的技术跃迁与中讯烛龙实践

在工业4.0浪潮中,中小企业常陷入"设备故障频发"与"数字化成本高企"的双重困境。本文基于半导体、食品加工等行业实证数据,结合中讯烛龙系统技术突破,为中小企业提供一套零基础、低门槛、可扩展的预测性维护实施框架&…

C30-函数

一 函数的优点 避免代码冗长模块化的设计思路(十分类似组装电脑)按功能划分,每个函数代表一个功能 二 函数的三要素 函数要先定义再使用(就像是变量一样)三要素: 函数名→体现功能参数列表 比如yf(x)→x就是参数又如yf(x,y)→x,y就是参数→参数的个数取决于需求 返回值:比如…

【Spring Boot 多模块项目】@MapperScan失效、MapperScannerConfigurer 报错终极解决方案

在使用 Spring Boot 构建多模块项目,集成 MyBatis-Plus 时,很多开发者会遇到类似如下启动报错: Error creating bean with name mapperScannerConfigurer ... Caused by: java.lang.IllegalArgumentException: Property basePackage is requ…

pimpl与unique_ptr的问题

PImpl与std::unique_ptr组合 pimpl(Pointer to Implementation)是C程序开发中非常常用的技巧之一,它的好处有: 节省程序编译时间保持程序/库的二进制兼容性隐藏实现细节 举例一个常见的pimpl的使用示例: // a.h class Impl; //前置声明 c…

C++类和对象:构造函数、析构函数、拷贝构造函数

引言 介绍:C类和对象:构造函数、析构函数、拷贝构造函数 _涂色_博主主页 C基础专栏 一、类的默认成员函数 先认识一下类中的默认成员函数: 默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。⼀个类…

CTF - PWN之ORW记录

CTF - Pwn之ORW记录https://mp.weixin.qq.com/s/uiRtqCSopn6U6NqyKJ8I7Q

RabbitMQ 中的六大工作模式介绍与使用

文章目录 简单队列(Simple Queue)模式配置类定义消费者定义发送消息测试消费 工作队列(Work Queues)模式配置类定义消费者定义发送消息测试消费负载均衡调优 发布/订阅(Publish/Subscribe)模式配置类定义消…

民宿管理系统6

普通管理员管理&#xff1a; 新增普通管理员&#xff1a; 前端效果&#xff1a; 前端代码&#xff1a; <body> <div class"layui-fluid"><div class"layui-row"><div class"layui-form"><div class"layui-f…

vue3+ant design vue + Sortable实现多级表格列拖动

1、最近遇到个需求&#xff0c;需使用vue3ant design vue Sortable实现多级表格的表头允许用户拖拽移动。即当用户拖拽一级表头时&#xff0c;其对应的子级表头及数据应同步移动&#xff0c;并且只允许一级非固定表头允许拖拽。 2、代码 <a-table:data-source"rowDat…

第五十四篇 AI与数据分析

一、AI数据分析就像做菜 想象你在厨房做一道新菜&#xff0c;AI数据分析的流程其实非常相似&#xff1a; 买菜&#xff08;获取数据&#xff09; 去市场挑选新鲜蔬菜 从Excel/数据库获取数据例&#xff1a;pd.read_csv(超市销售表.csv) 洗菜切菜&#xff08;清洗数据&#x…

差分OPA verilogaA 模型

做电路设计&#xff0c;需要提前用理想模型如VerilogA模型做验证。这里分享一个由ahdlib库里单端opamp改造而来的差分opamp。参考何乐年的《模拟集成电路设计与仿真》10.4节423页&#xff1b; 描述的小信号模型如上。 VerilogA 用到了SRI/C&#xff0c;GBWgm/C,gaingm*r1等概念…

Solidity语言基础:区块链智能合约开发入门指南

一、Solidity概述 Solidity是以太坊生态系统中最重要的智能合约编程语言&#xff0c;由Gavin Wood于2014年提出。作为面向合约的高级语言&#xff0c;它结合了JavaScript、Python和C的语法特点&#xff0c;专为在以太坊虚拟机&#xff08;EVM&#xff09;上运行而设计。 核心…

开启智能Kubernetes管理新时代:kubectl-ai让操作更简单!

在如今的科技世界中,Kubernetes 已经成为容器编排领域的标杆,几乎所有现代应用的基础设施都离不开它。然而,面对复杂的集群管理和日常运维,许多开发者常常感到无所适从。今天,我们将为大家介绍一款结合了人工智能的强大工具——kubectl-ai。它不仅能帮助开发者更加顺畅地与…

2003-2020年高铁站开通时间数据

2003-2020年高铁站开通时间数据 1、时间&#xff1a;2003-2020年 2、来源&#xff1a;Chinese High-speed Rail and Airline Database&#xff0c;CRAD 3、指标&#xff1a;高铁站名称、开通时间、所在省份、所在城市、所属线路名称 4、说明&#xff1a; Hsrwsnm[高铁站名…

神经网络—感知器、多层感知器

文章目录 前言一、生物神经元与感知器的类比二、感知器1、简单感知器2、多层感知器&#xff08;1&#xff09;多层感知机结构 3、神经网络结构 总结1、感知器的局限性如何突破感知器的局限性&#xff1f; 2、感知器的应用 前言 感知器&#xff08;Perceptron&#xff09;是神经…

避免数据丢失:在存储测试数据之前,要做好Redis持久化

Redis提供两种持久化方法&#xff1a; 一、RDB&#xff08;Redis DataBase&#xff09;&#xff1a; 1、周期性保存内存快照到磁盘&#xff08;生成 dump.rdb 文件&#xff09;。 2、配置save 相关参数。 我本地的配置如下&#xff1a; &#xff08;1&#xff09;配置文件re…

Oracle EBS FORM快捷键与触发器的关系与使用

Oracle EBS FORM快捷键与触发器的引用 1、快捷键作用&#xff0c;可以看文档fmrweb.res 2、文件内容&#xff1a;标识了快捷键的作用 9 : 0 : “Tab” : 1 : “Next Field” 9 : 1 : “ShiftTab” : 2 : “Previous Field” 116 : 0 : “F5” : 3 : “Clear Field” 38 : 0 :…

Java 24:重构数字信任边界 —— 后量子时代的智能安全防御体系构建

引言 在量子计算阴影与 AI 驱动攻击交织的网络安全新纪元&#xff0c;Java 平台正经历着自诞生以来最深刻的安全架构革新。作为企业级应用的核心基础设施&#xff0c;Java 24 不仅延续了 “一次编写&#xff0c;处处运行” 的跨平台基因&#xff0c;更以后量子密码学引擎、动态…

【故障定位系列】容器CPU问题引起的故障如何快速排查

原文地址&#xff1a;https://mp.weixin.qq.com/s/0VlIjbeEdPZUbLD389disA 当生产环境中的容器CPU出现异常时&#xff0c;可能会引发上层业务出现一系列问题&#xff0c;比如业务请求缓慢、网页卡顿甚至崩溃等&#xff0c;如果没有一个有效的故障定位方法&#xff0c;运维人员很…