首页 > 其他分享 >YOLOv9-0.1部分代码阅读笔记-callbacks.py

YOLOv9-0.1部分代码阅读笔记-callbacks.py

时间:2024-12-20 17:30:57浏览次数:7  
标签:函数 hook 0.1 self py callbacks callback 回调

callbacks.py

utils\callbacks.py

目录

callbacks.py

1.所需的库和模块

2.class Callbacks: 


1.所需的库和模块

import threading

2.class Callbacks: 

# 这段代码定义了一个名为 Callbacks 的类,它用于管理和执行在训练过程中的不同阶段调用的回调函数。
class Callbacks:
    # 处理 YOLOv5 Hooks 的所有已注册回调。
    """"
    Handles all registered callbacks for YOLOv5 Hooks
    """

    # 这段代码是 Callbacks 类的构造函数 __init__ 的定义,它初始化类的实例变量。
    # 这是类的构造函数,当创建 Callbacks 类的新实例时会自动调用。
    def __init__(self):
        # Define the available callbacks    定义可用的回调。
        # 初始化一个名为 _callbacks 的实例变量,它是一个字典,用于存储不同训练阶段的回调函数列表。
        # 字典的键是字符串,代表不同的训练阶段或事件(例如 'on_train_start' , 'on_train_batch_end' 等)。
        # 字典的值是列表,每个列表用于存储对应事件的回调函数。
        self._callbacks = {
            # 在预训练例程开始时触发。
            'on_pretrain_routine_start': [],
            # 在预训练例程结束时触发。
            'on_pretrain_routine_end': [],
            # 在训练开始时触发。
            'on_train_start': [],
            # 在每个训练周期(epoch)开始时触发。
            'on_train_epoch_start': [],
            # 在每个训练批次(batch)开始时触发。
            'on_train_batch_start': [],
            # 在优化器执行一步更新后触发。
            'optimizer_step': [],
            # 在梯度归零之前触发。
            'on_before_zero_grad': [],
            # 在每个训练批次结束时触发。
            'on_train_batch_end': [],
            # 在每个训练周期结束时触发。
            'on_train_epoch_end': [],
            # 在验证开始时触发。
            'on_val_start': [],
            # 在每个验证批次开始时触发。
            'on_val_batch_start': [],
            # 在每个验证图像处理结束时触发(通常用于实时数据增强)。
            'on_val_image_end': [],
            # 在每个验证批次结束时触发。
            'on_val_batch_end': [],
            # 在验证结束时触发。
            'on_val_end': [],
            # 在每个训练和验证周期结束时触发( fit 通常指一个完整的训练和验证周期)。
            'on_fit_epoch_end': [],  # fit = train + val
            # 在模型保存时触发。
            'on_model_save': [],
            # 在训练结束时触发。
            'on_train_end': [],
            # 在模型参数更新时触发。
            'on_params_update': [],
            # 在训练流程完全结束时触发,用于清理资源。
            'teardown': [],}
        # 初始化一个名为 stop_training 的实例变量,它是一个布尔值,用于控制训练过程是否应该提前终止。 如果这个变量被设置为 True ,则可以在训练过程中的任何点中断训练。
        self.stop_training = False  # set True to interrupt training
    # 这个构造函数定义了 Callbacks 类的基本结构,使其能够注册、存储和执行训练过程中的各种回调函数。这些回调函数可以用于执行多种任务,例如记录训练进度、评估模型性能、保存模型状态等。通过这种方式, Callbacks 类提供了一种灵活的机制来扩展和自定义训练流程。

    # 这段代码是 Callbacks 类的 register_action 方法的定义,它用于向特定的回调钩子(hook)注册一个新的回调函数。
    # 这是 Callbacks 类的一个方法,定义了如何注册一个新的回调函数。
    # 1.self : 指代类的当前实例。
    # 2.hook : 要注册回调函数的钩子名称。
    # 3.name : 回调函数的名称,这是一个可选参数,默认为空字符串。
    # 4.callback : 实际的回调函数,这也是一个可选参数,默认为 None 。
    def register_action(self, hook, name='', callback=None):
        # 将新操作注册到回调钩子。
        """
        Register a new action to a callback hook

        Args:
            hook: The callback hook name to register the action to
            name: The name of the action for later reference
            callback: The callback to fire
        """
        # 这是一个断言,用于检查提供的 hook 是否存在于 self._callbacks 字典中。 如果 hook 不存在,将抛出一个 AssertionError ,并显示一个错误消息,指出未找到指定的钩子。
        assert hook in self._callbacks, f"hook '{hook}' not found in callbacks {self._callbacks}"    # 在回调 {self._callbacks} 中未找到钩子 '{hook}'。

        # callable(object)
        # 在Python中, callable() 函数用于检查一个对象是否可被调用,即是否是一个函数或者实现了 __call__ 方法的实例。如果对象是可调用的, callable() 返回 True ;否则返回 False 。
        # 参数 :
        # object :要检查是否可调用的对象。
        # 返回值 :
        # 如果 object 是可调用的,则返回 True 。 否则返回 False 。
        # callable() 函数是Python内置的,不需要手动定义,它在 builtins 模块中,可以直接使用。

        # 这是另一个断言,用于检查提供的 callback 是否是一个可调用的对象(例如函数)。 如果 callback 不是可调用的,将抛出一个 AssertionError ,并显示一个错误消息,指出回调不可调用。
        assert callable(callback), f"callback '{callback}' is not callable"    # 回调‘{callback}’不可调用。
        # 如果上述检查通过,这行代码将新的回调函数添加到 self._callbacks 字典中对应钩子的列表里。 每个回调函数被存储为一个字典,包含 name 和 callback 两个键。
        self._callbacks[hook].append({'name': name, 'callback': callback})
    # 这个方法使得用户可以在训练的不同阶段(如每个批次开始、每个批次结束等)注册自定义的回调函数,从而允许在这些特定时刻执行特定的操作。通过这种方式, Callbacks 类提供了一种灵活的机制来扩展和自定义训练流程。

    # 这段代码是 Callbacks 类的 get_registered_actions 方法的定义,它用于获取注册到特定钩子(hook)的所有回调函数,或者如果没有指定钩子,则返回所有注册的回调函数。
    # 这是 Callbacks 类的一个方法,用于获取注册的回调函数。
    # 1.self : 指代类的当前实例。
    # 2.hook : 可选参数,指定要获取回调函数的钩子名称。如果为 None ,则返回所有钩子的回调函数。
    def get_registered_actions(self, hook=None):
        # 返回所有通过回调钩子注册的操作。
        """"
        Returns all the registered actions by callback hook

        Args:
            hook: The name of the hook to check, defaults to all
        """
        # 这行代码是一个条件表达式,根据 hook 参数的值返回不同的结果。
        # 如果 hook 参数被提供(即不是 None ),则返回 self._callbacks 字典中与该钩子关联的回调函数列表。
        # 如果 hook 参数为 None ,则返回整个 self._callbacks 字典,其中包含了所有钩子及其关联的回调函数列表。
        return self._callbacks[hook] if hook else self._callbacks
    # 这个方法允许用户查询特定钩子的回调函数,或者获取所有钩子的回调函数列表,以便于进行进一步的处理或调试。

    # 这段代码是 Callbacks 类的 run 方法的定义,它用于执行注册到特定钩子(hook)的所有回调函数。
    # 这是 Callbacks 类的一个方法,用于触发并执行注册到特定钩子的回调函数。
    # 1.self : 指代类的当前实例。
    # 2.hook : 要触发的钩子名称。
    # 3.*args : 传递给回调函数的位置参数,使用星号(*)表示可变数量。
    # 4.thread : 一个布尔值参数,指示是否在新线程中执行回调函数,默认为 False 。
    # 5.**kwargs : 传递给回调函数的关键字参数,使用双星号(**)表示可变数量。
    def run(self, hook, *args, thread=False, **kwargs):
        # 循环遍历已注册的操作并在主线程上触发所有回调。
        """
        Loop through the registered actions and fire all callbacks on main thread

        Args:
            hook: The name of the hook to check, defaults to all
            args: Arguments to receive from YOLOv5
            thread: (boolean) Run callbacks in daemon thread
            kwargs: Keyword Arguments to receive from YOLOv5
        """

        # 这是一个断言,用于检查提供的 hook 是否存在于 self._callbacks 字典中。 如果 hook 不存在,将抛出一个 AssertionError ,并显示一个错误消息,指出未找到指定的钩子。
        assert hook in self._callbacks, f"hook '{hook}' not found in callbacks {self._callbacks}"    # 在回调 {self._callbacks} 中未找到钩子 '{hook}'。
        # 遍历 self._callbacks 字典中与指定 hook 关联的回调函数列表。
        for logger in self._callbacks[hook]:
            # 检查 thread 参数是否为 True ,即是否需要在新线程中执行回调函数。
            if thread:
                # 如果 thread 为 True ,则为每个回调函数创建一个新的线程,并开始执行。
                # target=logger['callback'] 指定线程执行的目标函数,即回调函数。 args=args 和 kwargs=kwargs 分别传递位置参数和关键字参数给回调函数。 daemon=True 表示该线程是守护线程,当主程序退出时,守护线程会自动结束。
                threading.Thread(target=logger['callback'], args=args, kwargs=kwargs, daemon=True).start()
            # 如果 thread 为 False ,则直接在当前线程中执行回调函数。 使用 *args 和 **kwargs 将位置参数和关键字参数传递给回调函数。
            else:
                logger['callback'](*args, **kwargs)
    # 这个方法允许用户在训练的不同阶段触发执行注册的回调函数,可以选择在新线程中异步执行,或者在当前线程中同步执行。这种设计提高了训练流程的灵活性和可扩展性。
# 这个 Callbacks 类的设计允许用户在训练的不同阶段插入自定义的回调函数,以执行特定的操作,例如记录日志、保存模型、调整学习率等。这种设计提高了训练流程的灵活性和可扩展性。

标签:函数,hook,0.1,self,py,callbacks,callback,回调
From: https://blog.csdn.net/m0_58169876/article/details/144595186

相关文章

  • python 函数方法try中某一条代码异常如何主动抛出该异常得原因【两种方法】
    在Python中,当函数方法中的某一条代码引发异常时,你通常会让Python解释器自动抛出该异常,并在except块中捕获它。然而,如果你想要主动抛出异常(可能是因为你检测到了某个错误条件,或者你想要从某个特定的代码点中断执行并通知调用者),你可以使用raise语句。但是,如果你想要抛出与原始异常......
  • python 函数方法try 用法 案例
    在Python中,try语句用于捕获和处理在代码块执行过程中可能发生的异常。try语句后面通常会跟着一个或多个except子句来指定不同类型的异常处理逻辑,以及一个可选的else子句来指定如果没有异常发生时要执行的代码,还有一个可选的finally子句来指定无论是否发生异常都要执行的清理代码。......
  • python 中try多异常处理
    在Python中,异常处理是通过try、except、else和finally这几个关键字来实现的。下面是一个详细的异常处理例子,它涵盖了这些关键字的用法:defdivide_numbers(a,b):"""这个函数尝试将两个数相除,并处理可能出现的异常。参数:a(intorfloat):被除数b......
  • 实现Python将csv数据导入到Neo4j
    目录一、获取数据集1.1获取数据集1.2以“记事本”方式打开文件​编辑1.3 另存为“UTF-8”格式文件1.4选择“是”二、打开Neo4j并运行2.1创建新的Neo4j数据库2.2分别设置数据库名和密码​编辑 2.3启动Neo4j数据库2.4打开Neo4j数据库 2.5运行查看该数据......
  • Pytorch常用内置损失函数合集
        PyTorch提供了多种内置的损失函数,适用于不同的任务和场景。这些损失函数通常已经优化并实现了常见的归约方式(如mean或sum),并且可以直接用于训练模型。以下是常见的PyTorch内置损失函数及其适用场景:1. 均方误差损失(MeanSquaredError,MSE)类名:nn.MSELoss......
  • vue3.5.13 + vite6.0.1搭建前端项目的配置文件
    main.js//vue版本为3.5.13import{createApp}from'vue'import'./style.css'importAppfrom'./App.vue'import'element-plus/dist/index.css'importrouterfrom'./router/index'constapp=createApp(App)......
  • python可以在命令行上运行的小工具模块
    以下是Python可以在命令行上运行的一些小工具模块,以及它们的用途和用法示例。这些模块大多属于Python的标准库,因此无需额外安装即可使用。模块用途用法示例http.server启动一个简单的Web服务器,用于共享文件或提供简单的Web服务python-mhttp.server在默认端口8000......
  • python 装饰器@property 用法及案例增删改查
    在Python中,@property装饰器允许你将类的方法当作属性来访问,从而实现属性的封装和验证。对于增删改查(CRUD)操作,你可以结合@property、@<属性名>.setter和@<属性名>.deleter装饰器来定义相应的方法。下面是一个完整的例子,展示了如何使用这些装饰器来实现一个简单的CRUD接口:classPe......
  • 基于yolov8的小麦麦穗检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源
       更多目标检测、图像分类识别、目标追踪等项目可看我主页其他文章功能演示:基于yolov8的小麦麦穗检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili(一)简介基于yolov8的小麦麦穗检测系统在pytorch框架下实现的,这是一个完整的项目,包括......
  • python 计时装饰器@timer 用法及案例
    在Python中,装饰器(decorator)是一种高级功能,它允许你在不修改原有函数或方法定义的情况下,为其添加额外的功能。计时装饰器(@timer)是一个常见的例子,用于测量函数或方法的执行时间。下面是一个简单的计时装饰器的实现及其用法案例:计时装饰器实现importtimefromfunctoolsimportw......