当前位置:   article > 正文

yolov8用法及源码解析 (按照训练流程进行梳理)_yolov8训练代码

yolov8训练代码

这里使用python环境训练而不使用ultralytics包,内容参考docs.ultralytics

1.首先建立一个训练的文件

  1. from ultralytics import YOLO
  2. # 建议添加一个main作为程序入口,可以避免某些多线程报错
  3. if __name__ == '__main__':
  4. ## 加载模型(三选一)
  5. # 1.使用配置文件构建模型
  6. model = YOLO("yolov8n.yaml") # build a new model from scratch
  7. # 2.使用预训练模型构建
  8. model = YOLO("yolov8n.pt") # load a pretrained model (recommended for training)
  9. # 3.使用预训练模型
  10. model = YOLO('yolov8n.yaml').load('yolov8n.pt') # 从配置构建并传递权重#
  11. ## 使用模型
  12. # 训练,可以传入的传参参考ultralytics/cfg/default.yaml里面的Train settings部分
  13. model.train(data="coco128.yaml", epochs=3) # train the model
  14. # 评估
  15. metrics = model.val() # evaluate model performance on the validation set
  16. # 推理,可以传入的传参参考ultralytics/cfg/default.yaml里面的Prediction settings部分
  17. results = model("https://ultralytics.com/images/bus.jpg") # predict on an image
  18. # 导出onnx格式模型文件
  19. path = model.export(format="onnx") # export the model to ONNX format

2.加载模型部分解析

2.1使用配置文件加载

model = YOLO("yolov8n.yaml"),会从Model中的_new方法构建模型

  1. # 根据yaml配置文件初始化一个模型
  2. def _new(self, cfg: str, task=None, model=None, verbose=True):
  3. """
  4. Initializes a new model and infers the task type from the model definitions.
  5. Args:
  6. cfg (str): model configuration file
  7. task (str | None): model task
  8. model (BaseModel): Customized model.
  9. verbose (bool): display model info on load
  10. """
  11. cfg_dict = yaml_model_load(cfg) # 加载yaml配置文件
  12. self.cfg = cfg # self.cfg存储模型配置文件路径
  13. # 如果传入的任务类型参数不为空,则将其赋值给实例变量task;调用guess_model_task函数从模型配置文件中head或文件名猜测任务类型
  14. self.task = task or guess_model_task(cfg_dict)
  15. # model为none,执行smart_load方法返回任务模型的类(ClassificationModel/DetectionModel等)
  16. model = model or self.smart_load('model')
  17. # 使用模型配置字典,verbose和RANK实例化上行任务模型的类。verbose是日志显示
  18. self.model = model(cfg_dict, verbose=verbose and RANK == -1) # build model
  19. # 将配置文件路径保存到self.overrides字典中
  20. self.overrides['model'] = self.cfg
  21. # Below added to allow export from yamls
  22. # 将默认配置文件ROOT / 'cfg/default.yaml'参数字典与self.overrides字典合并,即为default.yaml中的model赋值了。
  23. args = {**DEFAULT_CFG_DICT, **self.overrides} # combine model and default args, preferring model args
  24. # 给实例化的self.model添加args属性,args为一个配置参数的字典
  25. self.model.args = {k: v for k, v in args.items() if k in DEFAULT_CFG_KEYS} # attach args to model
  26. # 给实例化的self.model添加task属性
  27. self.model.task = self.task

2.2使用预训练模型加载

model = YOLO("yolov8n.pt"),会从Model中的_load方法构建模型。

  1. # 根据.pt权重文件初始化一个模型
  2. def _load(self, weights: str, task=None):
  3. """
  4. Initializes a new model and infers the task type from the model head.
  5. Args:
  6. weights (str): model checkpoint to be loaded
  7. task (str | None): model task
  8. """
  9. # 获取weights文件后缀名
  10. suffix = Path(weights).suffix
  11. # 如果是.pt,调用attempt_load_one_weight(weights)方法尝试加载该模型
  12. if suffix == '.pt':
  13. self.model, self.ckpt = attempt_load_one_weight(weights)
  14. # 从模型参数中获取任务类型 self.task,(eg:detect)
  15. self.task = self.model.args['task']
  16. # 调用_reset_ckpt_args方法保存{“data”:值,"imgsz":值,"single_cls":值 ,"task":值}到self.overrides字典和更新self.model.args
  17. self.overrides = self.model.args = self._reset_ckpt_args(self.model.args)
  18. # 模型路径赋值给self.ckpt_path
  19. self.ckpt_path = self.model.pt_path
  20. # 不是“.pt”后缀的权重文件
  21. else:
  22. # 检查文件是否存在,如果不存在,则尝试下载或查找文件,返回文件路径。
  23. weights = check_file(weights)
  24. self.model, self.ckpt = weights, None
  25. # 调用guess_model_task从文件名推测任务名
  26. self.task = task or guess_model_task(weights)
  27. # 权重文件路径赋值给self.ckpt_path
  28. self.ckpt_path = weights
  29. # 模型路径 weights 和任务类型 self.task 分别存储在 self.overrides字典中
  30. self.overrides['model'] = weights
  31. self.overrides['task'] = self.task

 2.3从配置文件构建模型并传递权重

model = YOLO('yolov8n.yaml').load('yolov8n.pt') ,会从Model中的_new方法构建模型,并调用load方法将.pt文件模型参数加载到模型中。

  1. @smart_inference_mode()
  2. def load(self, weights='yolov8n.pt'):
  3. # 将指定权重文件中的参数加载到模型中。使用eg:model = YOLO('yolov8n.yaml').load('yolov8n.pt')构建模型时用到
  4. """
  5. Transfers parameters with matching names and shapes from 'weights' to model.
  6. """
  7. # 检查self.model 是PyTorch 模型
  8. self._check_is_pytorch_model()
  9. # 如果传入的 weights 参数是字符串路径或 Path 对象,
  10. # 则调用 attempt_load_one_weight 方法尝试加载单个权重文件。
  11. # 将加载后的模型赋值给 weights,并将当前模型的相关信息(epoch,best_fitness,model,ema,train_args...)赋值给 self.ckpt。
  12. if isinstance(weights, (str, Path)):
  13. weights, self.ckpt = attempt_load_one_weight(weights)
  14. # 将weights中与self.model模型参数名称和形状匹配的参数加载到模型中
  15. self.model.load(weights)
  16. return self

流程详解 

程序进入ultralytics/models/yolo/model.py的YOLO类中执行初始化,继承Model类

  1. # Ultralytics YOLO 声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
    推荐阅读
    相关标签