作者 | 小书童  编辑 | 汽车人

点击下方卡片,关注“自动驾驶之心”公众号

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的多任务使用相关推荐

  1. yolov8系列(二)-训练自己的目标分割模型,并web部署

    yolov8系列[二]-训练自己的目标分割模型,并web部署 0. 系统效果展示 1. yolov8训练高压电线覆冰模型 1.1. 制作高压电线覆冰数据 1.2. 数据转换成yolo格式数据 1.3. ...

  2. 《网络攻防实践》 课程教学

    <网络攻防实践> 课程教学 给学生 考核方式 100分构成 翻转课堂考核10次 : 5*10 = 50 每次考试20-30道题目,考试成绩规格化成5分(比如总分20分就除以4) 注意:不轮 ...

  3. TIT 数字图像处理 原理与实践(MATLAB) 入门教学 实验一 常用的MATLAB图像处理命令与图像基本操作

    文章目录 数字图像处理 原理与实践(MATLAB) 入门教学 实验一 常用的MATLAB图像处理命令与图像基本操作 实验要求 知识点 实验内容 1.读入一幅RGB图像,变换为灰度图像和二值图像,并在同 ...

  4. TIT 数字图像处理 原理与实践(MATLAB) 入门教学 实验三 图像平滑与图像锐化

    文章目录 数字图像处理 原理与实践(MATLAB) 入门教学 实验三 图像平滑与图像锐化 实验要求 知识点 实验内容 1.采用二维中值滤波函数medfilt2对受椒盐噪声干扰的图像滤波,窗口分别采用3 ...

  5. 全能型AI!用通用预训练感知模型处理多模态多任务!商汤西交港中文提出:Uni-Perceiver...

    关注公众号,发现CV技术之美 本文分享论文『Uni-Perceiver: Pre-training Unified Architecture for Generic Perception for Zer ...

  6. Yolov8如何在训练意外中断后接续训练

    1.错误尝试 在训练YOLOv8的时候,因为开太多其他程序,导致在100多次的时候崩溃,查询网上相关知识如何接着训练,在yolo5中把resume改成True就可以. 在yolov8中也这样尝试,将u ...

  7. Ultralytics公司YOLOv8来了(训练自己的数据集并基于NVIDIA TensorRT和华为昇腾端到端模型加速)--跟不上“卷“的节奏

    Official YOLOv8 训练自己的数据集并基于NVIDIA TensorRT和华为昇腾端到端模型加速 说明: 本项目支持YOLOv8的对应的package的版本是:ultralytics-8. ...

  8. 计算机实践课训练小结,电脑社团活动总结

    本学期,根据团委的安排,我进行了电脑社团活动的组织与教学工作.经过一个学期的工作与摸索,积累了一些经验,下面就小组活动情况.教学组织措施.经验与提高措施等三方面进行总结. 一.社团活动情况: 兴趣班活 ...

  9. 计算机教学教育评价和实践手册,教育教学实践评价手册(听课记录表三)

    <教育教学实践评价手册(听课记录表三)>由会员分享,可在线阅读,更多相关<教育教学实践评价手册(听课记录表三)(4页珍藏版)>请在人人文库网上搜索. 1.听课记录表(三)实习学 ...

最新文章

  1. 怎样做好敏捷项目管理?
  2. Soul网关发布2.2.0:让高性能网关变得如此简单!
  3. mysql分隔符声明_MySQL分隔符发生错误时?
  4. python3调用c语言数组,使用Python中的ctypes访问数组
  5. 什么时候用synchronized
  6. Decision Tree学习笔记(基础篇)
  7. 语言 ota_小米手表第五次OTA升级:百款新表盘 增加运动语音、振动提醒
  8. Skype for Business Server 2015-13-IISARR-2-发布-2-前端服务器
  9. delete postman 传参_Postman高级应用——串行传参和动态传参详解
  10. Elastic-jobQuartz定时任务
  11. HTK的Network把所有的NetNode对象chain,并重新排序
  12. Lavas的简单入门
  13. LaTeX:使用bib插入文献
  14. oracle授权v$lock,访问V$LOCK视图Oracle 11g出现性能问题
  15. 【IoT】BLE 广播的基础数据定义:广播名字类型和设备类型标志
  16. Sketch Less for More: On-the-Fly Fine-Grained Sketch Based Image Retrieval (CVPR 2020 Oral)
  17. 亚马逊新手卖家如何快速出单必掌握的运营技巧分享?
  18. .Net自动生成BH
  19. 游戏中的显示器选项的acm
  20. OpenCV3 5.3 用形态学滤波器开启和闭合图像

热门文章

  1. reconstruction_mesh.py代码阅读
  2. c++病毒系列(1)
  3. android 9宫格布局,android 朋友圈9宫格实现
  4. 计算机主机发出滴滴声音,为什么电脑会发出嘀嘀嘀的声音
  5. 计算机主机开机滴滴叫,电脑开机一直嘀嘀嘀的响不能启动怎么办 电脑开
  6. Windows 10 MBR转GPT分区
  7. 什么是原子性,什么是原子性操作
  8. 使用chrome浏览器查看当前HTTP头
  9. 51nod 1340 地铁环线
  10. linux系统题库的答案,Linux操作系统2020知道题库及答案