从壹开始解读Yolov11【源码研读系列】——Data.build.py:YOLO用于训练Train + 验证Val的无限数据集加载器DataLoader搭建

        【前情回顾】在上一篇文章记录了YOLO源码data目录下的dataset.py 文件中定义的YOLO数据集类——Class YOLODataset,其基于了数据集基类BaseDataset,并重写了关键的数据预处理函数方法。

        YOLODataset数据集类博文地址:Data.dataset.py:模型训练数据预处理/YOLO官方数据集类——YOLODataset

        【实验代码】所有实验代码上传至Gitee仓库。(会根据博文进度实时更新):

        Gitee链接:https://gitee.com/machine-bai-xue/yolo-source-code-analysis

        如果链接失效,访问404拒绝,可以直接在Gitee码云主页搜索——“机器白学”,所有项目中的YOLO源码实验就是本系列所有实验代码。

        【本节预告】在上一篇文章的预告中,解释了为什么没有先解读build.py的原因,现在,有了上一篇文章对于YOLO数据集类YOLODataset的解析基础,可以进一步解读 build.py 文件下的数据加载搭建迭代器的代码逻辑了。

        有了上一篇文章的铺垫,本部分内容变得比较容易了,只需分析关键逻辑,比如数据采样和迭代器搭建,而不用赘述数据集是如何构建的。

目录

一、build._RepeatSampler类:重复迭代采样器

二、build.InfiniteDataLoader类:无限循环和动态重置的数据加载器

        1.__init__():初始化方法

        2.__len__() / __iter__() / reset() :其他方法

三、build.build_dataloader方法:构建YOLO数据集加载器


一、build._RepeatSampler类:重复迭代采样器

        _RepeatSampler  是一个自定义的采样器类,通常用于Pytorch机器学习框架中。它的作用是对给定的采样器 sampler 进行无限次重复,以便在训练过程中永不停止地生成样本。

        该类通过 __iter__ 方法实现了一个无限循环迭代器,使用 yield from 来生成采样器的样本。

二、build.InfiniteDataLoader类:无限循环和动态重置的数据加载器

        在定义好了上述 _RepeatSampler 重复采样类后,YOLO在此基础上扩展 PyTorch 官方的数据加载器 torch.utils.data.dataloader,目的是实现一种可以无限循环工作并且可以自由重置的DataLoader——InfiniteDataLoader。具体代码解析如下。

        1.__init__():初始化方法

        首先查看其类初始化。一开始通过调用父类构造函数 super().__init__() 的方式传递参数调用DataLoader的初始化方式完成基础的初始化,这和之前使用基类的方法一样没什么多说的了。

        继续,特别的,这里使用了Python内置的一个底层方法——object.__setattr__来直接设置对象的属性值,允许特殊情况绕过对属性设置的默认行为。

        为什么要使用这种方式将 dataloader.DataLoader 的batch_sampler替换为_RepeatSampler,下面先详细记录一下。 

        在DataLoader类内有定义batch_sampler相关内容的修改函数——DataLoader.__setattr__,如下图所示。但batch_sampler等类属性值是受保护的,即必须是类没有初始化的情况下才允许修改(self.__initialized 限制参数)

        因此在 InfiniteDataLoader 中使用底层方法 object.__setattr__ , 直接设置属性值,避免了触发DataLoader.__setattr__中的 ValueError 保护机制。

        最后初始化直接调用DataLoader的方法初始化了一个用来迭代数据的迭代器 self.iterator 。DataLoader基类方法也记录在下图,可做参考。

        2.__len__() / __iter__() / reset() :其他方法

         由于其他方法定义都较为简单,统一记录在下。

三、build.build_dataloader方法:构建YOLO数据集加载器

        有了上述类的准备后,就可以创建YOLO的数据加载器了,下面逐行记录了其对应代码含义和作用。可做参考。

        下面整体实验一下上述代码。尝试自己搭建一个YOLO进行训练或验证的无限数据集加载器。测试代码和效果如下。

from ultralytics.cfg import cfg2dict
from ultralytics.data.dataset import YOLODataset
from ultralytics.data.build import build_dataloader

# 数据集生成
cocoyaml = './coco8/coco8.yaml'
cfg = cfg2dict(cocoyaml)
imgpath = './coco8/images'
dataset = YOLODataset(imgpath, data=cfg, task='detect', augment=False)

# 无限数据加载器
dataloader = build_dataloader(dataset=dataset, batch=4, workers=0, shuffle=False)
print(dataloader.sampler)

for batch in dataloader:
    print(batch['im_file']) 
    break    # 人为模拟中断

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

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

相关文章

爬虫重定向问题解决

一,问题 做爬虫时会遇到强制重定向的链接,此时可以手动获取重定向后的链接 如下图情况 第二个链接是目标要抓取的,但它是第一个链接重定向过去的,第一个链接接口状态也是302 二,解决方法 请求第一个链接&#xff0…

ssh无法连接Ubuntu

试了多次ssh都无法连接,明明可以上网 网卡、防火墙、端口都没有问题,就是连接不上 结果是这个版本Ubuntu镜像默认没有安装ssh服务 安装SSH服务:apt-get install openssh-server 开启SSH服务:/etc/init.d/ssh start 就可以连接…

I.MX6U 裸机开发18.GPT定时器实现高精度延时

I.MX6U 裸机开发18.GPT定时器实现高精度延时 一、GPT定时器简介1. GPT 功能2. 时钟源3. 框图4. 运行模式(1)Restart mode(2)Free-Run Mode 5. 中断类型(1)溢出中断 Rollover Interrupt(2&#x…

亚马逊IP关联是什么?我们该怎么解决呢?

亚马逊不仅提供了广泛的商品和服务,也是许多企业和个人选择的电子商务平台。然而,与亚马逊相关的IP关联问题,特别是在网络安全和运营管理方面,经常成为使用亚马逊服务的用户和商家关注的焦点。通过了解亚马逊IP关联的含义、可能的…

摄影:相机控色

摄影:相机控色 白平衡(White Balance)白平衡的作用: 白平衡的使用环境色温下相机色温下总结 白平衡偏移与包围白平衡包围 影调 白平衡(White Balance) 人眼看到的白色:会自动适应环境光线。 相…

Python模块、迭代器与正则表达式day10

1、Python模块 1.1模块的简介 在编写代码的时候,创建的.py文件就被称为一个模块 1.2模块的使用 想要在a文件里使用b文件的时候,只要在a文件中使用关键字import导入即可 1.2.2 from ...import...语句 导入模块可以使用import,如果只导入模…

鸿蒙系统下使用AVPlay播放视频,封装播放器

鸿蒙系统下使用AVPlay开发一款视频播放器流程 一. 申请权限 申请相关权限&#xff0c;主要是读取存储卡权限&#xff0c;方便后面扫描视频用&#xff1a; getPermission(): void {let array: Array<Permissions> [ohos.permission.WRITE_DOCUMENT,ohos.permission.REA…

城电科技|太阳能折叠灯:点亮你的便捷之光

朋友们&#xff0c;今天要给你们介绍一款能让生活变得更加美好的神器 —— 太阳能折叠灯&#xff01; 【超便捷折叠设计】 它就像一个百变精灵&#xff0c;轻松折叠起来后小巧玲珑。可以随意塞进背包的缝隙&#xff0c;或者放在车载储物箱里&#xff0c;完全不占地方&#xff…

二次封装的天气时间日历选择组件

这个接口没调通 没有数据展示~ userStore.badgeDate是VUEX全部存的日历数据 <template><!-- 日历组件 --><el-date-pickerref"elPicker":size"size"v-model"dateTimeValue":type"dateType":range-separator"rang…

PLC与PLC跨网段通讯的几种方法:厂区组网实践

PLC通常通过以太网或其他工业网络协议&#xff08;如PROFINET、Modbus TCP等&#xff09;进行通信。当PLC位于不同的网段时&#xff0c;它们不能直接通信&#xff0c;需要特殊的配置或设备来实现通信&#xff0c;不同网段的PLC通讯变得尤为重要。 随着工业网络的发展和工业4.0概…

常见的上网方式:PPPoE、静态IP、动态IP地址

常见的上网方式有&#xff1a;PPPoE、静态IP、动态IP地址三种。本文给予简单的介绍&#xff1a; 1.PPPoE PPPoE也叫宽带拨号上网&#xff0c;拨号宽带接入是当前最广泛的宽带接入方式&#xff0c;运营商分配宽带用户名和密码&#xff0c;通过用户名和密码进行用户身份认证。如…

elasticsearch介绍和部署

1 elasticsearch介绍 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。可以很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性。Elasticsearch 的实现原理主要分为以下几个步骤&#xff0c;首先用户将数据提交到Elasticsea…

在SpringBoot项目中集成MongoDB

文章目录 1. 准备工作2. 在SpringBoot项目中集成MongoDB2.1 引入依赖2.2 编写配置文件2.3 实体类 3. 测试4. 文档操作4.1 插入操作4.1.1 单次插入4.1.2 批量插入 4.2 查询操作4.2.1 根据id查询4.2.2 根据特定条件查询4.2.3 正则查询4.2.4 查询所有文档4.2.5 排序后返回 4.3 删除…

Linux相关概念和易错知识点(21)(软硬链接、动静态库)

目录 1.软硬链接 &#xff08;1&#xff09;软链接 &#xff08;2&#xff09;硬链接 ①实现方式及其功能 ②硬链接在目录中的运用 ③计算子目录数量 2.动静态库 &#xff08;1&#xff09;动态库 ①动态链接和静态链接 ②动态库的实现 ③系统查找动态库问题 ④解决…

Leetcode 组合

使用回溯来解决此问题。 提供的代码使用了回溯法&#xff08;Backtracking&#xff09;&#xff0c;这是一种通过递归探索所有可能解的算法思想。以下是对算法思想的详细解释&#xff1a; 核心思想&#xff1a; 回溯法通过以下步骤解决问题&#xff1a; 路径选择&#xff1a…

工具学习_Docker

0. Docker 简介 Docker 是一个开源平台&#xff0c;旨在帮助开发者构建、运行和交付应用程序。它通过容器化技术将应用程序及其所有依赖项打包在一个标准化的单元&#xff08;即容器&#xff09;中&#xff0c;使得应用程序在任何环境中都能保持一致的运行效果。Docker 提供了…

【从零开始的LeetCode-算法】3233. 统计不是特殊数字的数字数量

给你两个 正整数 l 和 r。对于任何数字 x&#xff0c;x 的所有正因数&#xff08;除了 x 本身&#xff09;被称为 x 的 真因数。 如果一个数字恰好仅有两个 真因数&#xff0c;则称该数字为 特殊数字。例如&#xff1a; 数字 4 是 特殊数字&#xff0c;因为它的真因数为 1 和…

day06(单片机高级)PCB设计

目录 PCB设计 PCB设计流程 元器件符号设计 原理图设计 元器件封装设计 元器件库使用 PCB设计 目的&#xff1a;学习从画原理图到PCB设计的整个流程 PCB设计流程 元器件符号设计 元器件符号&#xff1a;这是电子元器件的图形表示&#xff0c;用于在原理图中表示特定的元器件。例…

Oracle JDK(通常简称为 JDK)和 OpenJDK区别

Java 的开发和运行时环境主要由两种实现主导&#xff1a;Oracle JDK&#xff08;通常简称为 JDK&#xff09;和 OpenJDK。尽管它们都基于同一个代码库&#xff0c;但在一些关键点上有所区别。以下是详细的对比&#xff1a; 1. 基础代码 Oracle JDK&#xff1a; 基于 OpenJD…

LeetCode 101题集(随时更新)

题集来源&#xff1a;GitHub - changgyhub/leetcode_101: LeetCode 101&#xff1a;力扣刷题指南 使用C完成相关题目&#xff0c;以训练笔试 贪心 采用贪心的策略&#xff0c;保证每次操作都是局部最优的&#xff0c;从而使最后得到的结果是全局最优的。 分配问题 455. 分发饼…