如何设置的iis后台服务网站地址,网站集群系统 如何做域名解析,网站建设与管理是什么工作,今天山东一例发生在哪里【前情回顾】在上一篇文章记录了YOLO源码data目录下的 base.py 文件#xff0c;其中定义了一个可灵活修改的数据加载处理基类——Class BaseDataset 灵活基类博文地址#xff1a;https://blog.csdn.net/qq_58718853/article/details/143249295 【实验代码】所有实验代码上传至… 【前情回顾】在上一篇文章记录了YOLO源码data目录下的 base.py 文件其中定义了一个可灵活修改的数据加载处理基类——Class BaseDataset 灵活基类博文地址https://blog.csdn.net/qq_58718853/article/details/143249295 【实验代码】所有实验代码上传至Gitee仓库。会根据博文进度实时更新 Gitee链接https://gitee.com/machine-bai-xue/yolo-source-code-analysis 如果链接失效访问404拒绝可以直接在Gitee码云主页搜索——“机器白学”所有项目中的YOLO源码实验就是本系列所有实验代码。 【本节预告】本文继续在 data 目录下解析 dataset.py 文件内容。没有按顺序解析build.py文件的原因是在build.py实现的功能中需要先导入 dataset.py 定义的数据集类。 因此调整源码解析顺序先对 dataset.py 文件中的类进行解读。 一、dataset.YOLODataset类 1.概述 YOLODataset 类是用于加载和处理 YOLO 格式的目标检测和分割数据集的 PyTorch 数据集类。该类提供了一个结构化的方式来加载、处理和增强 YOLO 格式的数据集。通过重用和扩展父类 base.py.BaseDataset 的逻辑确保了代码的灵活性和可维护性。 下图展示了其类的方法函数总览其中红色框里的方法是根据基类同名方法的重写。下面将先解读这些重写方法因为其在初始化该类的时候就隐含在其基类逻辑中运行了而其他的方法需要在实例化本类后调用使用因此在后面记录。 2.__init__初始化传参入基类 首先来看该类的初始化方法。其最主要的逻辑就是通过 super函数调用基类——BaseDataset的 init 初始化方法将参数传递给基类并运行初始化中的逻辑函数。具体逻辑参考上一篇文章——Data.Base.py.BaseDataset可灵活改写的数据集加载处理基类 其中*args 对应BaseDataset中的图片地址img_path对应下图黄色框内参数**kwargs 对应BaseDataset其他的已经“命名”的参数对应下图蓝色框内多个参数 在此特别记录一下 *args 和 **kwargs 的含义和区别。 *args传入任意数量的位置参数——位置参数是指在函数中按顺序传入的变量。如果存在多个参数则以元组的方式传入。下面的代码给出了一个抽象例子这种写法本质上是简化了代码书写量。 # 定义一个功能函数
def func(*args):...# 等价定义
def func(v1, v2, v3):...# 传参使用这个功能函数
func(value1, value2, value3) **kwargs传入任意数量的关键字参数——关键字参数是指在函数中按命名好的参数名来传入的变量。如果存在多个命名参数则以字典的方式传入。下方例子可以看出关键字参数传参不一定要按顺序。 # 定义一个功能函数
def func(**kwargs):...# 等价定义
def func(value1None, value2None, value3None):...# 传参使用这个功能函数
func(value3, value2, value1) 下面记录其初始化参数的表格。
*args根据基类BaseDataset设置此处需要传入图片地址img_pathstrdata传入数据集 .yaml 配置文件的字典格式dicttask传入当前的数据集任务模式如“detect”检测任务、“pose”姿态任务......等str**kwargs以关键字参数形式传入基类中的各种超参数具体见BaseDataset类初始化关键字参数 3.get_labels获取标签功能的基类方法重写 从上面YOLO数据加载类的初始化中可知此类的逻辑是调用BaseDataset而这个基类初始化的逻辑顺序是先运行获取标签的方法——get_labels这个在对应BaseDataset文章中介绍 在之前的灵活基类博文中测试实验是自己定义了加载标签的函数。现在看YOLO官方加载训练数据时是如何定义的。 官方获取标签的方式是从 .cache 缓存中加载——如果存在直接加载如果如果不存在则调用self.cache_labels 创建。并且还会检查标签数据中是否存在错误或者缺失等不符合训练格式的数据对检查结果可视化打印并警告报错。下图屏蔽一些不太重要的报错信息代码总览此方法的代码逻辑。 所有的信息检测信息、标签信息等都在红框部分得到。蓝框部分对检测信息进行运用黄框部分对标签数据进行运用。 在一开始构建好的YOLO数据集下没有缓存.cache格式的数据因此最开始训练总要加载数据并缓存的这样的好处是对于相同数据集的重复训练之后的训练读取数据会很快 下面进入这个生成缓存并保存的函数——self.cache_labels 查看其代码逻辑。 此函数输入一个保存缓存文件的地址返回一个包含标签信息的字典并且运行过程中会保存数据集的缓存文件到输入地址。 其最关键的作用功能是使用线程池 ThreadPool 并行处理验证图片和标签文件——这对于大型数据集十分有用。至于具体如何获取信息这和上面图片中直接加载图片缓存文件一样在源码的 utils 模块中编写之后在具体分析。 可以看到黄框中保存的信息和之前数据增强模块输入的数据格式相同有图片地址、图片形状、各种模式的框信息等 同时还要注意其打印的信息模块含义这对于检查数据集是否构建成功十分重要。 例如在下图例子中一共有2250个找到的标签文件其中缺失或为空的数量为零但是存在1110个损坏的标签数量。 下面看看具体可能的损坏原因。因为YOLO训练数据是必须归一化的因此坐标的取值范围必须在0,1直接如果不在则可能报损坏标签的错误。因此在构建数据集时要特别注意这一点。 最后会将信息保存到本地地址具体实现同样在utils部分并返回信息字典。 基于之前初始化类的参数记录可以实际测试一下运行结果。可以看到第一次构建数据集类时会在数据集目录下生成保存一个 label.cache 缓存文件。 4.build_transforms数据预处理数据增强的基类方法重写 下面查看 YOLODataset 重写基类 BaseDataset 的第二个函数方法——build_transforms图片数据预处理。 参考数据增强的文章此处的逻辑并不复杂。分为两种情况如果没有开启数据增强“开关”——augmentFalse那么只会对图片和标签分别做标准化处理并将其转为训练支持的torch格式图片形状标准化——LetterBox标签格式标准化——Format如果开启数据增强——augmentTrue则会根据超参数设定来进行数据增强注意build_transforms这里会生成所有的数据增强transforms如果某些数据增强模块不想使用只需将其对应超参数“变化几率”设置为0 因为这里使用了Compose流水线数据增强类来组织功能逻辑因此可以使用Compose内置的方法打印数据增强功能的具体内容和顺序。 可以从下图看出如果开启增强则对图片的操作按先后顺序是 Mosaic - CopyPaste - RandomPerspective - Mixup - Albumentations - RandomHSV - RandomFlip - RandomFlip - Format 下面不改变官方数据增强默认参数将构建好的数据增强功能实际作用到图片上看得到怎样的结果。 下面是几个实验结果可见变化操作是随机的并且是结果是一张多个变换叠加操作的图。注意从Format一章可知图片是做过颜色翻转的因此颜色都偏蓝不是RandomHSV色调增强的真实结果 5.update_labels_info数据格式的基类方法重写 在基类 BaseDataset 中 update_labels_info 方法被定义为修改标签到用户需要的格式并且是在get_image_and_label 获取图片标签数据方法中运行的。也就是说是将模型torch读取的数据格式转为用户人为方便使用的格式。 该部分逻辑代码也不复杂主要是使用自定义的数据类Instances这将在其对应文件章节具体解读。 6.collate_fn按批次组合训练Torch数据的类装饰器 最后是定义在YOLODataset中的一个装饰器——collate_fn静态方法将输入的单样本类别合并为批次数据字典用于模型训练。 staticmethod类中的装饰器解释 在类中定义方法前加了此内容则代表下面定义的方法是一个装饰器代码该方法有以下三种含义 1.该方法参数输入没有self不依赖类的实例不访问修改类的属性 2.该方法可以从外部直接调用而不一定非要先初始化类的实例 3.该方法虽然不依赖类实例但其具体的操作内容与类紧密相关以一种“工具方法”的方式完成与类相关的任务但不改变类的本身状态。 具体来讲本部分方法主要是将多张批次的图片Torch数据合成一个完整的批次张量如下图所示。 至此关于YOLO源码中基本的数据集构建类分析完毕该类最主要的功能就是读取数据的标签和图片将其转到模型熟悉的Torch格式并且可选择在传入数据前进行数据增强操作。 在当前类同一文件下还有一些扩展类处理诸如多数据格式怎么融合加载其他任务数据集扩展等这些在之后遇到需要时再进行分析解读。 在下一部分紧接数据集的构建分析YOLO源码中数据集加载器部分的源码。