当前位置:   article > 正文

YOLOv8训练

yolov8训练

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

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中。

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

关于ultralytics的名字

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

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

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

 

issue链接:https://github.com/ultralytics/ultralytics/issues/179

关于自定义配置模型训练

结合上面的讨论,自然而然会有这个想法,既然ultralytics要建一个集成训练框架,那么能否直接在ultralytics仓库上直接配置和训练yolov5呢,笔者做了下面一系列的尝试:

  • 在models中加入相应的.yaml文件和yolov5沿用的模块,如common.py、experimental.py、google_utils.py

  • models/common.py中,加入了yolov5所需的网络结构

  1.   class C3(nn.Module):  
  2.     # CSP Bottleneck with 3 convolutions  
  3.     def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_inch_out, number, shortcut, groups, expansion  
  4.         super().__init__()  
  5.         c_ = int(c2 * e)  # hidden channels  
  6.         self.cv1 = Conv(c1, c_, 11)  
  7.         self.cv2 = Conv(c1, c_, 11)  
  8.         self.cv3 = Conv(2 * c_, c21)  # optional act=FReLU(c2)  
  9.         self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0for _ in range(n)))  
  10.   
  11.     def forward(self, x):  
  12.         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)"函数,

  1.     def __init__(self, model='yolov8n.yaml'type="v8") -> None:  
  2.         """  
  3.         Initializes the YOLO object.  
  4.   
  5.         Args:  
  6.             model (str, Path): model to load or create  
  7.             type (str): Type/version of models to use. Defaults to "v8".  
  8.         """  
  9.         self.type = type  
  10.         self.ModelClass = None  # model class  
  11.         self.TrainerClass = None  # trainer class  
  12.         self.ValidatorClass = None  # validator class  
  13.         self.PredictorClass = None  # predictor class  
  14.         self.model = None  # model object  
  15.         self.trainer = None  # trainer object  
  16.         self.task = None  # task type  
  17.         self.ckpt = None  # if loaded from *.pt  
  18.         self.ckpt_path = None  
  19.         self.cfg = None  # if loaded from *.yaml  
  20.         self.overrides = {}  # overrides for trainer object  
  21.         self.init_disabled = False  # disable model initialization  
  22.   
  23.         # Load or create new YOLO model  
  24.         {'.pt'self._load, '.yaml'self._new}[Path(model).suffix](model)  

读取模型和配置是在"__init__"的最后一行:

  1. # Load or create new YOLO model  
  2. {'.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定义和配置上的问题,那么就没有再往下修改的必要了,还是等官方团队的更新和修改吧,等等党永远不亏。

关于v8的多任务使用

根据官方的文档介绍,还有对代码的分析,目前v8项目是支持检测、分类和分割的。设定是通过"task"进行区分任务,又通过mode来设置是训练还是检测的模式,如下使用:

  1. yolo task=detect    mode=train    model=yolov8n.yaml    epochs=1 ...  
  2.             ...           ...           ...  
  3.           segment        predict        yolov8n-seg.pt  
  4.           classify        val           yolov8n-cls.pt  

训练

 

预测 

验证

  • !关于这三个任务,YOLOv8_Efficient项目后续会分别设置相应的模块用于执行,目前正在更新中。

附件

YOLOv8读取权重

  1. def attempt_load_weights(weights, device=None, inplace=True, fuse=False):  
  2.     # Loads an ensemble of models weights=[a,b,c] or a single model weights=[a] or weights=a  
  3.     from ultralytics.yolo.utils.downloads import attempt_download  
  4.   
  5.     model = Ensemble()  
  6.     for w in weights if isinstance(weights, list) else [weights]:  
  7.         ckpt = torch.load(attempt_download(w), map_location='cpu')  # load  
  8.         args = {**DEFAULT_CONFIG_DICT, **ckpt['train_args']}  # combine model and default args, preferring model args  
  9.         ckpt = (ckpt.get('ema'or ckpt['model']).to(device).float()  # FP32 model  
  10.   
  11.         ...  

YOLOv5读取权重

  1. def attempt_load(weights, device=None, inplace=True, fuse=True):  
  2.     # Loads an ensemble of models weights=[a,b,c] or a single model weights=[a] or weights=a  
  3.     from models.yolo import Detect, Model  
  4.   
  5.     model = Ensemble()  
  6.     for w in weights if isinstance(weights, list) else [weights]:  
  7.         ckpt = torch.load(attempt_download(w), map_location='cpu')  # load  
  8.         ckpt = (ckpt.get('ema'or ckpt['model']).to(device).float()  # FP32 model  
  9.         ...  

参考

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

whaosoft aiot http://143ai.com   

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/130920
推荐阅读
相关标签
  

闽ICP备14008679号