前言:

1.训练在windows进行,因为电脑没有显卡,所以纯cpu训练,生成pt后转onnx

2.onnx转需要在Ubuntu虚拟机上运行

3.数据集标定快捷键

(模型训练时不需要)官方地址和下载pt权重:链接:https://github.com/ultralytics/ultralytics/tree/v8.0.4?tab=readme-ov-file

必须要下载模型,在源码页面找到模型点击下载,推荐下载yolov8n.pt

环境配置

参考链接:(32 封私信 / 80 条消息) yolov8环境配置加训练自己的数据集保姆级教程(2024) - 知乎

yolov8训练自己的目标检测数据集详细介绍版-腾讯云开发者社区-腾讯云

1.安装anaconda Index of /archive

打开anaconda prompt(管理员运行)

conda create -n yolov8 python=3.8 -y  创建环境,建议3.8
conda activate yolov8  激活环境
conda deactivate 退出环境
conda env remove --name yolov8
conda remove --name yolov8 --all 删除环境然后安装pytorch如果安装GPU版本可以用下面命令:pip install torch2.0.0+cu118 torchvision0.15.1+cu118 --extra-index-url https://download.pytorch.org/whl/cu118如果安装CPU版本pytorch可以用下面命令:conda install pytorch torchvision torchaudio cpuonly -c pytorch安装yolov8:pip install ultralytics测试  下载yolov8n.pt和随机图片yolo predict model=yolov8n.pt source=test.jpgpip install labelimg  //安装labelimg,会自动安装pyqt5,或者在pycharm命令行安装和打开labelimg

制作自己的数据集(本人是训练航空发动机划痕和缺陷)

1.新建文件夹

在data文件夹里面新建一个datasets再在里面新建四个文件夹分别是

Annotations(存放xml的文件夹)

images(用来存放原始的需要训练的数据集图片,图片格式为jpg格式)

ImageSets(用来存放将数据集划分后的用于训练、验证、测试的文件)

labels(存放yolo转换的txt文件)。

我用了两个分类

scratch (划痕)

fracture 断裂

使用说明:

(1)Open Dir就是打开需要标注的图片的文件夹,这里就选择images文件夹

(2)change save dir就是标注后保存标记文件的位置,选择需要保存标注信息的文件夹,这里就选择Annotations文件夹

(3)特别注意需要选择好所需要的标注文件的类型。有yolo(txt), pascalVOC (xml)两种类型。yolo需要txt文件格式的标注文件,但是这里我们选择pascalVOC,后面再将xml格式的标注文件转化为所需的txt格式。

(4)按W键或点击Create\nRectBox开始创建矩形框,把要进行识别训练的区域标记出来就行,选好框后我们选是什么类别(predefined_classes文件,在里面提前写好要训练的类型的原因),整张图片的所有目标都标记好了之后按Ctrl+S或点击Save保存 ,然后切换下一张继续,快捷键为按D键,每一张图片标记后都要保存,这个过程是一个比较繁琐的过程

2.标注

如何预设标签

1.找到anaconda安装的根目录:D:\anaconda

2.进入路径D:\anaconda\Lib\site-packages\labelImg

注意如果你安装其他环境需要对应自己环境,比如我的是py38环境里面则需进去D:\anaconda3\envs\yolov8\Lib\site-packages\labelImg。

3.在此路径里面创建data文件夹,并将自己的predefined_classes.txt文件放入到data文件夹中。

labelImg如何设置多个预设标签

labelImg如何设置多个预设标签_51CTO博客_labelimg标签怎么设置

划分数据集进行训练

博主建议将脚本放在ultralytics文件夹的同级下(我第一次操作没有放到同级目录,一样没问题

因为在YOLOv8的项目中,存在一个ultralytics文件夹,而我们在配置环境的时候,又有名为ultralytics的环境包,二者存在歧义,导致我们在ultralytics文件夹中进行参数修改后却不生效的情况,(这时如果仍要通过命令行进行训练,必须要在环境配置文件中进行相应修改),比如更改激活函数后,发现得到的PT模型仍为最初的SiLU激活函数,这是因为命令行会优先调用环境配置文件中的参数,所以在ultralytics文件夹中修改激活函数后并不会生效(博主自己踩坑,请大家避免)。

3.最重要的一点:要改激活函数为ReLU(问deepseek说可以不用改,我也没改),

改激活函数流程如下:把ultralytics/nn/modules/conv.py中的Conv类进行修改,将

default_act = nn.SiLU() # default activation改为

default_act = nn.ReLU() # default activation

对数据集进行划分
import os
import shutil
import randomdef make_yolo_dataset(images_folder, labels_folder, output_folder, train_ratio=0.8):# 创建目标文件夹images_train_folder = os.path.join(output_folder, 'images/train')images_val_folder = os.path.join(output_folder, 'images/val')labels_train_folder = os.path.join(output_folder, 'labels/train')labels_val_folder = os.path.join(output_folder, 'labels/val')os.makedirs(images_train_folder, exist_ok=True)os.makedirs(images_val_folder, exist_ok=True)os.makedirs(labels_train_folder, exist_ok=True)os.makedirs(labels_val_folder, exist_ok=True)# 获取图片和标签的文件名(不包含扩展名)image_files = [f for f in os.listdir(images_folder) if f.endswith('.jpg')]label_files = [f for f in os.listdir(labels_folder) if f.endswith('.txt')]image_base_names = set(os.path.splitext(f)[0] for f in image_files)label_base_names = set(os.path.splitext(f)[0] for f in label_files)# 找出图片和标签都存在的文件名matched_files = list(image_base_names & label_base_names)# 打乱顺序并划分为训练集和验证集random.shuffle(matched_files)split_idx = int(len(matched_files) * train_ratio)train_files = matched_files[:split_idx]val_files = matched_files[split_idx:]# 移动文件到对应文件夹for base_name in train_files:img_src = os.path.join(images_folder, f"{base_name}.jpg")lbl_src = os.path.join(labels_folder, f"{base_name}.txt")img_dst = os.path.join(images_train_folder, f"{base_name}.jpg")lbl_dst = os.path.join(labels_train_folder, f"{base_name}.txt")shutil.copyfile(img_src, img_dst)shutil.copyfile(lbl_src, lbl_dst)for base_name in val_files:img_src = os.path.join(images_folder, f"{base_name}.jpg")lbl_src = os.path.join(labels_folder, f"{base_name}.txt")img_dst = os.path.join(images_val_folder, f"{base_name}.jpg")lbl_dst = os.path.join(labels_val_folder, f"{base_name}.txt")shutil.copyfile(img_src, img_dst)shutil.copyfile(lbl_src, lbl_dst)print("数据集划分完成!")# 使用示例
images_folder = r'E:\Projects\ultralytics_yolov8-main\data\images'  # 原始图片文件夹路径
labels_folder = r'E:\Projects\ultralytics_yolov8-main\data\Annotations'  # 原始标签文件夹路径
output_folder = r'E:\Projects\ultralytics_yolov8-main\data\ImageSets'  # 存放结果数据集的文件夹路径
make_yolo_dataset(images_folder, labels_folder, output_folder)

开始训练模型

在yolov8根目录下(也就是官方源码的ultralytics-main目录下)创建一个新的data.yaml文件,也可以是其他名字的例如mydata.yaml文件,文件名可以变但是后缀需要为.yaml,内容如下

train: E:\Projects\ultralytics_yolov8-main\data\ImageSets\images\train  # train images (relative to 'path') 128 images
val: E:\Projects\ultralytics_yolov8-main\data\ImageSets\images\val  # val images (relative to 'path') 128 images
test: E:\Projects\ultralytics_yolov8-main\data\ImageSets\images\testnc: 2# Classes
names: ['scratch','fracture']

训练模型

这是使用官方提供的预训练权重进行训练,使用yolov8n.pt,也可以使用yolov8s.pt,模型大小n

新建个train.py文件

from ultralytics import YOLO
#多线程添加代码
if __name__ == '__main__': model = YOLO('yolov8n.yaml').load('yolov8n.pt')# # 训练模型 GPU#results = model.train(data='data.yaml', epochs=100, imgsz=640, device=0, workers=2, batch=16, optimizer='SGD', amp=False)# 训练模型 CPUresults = model.train(data='data.yaml', epochs=100, imgsz=640, device='cpu', workers=2, batch=16, optimizer='SGD',amp=False)

epochs是训练轮数,可以由少变多看训练效果,workers和batch根据电脑性能来,如果运行不起来则相应降低,最好为2的n次方。

也可以使用命令行执行训练 yolo task=detect mode=train model=yolov8n.yaml pretrained=yolov8n.pt data=data.yaml epochs=100 imgsz=640 device=0 workers=2 batch=16 训练完成后会在源码目录runs里面有模型生成,可以进去weights文件夹找到best.pt或者last.pt模型

查看模型激活函数方法如下所示:
from ultralytics import YOLO# 加载自定义训练的模型
model = YOLO("runs/detect/train/weights/best.pt")# 打印模型结构(查找激活函数)
print(model.model)
首先罗列一下官网提供的全部参数:Model Training with Ultralytics YOLO - Ultralytics YOLO Docs

一些比较常用的传参:

key

解释

model

传入的model.yaml文件或者model.pt文件,用于构建网络和初始化,不同点在于只传入yaml文件的话参数会随机初始化

data

训练数据集的配置yaml文件

epochs

训练轮次,默认100

patience

早停训练观察的轮次,默认50,如果50轮没有精度提升,模型会直接停止训练

batch

训练批次,默认16

imgsz

训练图片大小,默认640

save

保存训练过程和训练权重,默认开启

save_period

训练过程中每x个轮次保存一次训练模型,默认-1(不开启)

cache

是否采用ram进行数据载入,设置True会加快训练速度,但是这个参数非常吃内存,一般服务器才会设置

device

要运行的设备,即cuda device =0或Device =0,1,2,3或device = cpu

workers

载入数据的线程数。windows一般为4,服务器可以大点,windows上这个参数可能会导致线程报错,发现有关线程报错,可以尝试减少这个参数,这个参数默认为8,大部分都是需要减少的

project

项目文件夹的名,默认为runs

name

用于保存训练文件夹名,默认exp,依次累加

exist_ok

是否覆盖现有保存文件夹,默认Flase

pretrained

是否加载预训练权重,默认Flase

optimizer

优化器选择,默认SGD,可选[SGD、Adam、AdamW、RMSProP]

verbose

是否打印详细输出

seed

随机种子,用于复现模型,默认0

deterministic

设置为True,保证实验的可复现性

single_cls

将多类数据训练为单类,把所有数据当作单类训练,默认Flase

image_weights

使用加权图像选择进行训练,默认Flase

rect

使用矩形训练,和矩形推理同理,默认False

cos_lr

使用余弦学习率调度,默认Flase

close_mosaic

最后x个轮次禁用马赛克增强,默认10

resume

断点训练,默认Flase

lr0

初始化学习率,默认0.01

lrf

最终学习率,默认0.01

label_smoothing

标签平滑参数,默认0.0

dropout

使用dropout正则化(仅对训练进行分类),默认0.0

模型测试

找到之前训练的结果保存路径,创建一个predict.py文件,内容如下

from ultralytics import YOLO
# 加载训练好的模型,改为自己的路径
model = YOLO('runs/detect/train/weights/best.pt')
# 修改为自己的图像或者文件夹的路径
source = 'test.jpg' #修改为自己的图片路径及文件名
# 运行推理,并附加参数
model.predict(source, save=True)

模型转换

参考链接:【YOLOv8部署至RK3588】模型训练→转换RKNN→开发板部署_yolov8转rknn-CSDN博客

需要以下工具:ultralytics_yolov8、rknn_model_zoo、rknn-toolkit2,现在详细介绍这三者的关系。

以上三个文件均与模型训练无关,而是用于模型转换的,其中,ultralytics_yolov8文件不是必需的,但最好还是下载一份,原因后面会讲;在此,先将以上三个文件的链接放在这:

ultralytics_yolov8:https://github.com/airockchip/ultralytics_yolov8

rknn_model_zoo:https://github.com/airockchip/rknn_model_zoo

rknn-toolkit2:https://github.com/airockchip/rknn-toolkit2

另外说一下这三个文件的版本,全用最新的,rknn_model_zoo用v2.3.2,rknn-toolkit2也用v2.3.2,ultralytics_yolov8只有一个main版本,直接用即可

转换步骤:

1.修改ultralytics_yolov8项目中的ultralytics/cfg/default.yaml,将其中的model参数路径改成你训练得到的的best.pt模型路径

在虚拟环境下,装转换需要的环境
cd ultralytics-main
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install -e .
pip install onnx

新建一个脚本文件:运行后会在 runs\detect\train\weights下生成best.onnx文件

#这里好像是后期转换rknn,需要导出这样的
from ultralytics import YOLO# Load a model
model = YOLO(r'E:\Projects\ultralytics_yolov8-main\data\runs\detect\train\weights\best.pt')
# Export the model
model.export(format='rknn',opset=12)#后期直接用onnx,好像用下面的
from ultralytics import YOLO# Load a model
model = YOLO(r'E:\Projects\ultralytics_yolov8-main\data\runs\detect\train\weights\best.pt')# 2. 导出为 ONNX
model.export(format="onnx", opset=12, dynamic=False, simplify=True, imgsz=640)
print("ONNX 模型导出完成!")

同时生成onnx文件,这样生成的模型output是4维的,后面可以直接转换成rknn。

如果不在rk3588上用,只用onnx文件,之前测试和使用的模型是output都是三维的,所以上面的代码是可以生成两种不同的额模型

onnx转rknn需要再Ubuntu虚拟机下转换,篇幅限制,下节再讲

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

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

相关文章

PyTorch如何修改模型(魔改)?/替换模型,一般除了注意输入输出一致,还有其他要修改的吗?

一、PyTorch如何修改模型(魔改)? 可以参考这个链接,看了一下还不错: PyTorch如何修改模型(魔改)_模型魔改-CSDN博客 二、替换模型,一般除了注意输入输出一致,还有其他要修改的吗?…

Pycharm Debug详解

Pycharm Debug详解看这个工具栏就是 PyCharm 调试器的“步进/断点”按钮区。常用按钮和作用(从左到右一般是这些): Resume / 继续运行(F9):从当前断点继续跑,直到下一个断点或程序结束。Step Ov…

将SSL配置迁移到Nacos的步骤

将SSL配置迁移到Nacos的步骤 要将SSL配置从本地application.yml迁移到Nacos配置中心,需要完成以下几个步骤: 1. 创建Nacos配置文件 在Nacos中创建一个新的配置文件(例如application-ssl.yml),内容如下: ser…

HTTP请求参数类型及对应的后端注解

在Java后端开发中,HTTP请求的不同部分需要使用不同的注解来处理。以下是四种主要请求参数类型及其对应的Spring注解:1. 请求头(Headers)​​位置​​:HTTP请求的头部信息​​常用场景​​:认证信息(Token)、客户端信息、内容类型等…

服务器硬件电路设计之 SPI 问答(一):解密 SPI—— 从定义到核心特性

在服务器硬件电路设计中,SPI(Serial Peripheral Interface,串行外设接口)是一种关键的通信总线。它由摩托罗拉公司开发,是全双工、同步串行通信总线,主要用于微控制器与外围设备之间的通信,凭借…

【2025CVPR-目标检测方向】OW-OVD:统一的开放世界和开放词汇对象检测

研究背景与动机​ ​问题​:传统目标检测器(封闭集)需预定义所有类别,无法适应动态开放环境。现有研究多独立解决开放词汇检测(OVD)或开放世界检测(OWOD),未结合两者优势: ​OVD​:通过文本-视觉嵌入匹配实现零样本泛化,但无法主动发现未知对象。 ​OWOD​:可主动…

基于Python的就业信息推荐系统 Python+Django+Vue.js

本文项目编号 25011 ,文末自助获取源码 \color{red}{25011,文末自助获取源码} 25011,文末自助获取源码 目录 一、系统介绍二、系统录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状 六、核心代码6.1 查询数据6.2 新…

el-date-picker type=daterange 日期范围限制

html &#xff08;组件&#xff1a;element-ui&#xff09;重点&#xff1a; :picker-options"pickerOptions"<template><el-date-pickerv-model"form.dateRange"type"daterange" value-format"yyyy-MM-dd"range-separator&q…

【38页PPT】关于5G智慧园区整体解决方案(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92808811/91694207 资料解读&#xff1a;《关于5G智慧园区整体解决方案》 详细资料请看本解读文章的最后内容。 智慧园区行业理解与建设目标 智慧园…

Kafka的ISR、OSR、AR详解

Kafka中的ISR、OSR和AR是副本管理机制的核心概念&#xff0c;它们共同保障了Kafka的高可用性和数据一致性。下面我将详细解释这些概念及其相互关系。 1. 基本概念 1.1 AR (Assigned Replicas) - 分配副本 定义&#xff1a;一个分区的所有副本集合称为AR&#xff0c;即Kafka为主…

第一阶段C#基础-13:索引器,接口,泛型

1_索引器&#xff08;1&#xff09;索引器是C#中一个强大而实用的特性&#xff0c;允许像访问数组一样访问类的成员&#xff08;2&#xff09;索引器&#xff1a;一种可以让我们使用索引来访问对象的一种方法&#xff0c;是一组get,set访问器&#xff0c;与属性类似&#xff0c…

SQL-leetcode— 2356. 每位教师所教授的科目种类的数量

2356. 每位教师所教授的科目种类的数量 表: Teacher ----------------- | Column Name | Type | ----------------- | teacher_id | int | | subject_id | int | | dept_id | int | ----------------- 在 SQL 中&#xff0c;(subject_id, dept_id) 是该表的主键。 该表…

基于单片机温控风扇设计/PWM调速风扇/智能风扇

传送门 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目速选一览表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目功能速览 概述 该设计基于单片机实现智能温控风扇系统&#xff0c;通过温度传感器实时监测环境温度&#xff0c;…

【datawhale组队学习】RAG技术 - TASK02

教程地址&#xff1a;https://github.com/datawhalechina/all-in-rag/ 感谢datawhale的教程&#xff0c;以下笔记大部分内容来自该教程 文章目录基于LangChain框架的RAG实现初始化设置数据准备索引构建查询与检索生成集成低代码&#xff08;基于LlamaIndex&#xff09;conda ac…

Mitt 事件发射器完全指南:200字节的轻量级解决方案

简介 Mitt 是一个轻量级的事件发射器库&#xff0c;体积小巧&#xff08;约 200 字节&#xff09;&#xff0c;无依赖&#xff0c;支持 TypeScript。它提供了简单而强大的事件发布/订阅机制&#xff0c;适用于组件间通信、状态管理等场景。 特点 &#x1f680; 超轻量级&…

数据库锁与死锁-笔记

一、概述 数据库是一个共享资源,可以供给多个用户使用。运行多个用户同时使用一个数据库的数据系统统称多用户数据库系统。例如,飞机订票数据库系统。在这样的一个系统中,在同一时刻并发运行的事务数可达数百上千个。 当多个用户并发地存取数据库时就会产生多个事务同时存…

渗透艺术系列之Laravel框架(二)

任何软件&#xff0c;都会存在安全漏洞&#xff0c;我们应该将攻击成本不断提高&#xff01;​**——服务容器与中间件的攻防博弈**​本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01;一、服务容器的"依赖注入陷阱"1.1 接口绑定的"影子服务"…

官网SSO登录系统的企业架构设计全过程

第一阶段&#xff1a;架构愿景与业务架构设计 (Architecture Vision & Business Architecture) 任何架构的起点都必须是业务目标和需求。 1.1 核心业务目标 (Business Goals) 提升用户体验&#xff1a;用户一次登录&#xff0c;即可无缝访问集团下所有子公司的官网和应用&a…

2025世界机器人大会:中国制造“人形时代”爆发

2025世界机器人博览会8月8日在北京亦庄开幕&#xff0c;主题为“让机器人更智慧&#xff0c;让具身体更智能”&#xff0c;汇聚全球200余家企业、1500余件展品&#xff0c;其中首发新品超100款&#xff0c;人形机器人整机企业参展数量创同类展会之最。 除了机器人本体外&#…

Oracle 库定期备份表结构元数据信息至目标端备份脚本

一、背景描述当前 xxx 项目 Oracle 11g RAC 库缺少 DG&#xff0c;并且日常没有备份&#xff0c;存在服务器或存储损坏&#xff0c;数据或表结构存在丢失风险&#xff0c;在和项目组同步后&#xff0c;项目组反馈可对该数据库定期备份相关结构信息&#xff0c;如存在数据丢失&a…