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 characters
        if 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 return
        return {**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 and
    enables 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 from
            https://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)所需要的参数的过程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端 - 基础 表单标签 - 表单元素 input - (name Value checked maxlength )属性详解

目录 name 属性 Value 属性 Checked 属性 Maxlength 属性 场景问答 # <input> 标签 除了 type 属性外&#xff0c;还有其他常用属性 >>> name 属性 在上一节 我们遇到的 单选按钮 &#xff0c;为什么 本应该 多选一 结果成了 多选多的问题 就…

深度学习_NLP常用库报错问题解决

1、SpaCy can‘t find model ‘zh_core_web_sm‘. It doesn‘t seem to be a python package or a valid path to a data 或者 can‘t find model ‘en_core_web_sm‘. It doesn‘t seem to be a python package or a valid path to a data 安装最新的版本&#xff1a; en_…

卡通纸箱空空如也404源码

源码介绍 卡通纸箱空空如也404源码&#xff0c;喜欢的小伙伴可以下方预览看看&#xff0c;满意之后下载放到任何目录都可以使用&#xff01; 源码下载 卡通纸箱空空如也404源码

Vue2.x安装Tinymce依赖冲突解决

Vue2.x安装Tinymce依赖冲突原因 使用vue整合tinymce富文本编辑器&#xff0c;安装依赖时报错 报错的原因是下载版本与vue的版本对不上vue2.x版本应该使用如下指定版本依赖更合适 npm install --save "tinymce/tinymce-vue^3.1"额外依赖为 npm install --save &quo…

【漏洞复现】通天星CMSV6车载视频监控平台Druid弱口令漏洞

Nx01 产品简介 通天星车载视频监控平台软件拥有多种语言版本&#xff0c;应用于公交车车载视频监控、校车车载视频监控、大巴车车载视频监控、物流车载监控、油品运输车载监控等公共交通上。 Nx02 漏洞描述 通天星车载视频监控平台存在Druid弱口令漏洞&#xff0c;攻击者可以通…

【Kotlin】委托模式

1 委托模式简介 委托模式的类图结构如下。 对应的 Kotlin 代码如下。 fun main() {var baseImpl BaseImpl()var baseWrapper BaseWrapper(baseImpl)baseWrapper.myFun1() // 打印: BaseImpl, myFun1baseWrapper.myFun2() // 打印: BaseImpl, myFun2 }interface Base {fun my…

yolov5 v7.0打包exe文件,使用C++调用

cd到yolo5文件夹下 pyinstaller -p 当前路径 -i logo图标 detect.py问题汇总 运行detect.exe找不到default.yaml 这个是yolov8里的文件 1 复制权重文件到exe所在目录。 2 根据报错提示的配置文件路径&#xff0c;把default.yaml复制放到相应的路径下。&#xff08;缺少相应…

【C++入门】类和对象

目录 类的引入 类的定义 类的访问限定符及封装 访问限定符 封装 类的作用域 类的实例化 this指针 this指针的特性 两个经典问题 类的引入 在C语言的结构体中&#xff0c;只能定义变量。C在此基础上进行了升级&#xff0c;在C中&#xff0c;结构体内既可以定义变量&a…

【Leetcode】top 100 二分查找

35 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。 基础写法&#xff01;&#xff01;&#xff01;牢记…

SAP 批次号过期了不让过账配置 OMCQ - M7 667 671消息号设置为E

系统默认&#xff0c;批次到期过账时只是警告&#xff0c;仓库希望直接卡死 这种不需要增强&#xff0c;直接配置就好了 OMCQ 找到 M7 667 编号&#xff0c;把W改成E就可以了 改成E之后&#xff0c;这个过账就直接报错了 保险起见&#xff0c;把667和671都设置为E

C++ | Leetcode C++题解之第3题无重复字符的最长子串

题目&#xff1a; 题解&#xff1a; class Solution { public:int lengthOfLongestSubstring(string s) {// 哈希集合&#xff0c;记录每个字符是否出现过unordered_set<char> occ;int n s.size();// 右指针&#xff0c;初始值为 -1&#xff0c;相当于我们在字符串的左…

Linux 磁盘分区、挂载、使用情况

Linux无论有几个分区&#xff0c;分给哪一个目录使用&#xff0c;归根结底都只有一个根目录&#xff0c;独立且唯一的文件结构。 Linux中的每个分区都是用来组成整个文件系统的一部分。 Linux采用了一种“载入”的处理方法&#xff1a;整个文件系统包含了一整套的文件目录&…

神经网络发展历程:DNN、CNN、RNN

系列文章目录 李沐《动手学深度学习》多层感知机 模型概念和代码实现 李沐《动手学深度学习》卷积神经网络 相关基础概念 李沐《动手学深度学习》卷积神经网络 经典网络模型 李沐《动手学深度学习》循环神经网络 相关基础概念 李沐《动手学深度学习》循环神经网络 经典网络模型…

深入探究Shiro反序列化漏洞

Shiro反序列化漏洞 什么是shiro反序列化漏洞环境搭建漏洞判断rememberMe解密流程代码分析第一层解密第二层解密2.1层解密2.2层解密 exp 什么是shiro反序列化漏洞 Shiro是Apache的一个强大且易用的Java安全框架,用于执行身份验证、授权、密码和会话管理。使用 Shiro 易于理解的…

docker-compse安装es(包括IK分词器扩展)、kibana、libreoffice

Kibana是一个开源的分析与可视化平台&#xff0c;设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。 Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等&#xff0c;直观的展示数据&#xff0c;从而达到高级的数据…

Redis的配置与优化

一、关系型数据库和非关系型数据库 1.1 关系型数据库 一个结构化的数据库创建在关系模型基础上&#xff0c;一般面向于记录&#xff0c;包括&#xff1a;Oracle、MySQL、SQLServer、Microsoft Access、DB2等 1.2 非关系型数据库 除了主流的关系型数据库外的数据库&#xff0c;都…

JimuReport积木报表 v1.7.4 正式版本发布,免费的JAVA报表工具

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

python高校学生兼职雇佣信息网站vue+django

而随着经济的发展&#xff0c;企业的人力成本也越来越高&#xff0c;而有些工作却存在工作时间不稳定&#xff0c;工作量不确定的特点&#xff0c;不少企业便经常雇佣兼职人员来完成其某些工作而对于另外一-些商家来&#xff0c;有不少产品需要推向校园&#xff0c;因此校园传 …

SSM框架学习——SqlSession以及Spring与MyBatis整合

SqlSession以及Spring与MyBatis整合 准备所需要的JAR包 要实现MyBatis与Spring的整合&#xff0c;很明显需要这两个框架的JAR包&#xff0c;但是只是使用这两个框架中所提供的JAR包是不够的&#xff0c;还需要配合其他包使用&#xff1a; Spring的JAR包MyBatis的JAR包Spring…