YOLOv8实践 | 手把手训练教学及YOLOv8的多任务使用
作者 | 小书童 编辑 | 汽车人
点击下方卡片,关注“自动驾驶之心”公众号
ADAS巨卷干货,即可获取
点击进入→自动驾驶之心【目标检测】技术交流群
后台回复【2D检测综述】获取鱼眼检测、实时检测、通用2D检测等近5年内所有综述!
1、YOLOv8_Efficient的介绍
Github地址:https://github.com/isLinXu/YOLOv8_Efficient
本项目基于ultralytics及yolov5等进行综合参考,致力于让yolo系列的更加高效和易用。
目前主要做了以下的工作:
参考https://docs.ultralytics.com/config/中的Configuration参数,分别针对train.py、detect.py、val.py等做了相应参数的配置对齐。
结合yolov5的使用习惯以及代码结构做了兼容和优化。
通过在coco数据集上在自己的机器上进行验证和计算的权重的指标参数,实验记录存放在https://github.com/isLinXu/YOLOv8_Efficient/tree/main/log.实验数据记录在:
根据计算出来的结果绘制了相应的指标参数对比图,这个绘图程序也开源在https://github.com/isLinXu/model-metrics-plot中。
融合其他更多网络模型结构进行集成整合和配置,正在进行中...
2、关于ultralytics的名字
为什么这个仓库取名为ultralytics,而不是yolov8,结合这个issue,笔者认为主要有以下几个方面的原因:
1.因为ultralytics团队希望将这个项目设计和建成一个集合分类,检测,分割等视觉任务的集成训练推理框架,而不仅仅只是yolov8。后续可能会有更多更全的网络模型会集成进来。
2.因为pypi.org上的第三方已经把yolov6,yolov7,yolov8等名字给取了,pip install名称的规则是不允许有重复名的。
issue链接:https://github.com/ultralytics/ultralytics/issues/179
3、关于自定义配置模型训练
结合上面的讨论,自然而然会有这个想法,既然ultralytics要建一个集成训练框架,那么能否直接在ultralytics仓库上直接配置和训练yolov5呢,笔者做了下面一系列的尝试:
在models中加入相应的.yaml文件和yolov5沿用的模块,如common.py、experimental.py、google_utils.py
在
models/common.py
中,加入了yolov5所需的网络结构class C3(nn.Module):# CSP Bottleneck with 3 convolutionsdef __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): # ch_in, ch_out, number, shortcut, groups, expansionsuper().__init__()c_ = int(c2 * e) # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c1, c_, 1, 1)self.cv3 = Conv(2 * c_, c2, 1) # optional act=FReLU(c2)self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))def forward(self, x):return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))
在运行时加入模块用于测试
最后一通操作下来,已经可以根据yolov5s.yaml去读取网络结构了,但是在跑的时候还是报错。
报错信息如下:
于是针对"train_args"
做了一个全局搜索,发现了下面的结果:
可以看到,之前训练出来的v8的权重内包含了"train_args"
的信息。顺着程序运行的流程,相应地发现了yolo/engine/model
中的"__init__(self)"
函数,
def __init__(self, model='yolov8n.yaml', type="v8") -> None:"""Initializes the YOLO object.Args:model (str, Path): model to load or createtype (str): Type/version of models to use. Defaults to "v8"."""self.type = typeself.ModelClass = None # model classself.TrainerClass = None # trainer classself.ValidatorClass = None # validator classself.PredictorClass = None # predictor classself.model = None # model objectself.trainer = None # trainer objectself.task = None # task typeself.ckpt = None # if loaded from *.ptself.ckpt_path = Noneself.cfg = None # if loaded from *.yamlself.overrides = {} # overrides for trainer objectself.init_disabled = False # disable model initialization# Load or create new YOLO model{'.pt': self._load, '.yaml': self._new}[Path(model).suffix](model)
读取模型和配置是在"__init__"
的最后一行:
# Load or create new YOLO model
{'.pt': self._load, '.yaml': self._new}[Path(model).suffix](model)
而def _load(self, weights: str):
中实际读取模型权重的实现是self.model = attempt_load_weights(weights)
。可以看到,相比于yolov5,v8读取权重的函数attempt_load_weights
,多了下面这行
args = {**DEFAULT_CONFIG_DICT, **ckpt['train_args']} # combine model and default args, preferring model args
那么,能否直接将v5的项目中,将相应的函数补充过来给v8做适配呢,自然是可以的,当笔者将model.py的_load
函数中这行代码:
self.model = attempt_load_weights(weights)
替换为下面这行时:
self.model = attempt_load(weights)
重新运行了一遍,发现又出现了下面的问题:
错误信息为AttributeError: 'Model' object has no attribute 'args'
,既然是Model定义和配置上的问题,那么就没有再往下修改的必要了,还是等官方团队的更新和修改吧,等等党永远不亏。
4、关于v8的多任务使用
根据官方的文档介绍,还有对代码的分析,目前v8项目是支持检测、分类和分割的。设定是通过"task"
进行区分任务,又通过mode
来设置是训练还是检测的模式,如下使用:
yolo task=detect mode=train model=yolov8n.yaml epochs=1 ...... ... ...segment predict yolov8n-seg.ptclassify val yolov8n-cls.pt
4.1、训练
task | snippet | |
---|---|---|
Detection检测 | detect | yolo task=detect mode=train |
Instance Segment分割 | segment | yolo task=segment mode=train |
Classification分类 | classify | yolo task=classify mode=train |
4.2、预测
task | snippet | |
---|---|---|
Detection检测 | detect | yolo task=detect mode=predict |
Instance Segment分割 | segment | yolo task=segment mode=predict |
Classification分类 | classify | yolo task=classify mode=predict |
4.3、验证
task | snippet | |
---|---|---|
Detection检测 | detect | yolo task=detect mode=val |
Instance Segment分割 | segment | yolo task=segment mode=val |
Classification分类 | classify | yolo task=classify mode=val |
!关于这三个任务,YOLOv8_Efficient项目后续会分别设置相应的模块用于执行,目前正在更新中。
5、附件
5.1、YOLOv8读取权重
def attempt_load_weights(weights, device=None, inplace=True, fuse=False):# Loads an ensemble of models weights=[a,b,c] or a single model weights=[a] or weights=afrom ultralytics.yolo.utils.downloads import attempt_downloadmodel = Ensemble()for w in weights if isinstance(weights, list) else [weights]:ckpt = torch.load(attempt_download(w), map_location='cpu') # loadargs = {**DEFAULT_CONFIG_DICT, **ckpt['train_args']} # combine model and default args, preferring model argsckpt = (ckpt.get('ema') or ckpt['model']).to(device).float() # FP32 model...
5.2、YOLOv5读取权重
def attempt_load(weights, device=None, inplace=True, fuse=True):# Loads an ensemble of models weights=[a,b,c] or a single model weights=[a] or weights=afrom models.yolo import Detect, Modelmodel = Ensemble()for w in weights if isinstance(weights, list) else [weights]:ckpt = torch.load(attempt_download(w), map_location='cpu') # loadckpt = (ckpt.get('ema') or ckpt['model']).to(device).float() # FP32 model...
6、参考
[1].https://github.com/isLinXu/YOLOv8_Efficient.
[2].https://github.com/isLinXu/model-metrics-plot.
【自动驾驶之心】全栈技术交流群
自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多传感器融合、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、硬件配置、AI求职交流等方向;
添加汽车人助理微信邀请入群
备注:学校/公司+方向+昵称
YOLOv8实践 | 手把手训练教学及YOLOv8的多任务使用相关推荐
- yolov8系列(二)-训练自己的目标分割模型,并web部署
yolov8系列[二]-训练自己的目标分割模型,并web部署 0. 系统效果展示 1. yolov8训练高压电线覆冰模型 1.1. 制作高压电线覆冰数据 1.2. 数据转换成yolo格式数据 1.3. ...
- 《网络攻防实践》 课程教学
<网络攻防实践> 课程教学 给学生 考核方式 100分构成 翻转课堂考核10次 : 5*10 = 50 每次考试20-30道题目,考试成绩规格化成5分(比如总分20分就除以4) 注意:不轮 ...
- TIT 数字图像处理 原理与实践(MATLAB) 入门教学 实验一 常用的MATLAB图像处理命令与图像基本操作
文章目录 数字图像处理 原理与实践(MATLAB) 入门教学 实验一 常用的MATLAB图像处理命令与图像基本操作 实验要求 知识点 实验内容 1.读入一幅RGB图像,变换为灰度图像和二值图像,并在同 ...
- TIT 数字图像处理 原理与实践(MATLAB) 入门教学 实验三 图像平滑与图像锐化
文章目录 数字图像处理 原理与实践(MATLAB) 入门教学 实验三 图像平滑与图像锐化 实验要求 知识点 实验内容 1.采用二维中值滤波函数medfilt2对受椒盐噪声干扰的图像滤波,窗口分别采用3 ...
- 全能型AI!用通用预训练感知模型处理多模态多任务!商汤西交港中文提出:Uni-Perceiver...
关注公众号,发现CV技术之美 本文分享论文『Uni-Perceiver: Pre-training Unified Architecture for Generic Perception for Zer ...
- Yolov8如何在训练意外中断后接续训练
1.错误尝试 在训练YOLOv8的时候,因为开太多其他程序,导致在100多次的时候崩溃,查询网上相关知识如何接着训练,在yolo5中把resume改成True就可以. 在yolov8中也这样尝试,将u ...
- Ultralytics公司YOLOv8来了(训练自己的数据集并基于NVIDIA TensorRT和华为昇腾端到端模型加速)--跟不上“卷“的节奏
Official YOLOv8 训练自己的数据集并基于NVIDIA TensorRT和华为昇腾端到端模型加速 说明: 本项目支持YOLOv8的对应的package的版本是:ultralytics-8. ...
- 计算机实践课训练小结,电脑社团活动总结
本学期,根据团委的安排,我进行了电脑社团活动的组织与教学工作.经过一个学期的工作与摸索,积累了一些经验,下面就小组活动情况.教学组织措施.经验与提高措施等三方面进行总结. 一.社团活动情况: 兴趣班活 ...
- 计算机教学教育评价和实践手册,教育教学实践评价手册(听课记录表三)
<教育教学实践评价手册(听课记录表三)>由会员分享,可在线阅读,更多相关<教育教学实践评价手册(听课记录表三)(4页珍藏版)>请在人人文库网上搜索. 1.听课记录表(三)实习学 ...
最新文章
- 怎样做好敏捷项目管理?
- Soul网关发布2.2.0:让高性能网关变得如此简单!
- mysql分隔符声明_MySQL分隔符发生错误时?
- python3调用c语言数组,使用Python中的ctypes访问数组
- 什么时候用synchronized
- Decision Tree学习笔记(基础篇)
- 语言 ota_小米手表第五次OTA升级:百款新表盘 增加运动语音、振动提醒
- Skype for Business Server 2015-13-IISARR-2-发布-2-前端服务器
- delete postman 传参_Postman高级应用——串行传参和动态传参详解
- Elastic-jobQuartz定时任务
- HTK的Network把所有的NetNode对象chain,并重新排序
- Lavas的简单入门
- LaTeX:使用bib插入文献
- oracle授权v$lock,访问V$LOCK视图Oracle 11g出现性能问题
- 【IoT】BLE 广播的基础数据定义:广播名字类型和设备类型标志
- Sketch Less for More: On-the-Fly Fine-Grained Sketch Based Image Retrieval (CVPR 2020 Oral)
- 亚马逊新手卖家如何快速出单必掌握的运营技巧分享?
- .Net自动生成BH
- 游戏中的显示器选项的acm
- OpenCV3 5.3 用形态学滤波器开启和闭合图像