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

技术

picture.image

点击加入→【集智书童-模型部署】交流群

1、YOLOv8_Efficient的介绍

本项目基于ultralytics及yolov5等进行综合参考,致力于让yolo系列的更加高效和易用。

目前主要做了以下的工作:

picture.image

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

picture.image

picture.image

picture.image

picture.image

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

2、关于ultralytics的名字

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

  • 1.因为ultralytics团队希望将这个项目设计和建成一个集合分类,检测,分割等视觉任务的集成训练推理框架,而不仅仅只是yolov8。后续可能会有更多更全的网络模型会集成进来。
  • 2.因为pypi.org上的第三方已经把yolov6,yolov7,yolov8等名字给取了,pip install名称的规则是不允许有重复名的。

picture.image

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去读取网络结构了,但是在跑的时候还是报错。

报错信息如下:

picture.image

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

picture.image

可以看到,之前训练出来的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)  

      

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

picture.image

错误信息为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、训练

tasksnippet
Detection检测detectyolo task=detect mode=train
Instance Segment分割segmentyolo task=segment mode=train
Classification分类classifyyolo task=classify mode=train

4.2、预测

tasksnippet
Detection检测detectyolo task=detect mode=predict
Instance Segment分割segmentyolo task=segment mode=predict
Classification分类classifyyolo task=classify mode=predict

4.3、验证

tasksnippet
Detection检测detectyolo task=detect mode=val
Instance Segment分割segmentyolo task=segment mode=val
Classification分类classifyyolo 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=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  
        ...  

      

6、参考

[1].https://github.com/isLinXu/YOLOv8\_Efficient.
[2].https://github.com/isLinXu/model-metrics-plot.

7、推荐阅读

[picture.image

目标检测提升技巧 | 结构化蒸馏一行代码让目标检测轻松无痛涨点](https://mp.weixin.qq.com/s?__biz=MzU5OTA2Mjk5Mw==&mid=2247499549&idx=1&sn=e0ab77e5edf39ad4029d9075127a4327&chksm=feb81fa3c9cf96b5f4c4bf3366bc80a8b9eb0e03b1e70b99b1cc88a3cbcc7a122ccbd18cc850&scene=21#wechat_redirect)

[picture.image

【集智书童】交流群链接与投稿方式来啦~(稿费丰厚)](https://mp.weixin.qq.com/s?__biz=MzU5OTA2Mjk5Mw==&mid=2247499235&idx=2&sn=8927bb7201b93fc0fd6e7273b31cfa1e&chksm=feb81d5dc9cf944b0b014e4408c6f832f5ea6d84129c3a6c849e5bff393c48b3c178ab1b43c1&scene=21#wechat_redirect)

[picture.image

YOLOv8来啦 | 详细解读YOLOv8的改进模块!YOLOv5官方出品YOLOv8,必卷!](https://mp.weixin.qq.com/s?__biz=MzU5OTA2Mjk5Mw==&mid=2247499206&idx=1&sn=b01b49167d8dbd01d5f8152972a6778a&chksm=feb81d78c9cf946e14ca82fdbc589491bea34c8e72734a01cc71b067a97fb8e7d9ca5809e310&scene=21#wechat_redirect)

扫码加入【集智书童-模型部署 】交流群

picture.image

想要了解更多前沿AI视觉感知全栈知识【 分类、 检测分割关键点车道线检测3D视觉(分割、检测)多模态目标跟踪N erF 】、行业技术方案【 AI安防AI医疗AI自动驾驶 】、AI模型部署落地实战【 CUDATensorRTNCNNOpenVINOMNNONNXRuntime 以及 地平线框架 等】,欢迎扫描下方二维码,加入集智书童知识星球,日常分享论文、学习笔记、问题解决方案、部署方案以及全栈式答疑,期待交流!

picture.image

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
火山引擎音视频体验白皮书
火山引擎联合AMD发布了音视频体验白皮书,以抖音亿级日活用户实践和大规模场景落地经验,详细解读音视频体验评估指标和模型,分享火山引擎音视频实验室的评测方案和抖音在音视频体验优化上的典型策略、案例,助力企业优化用户体验,促进业务增长。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论