手把手教你用YOLOv8训练自己的数据集以及YOLOv8的多任务使用

点击上方“小白学视觉”,选择加"星标"或“置顶

 
 
重磅干货,第一时间送达

作者丨小书童

来源丨集智书童

编辑丨极市平台

极市导读

 

记录直接在YOLOv8的官方仓库上直接配置和训练yolov5的全过程。 

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等做了相应参数的配置对齐。

4db444b78ad7ecdaed2ba69f8cb70ccd.png
  • 结合yolov5的使用习惯以及代码结构做了兼容和优化。

d8f7a3ea64fecb29e608b91ad57945b1.png
  • 通过在coco数据集上在自己的机器上进行验证和计算的权重的指标参数,实验记录存放在https://github.com/isLinXu/YOLOv8_Efficient/tree/main/log.实验数据记录在:

4753dce8a2f053b5866122dac04fcdeb.png a8d3e221ee632095d512280ebdd8f72c.png
  • 根据计算出来的结果绘制了相应的指标参数对比图,这个绘图程序也开源在https://github.com/isLinXu/model-metrics-plot中。

8621f62f1b412f4c7239347a177e169d.png
  • 融合其他更多网络模型结构进行集成整合和配置,正在进行中...

2、关于ultralytics的名字

为什么这个仓库取名为ultralytics,而不是yolov8,结合这个issue,笔者认为主要有以下几个方面的原因:

  • 1.因为ultralytics团队希望将这个项目设计和建成一个集合分类,检测,分割等视觉任务的集成训练推理框架,而不仅仅只是yolov8。后续可能会有更多更全的网络模型会集成进来。

  • 2.因为pypi.org上的第三方已经把yolov6,yolov7,yolov8等名字给取了,pip install名称的规则是不允许有重复名的。

ecada02ae0c4a530d731d3204a01a7e7.png

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 convolutions  
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion  
        super().__init__()  
        c_ = int(c2 * e)  # hidden channels  
        self.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去读取网络结构了,但是在跑的时候还是报错。

报错信息如下:

ffe4b2f3dd03d4e2b5ed8f6ecd8b932f.png

于是针对"train_args"做了一个全局搜索,发现了下面的结果:

2bd8e76cc105e02503501383a8144855.png

可以看到,之前训练出来的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 create  
            type (str): Type/version of models to use. Defaults to "v8".  
        """  
        self.type = type  
        self.ModelClass = None  # model class  
        self.TrainerClass = None  # trainer class  
        self.ValidatorClass = None  # validator class  
        self.PredictorClass = None  # predictor class  
        self.model = None  # model object  
        self.trainer = None  # trainer object  
        self.task = None  # task type  
        self.ckpt = None  # if loaded from *.pt  
        self.ckpt_path = None  
        self.cfg = None  # if loaded from *.yaml  
        self.overrides = {}  # overrides for trainer object  
        self.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)

重新运行了一遍,发现又出现了下面的问题:

c0ead4ee0f8f08c55b23e734262cfe09.png

错误信息为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.pt  
          classify        val           yolov8n-cls.pt

4.1、训练

2cec3d50ba9eacf526ea515b88f646e0.png

4.2、预测

cb9af8e1ba11dcd67d57971e0254d8c0.png

4.3、验证

15a6cd3a6fdd59bff820376d53fe8bfb.png
  • !关于这三个任务,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=a  
    from ultralytics.yolo.utils.downloads import attempt_download  
  
    model = Ensemble()  
    for w in weights if isinstance(weights, list) else [weights]:  
        ckpt = torch.load(attempt_download(w), map_location='cpu')  # load  
        args = {**DEFAULT_CONFIG_DICT, **ckpt['train_args']}  # combine model and default args, preferring model args  
        ckpt = (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=a  
    from models.yolo import Detect, Model  
  
    model = Ensemble()  
    for w in weights if isinstance(weights, list) else [weights]:  
        ckpt = torch.load(attempt_download(w), map_location='cpu')  # load  
        ckpt = (ckpt.get('ema') or ckpt['model']).to(device).float()  # FP32 model  
        ...

参考

[1].https://github.com/isLinXu/YOLOv8_Efficient.
[2].https://github.com/isLinXu/model-metrics-plot.

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在【小白CV】手把手教你用YOLOv5训练自己的数据集(从Windows环境配置到模型部署)_梁瑛平的博客-CSDN博客.pdf中提供了详细的指导,可以帮助你学习如何使用YOLOv5训练自己的数据集。该过程包括以下步骤: 1. 数据集制作:准备自己的数据集,并进行标注和处理,生成YOLOv5所需的数据格式。 2. 环境配置:在Windows环境下安装Python环境、PyTorch和其他必要的依赖库。 3. 模型训练使用YOLOv5提供的训练脚本进行模型训练,根据自己的硬件配置修改参数。 4. 模型测试:使用训练好的模型进行测试,评估模型在测试集上的性能。 5. 模型推理:将训练好的模型部署到实际应用中,进行目标检测。 训练好的模型会保存在yolov5目录下的runs/exp0/weights/last.pt和best.pt文件中,而详细的训练数据保存在runs/exp0/results.txt文件中。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【小白CV】手把手教你用YOLOv5训练自己的数据集(从Windows环境配置到模型部署)_梁瑛平的博客-CSDN博客....](https://download.csdn.net/download/m0_62668782/54189217)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [YOLOv5训练自己的数据集(超详细完整版)](https://blog.csdn.net/demm868/article/details/122076560)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值