yolov8逐步分解(1)--默认参数超参配置文件加载

        本章节将介绍yolov8算法训练过程中的第一步:加载默认训练参数以及超参的配置文件default.yaml。

        Yolov8 训练的入口文件为train.py,文件结构如下图所示:        

1. 执行train函数,函数默认配置参数为cfg=DEFAULT_CFG ,其中DEFAULT_CFG是从模块ultralytics.yolo.utils导入的,是一个全局变量

from ultralytics.yolo.utils import DEFAULT_CFG, LOGGER, RANK, colorstr

2. 获取配置文件的路径

        在ultralytics/yolo/utils目录下的init.py文件中,首先获取文件绝对路径,然后通过FILE.parents[2]获取上2层目录,最后拼接目录获取到yaml配置文件的绝对路径。

FILE = Path(__file__).resolve() #__file__表示当前文件的文件名;.resolve()获取绝对路径;获取文件绝对路径
ROOT = FILE.parents[2]  # YOLO
DEFAULT_CFG_PATH = ROOT / 'yolo/cfg/default.yaml'

3. 配置文件的加载解析及处理代码如下所示

DEFAULT_CFG_DICT = yaml_load(DEFAULT_CFG_PATH) #加载完成后是字典
for k, v in DEFAULT_CFG_DICT.items():if isinstance(v, str) and v.lower() == 'none':  #DEFAULT_CFG_DICT[k] = None
DEFAULT_CFG_KEYS = DEFAULT_CFG_DICT.keys()
DEFAULT_CFG = IterableSimpleNamespace(**DEFAULT_CFG_DICT)

 下面将逐函数讲解:

 3.1  通过yaml_load()函数加载配置文件

DEFAULT_CFG_DICT = yaml_load(DEFAULT_CFG_PATH) #加载完成后是字典

DEFAULT_CFG_DICT是字典类型,此时的数值为配置文件中的键值对,内容如下(部分):

3.1.1 yaml_laod()函数实现如下:

def yaml_load(file='data.yaml', append_filename=False):"""Load YAML data from a file.Args:file (str, optional): File name. Default is 'data.yaml'.append_filename (bool): Add the YAML filename to the YAML dictionary. Default is False.Returns:(dict): YAML data and file name."""print("---------->yaml_load:{}".format(file))with open(file, errors='ignore', encoding='utf-8') as f:s = f.read()  # string# Remove special charactersif not s.isprintable(): #移除所有的非打印字符s = re.sub(r'[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\uD7FF\uE000-\uFFFD\U00010000-\U0010ffff]+', '', s)# Add YAML filename to dict and returnreturn {**yaml.safe_load(s), 'yaml_file': str(file)} if append_filename else yaml.safe_load(s)

        通过open()打开并读取yaml文件,移除所有的非打印字符。

      最后通过yaml.safe_load()完成配置文件的加载。关于yaml文件的使用请参考如下文章python 之yaml库使用总结。

 3.2 对加载后的yaml配置文件进行处理,将键的值为字符串‘none’的值重新赋值为None.

for k, v in DEFAULT_CFG_DICT.items():if isinstance(v, str) and v.lower() == 'none':  #DEFAULT_CFG_DICT[k] = None

        在Python中,`None`是一个特殊的常量,用于表示空值或无值的情况。`None`是一个特殊的Python对象,其类型是`NoneType`。`None`不占据任何空间,也不包含任何值。
3.3  获取所有默认配置的键

DEFAULT_CFG_KEYS = DEFAULT_CFG_DICT.keys()

3.4 将加载后的配置字典转换为一个有命名空间的对象(SimpleNamespace),便于后续的存储和访问。

DEFAULT_CFG = IterableSimpleNamespace(**DEFAULT_CFG_DICT)

        其中IterableSimpleNamespace是一个子类,继承自SimpleNamespace类。

        关于SimpleNamespace的介绍,请参考文章python之SimpleNamespace()使用总结。

3.4.1 IterableSimpleNamespace类的实现如下

import torch
import yaml
from types import SimpleNamespace
class IterableSimpleNamespace(SimpleNamespace):"""Ultralytics IterableSimpleNamespace is an extension class of SimpleNamespace that adds iterable functionality andenables usage with dict() and for loops."""def __iter__(self):"""Return an iterator of key-value pairs from the namespace's attributes."""return iter(vars(self).items())def __str__(self):"""Return a human-readable string representation of the object."""return '\n'.join(f'{k}={v}' for k, v in vars(self).items())def __getattr__(self, attr):"""Custom attribute access error message with helpful information."""name = self.__class__.__name__raise AttributeError(f"""'{name}' object has no attribute '{attr}'. This may be caused by a modified or out of date ultralytics'default.yaml' file.\nPlease update your code with 'pip install -U ultralytics' and if necessary replace{DEFAULT_CFG_PATH} with the latest version fromhttps://github.com/ultralytics/ultralytics/blob/main/ultralytics/yolo/cfg/default.yaml""")def get(self, key, default=None):"""Return the value of the specified key if it exists; otherwise, return the default value."""return getattr(self, key, default)

        至此,将默认配置yaml文件被加载到内存中,并最终转换为一个具有命名空间的全局变量DEFAULT_CFG。此时在启动训练代码时,默认的超参及普通参数配置文件default.yaml被加载并传递到函数中。

        总结,本文章详细介绍了yolov8默认配置文件default.yaml如何被加载并处理成训练函数(train)所需要的参数的过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/576588.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu通过分用户进行多版本jdk配置

前言:本文内容为实操记录,仅供参考! linux安装jdk参考:http://t.csdnimg.cn/TeECj 出发点:最新的项目需要用jdk17来编译,就把服务器的jdk版本升级到了17,但是有一些软件例如nexus还需要jdk1.8进…

新体验、高效能,星河零代码产线加速带动产业新质生产力

2023年12月,在Wave Summit深度学习开发者大会上,飞桨隆重推出了端云协同的低代码开发工具——PaddleX。这款一站式AI开发工具集成了飞桨开发套件多年积累的模型训练、推理全流程开发的优势能力。同时立足产业真实应用场景,内置12个面向产业应…

Linux系统使用Docker部署MinIO结合内网穿透实现公网访问本地存储服务

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼…

Unity2018发布安卓报错 Exception: Gradle install not valid

Unity2018发布安卓报错 Exception: Gradle install not valid Exception: Gradle install not valid UnityEditor.Android.GradleWrapper.Run (System.String workingdir, System.String task, System.Action1[T] progress) (at <c67d1645d7ce4b76823a39080b82c1d1>:0) …

Turborepo 1.13 发布!新终端 UI 与本地任务交互

近日&#xff0c;Turborepo 1.13 带来了全新改进的本地开发体验以及其他增强功能&#xff0c;包括 新终端 UI&#xff1a;在增强的终端体验中与本地任务交互启用最快的默认设置&#xff1a;使用 turbo scan 让本地开发环境更快CI 日志改进&#xff1a;支持四个主要提供商并自动…

WebSocket 和 HTTP 的区别:简单易懂

在当今的数字时代&#xff0c;及时交付内容和维持用户互动已成为网络应用不可或缺的要素。这一需求催生了新的通信规范——WebSocket 和 HTTP&#xff0c;尽管两者都服务于网络通讯&#xff0c;它们之间却存在显着的差异。本篇文章旨在剖析这两种协议在应用案例、技术细节、性能…

R语言使用dietaryindex包计算NHANES数据多种营养指数(2)

健康饮食指数 (HEI) 是评估一组食物是否符合美国人膳食指南 (DGA) 的指标。Dietindex包提供用户友好的简化方法&#xff0c;将饮食摄入数据标准化为基于指数的饮食模式&#xff0c;从而能够评估流行病学和临床研究中对这些模式的遵守情况&#xff0c;从而促进精准营养。 该软件…

AI模型开发 “智能炼金术“:进化合并模型的妙招 !开启AI模型开发的新时代

『 近期&#xff0c;日本大模型公司sakana.ai&#xff08;正是“Transformer八子”之一所创办的公司&#xff09;&#xff0c;把Huggingface上的现成模型拿来“攒一攒”—— 直接就组合出新的强大模型&#xff1f; &#xff01; 』 想出这么 一个进化合并模型的妙招&#xff0c…

DC-5靶机

一.环境搭建 1.下载地址 靶机下载地址&#xff1a;https://download.vulnhub.com/dc/DC-5.zip 2.虚拟机配置 切换nat模式&#xff0c;有问题全选重试和是&#xff0c;打到这了&#xff0c;我感觉这个配置我都不用写了&#xff0c;启动靶机如下图所示即可 二.开始渗透 1.信…

【IC前端虚拟项目】write_path子模块DS与RTL编码

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 read_path的代码完成之后,就可以开始整个项目里复杂度最高、bug最多、时序收敛最为困难的模块——write_path的开发了!我自己写过两次这个虚拟项目,每次都是在这里耗时最久,所以大家也可以挑战一下自…

百源生物诚邀您参观2024上海生物发酵产品与技术装备展

参展企业介绍 百源生物致力于提高微生物工业发酵的过程控制水平&#xff0c;以“发酵过程的智能化”为公司使命&#xff0c;通过反应器设计、营养量化、代谢监控及数据分析等手段让复杂的微生物发酵过程变得透明简单&#xff0c;从而实现发酵过程的精确量化控制。 公司…

Spring Boot 工程开发常见问题解决方案,日常开发全覆盖

本文是 SpringBoot 开发的干货集中营&#xff0c;涵盖了日常开发中遇到的诸多问题&#xff0c;通篇着重讲解如何快速解决问题&#xff0c;部分重点问题会讲解原理&#xff0c;以及为什么要这样做。便于大家快速处理实践中经常遇到的小问题&#xff0c;既方便自己也方便他人&…