Ultralytics代码修改dataset和dataloader适用于自己的数据集

 前言

需求概述:我有两个模态的数据集,这两个模态的数据集是一一对应的,即文件名相同。数据集格式如下,我想要将两个模态的图片一一对应打包在一起。

然后在输入模型之前,取出其中一个模态传入模型()训练。

YOLO的U版代码封装了很多层,不容易找到dataset  和 dataloader的加载地方,下面是YOLO检测的训练流程,建议先浏览。


一、dataset

检测Detection的dataset入口在ultralytics/models/yolo/detect/train.py的build_dataset中。我们可以新建一个build_dataset的函数来替换掉这里的build_yolo_dataset。

1.1  替换build_yolo_dataset函数

原来的build_yolo_dataset函数在ultralytics/data/build.py中。

在ultralytics/data/build.py中新建一个build_rgbs_dataset()函数,需要重新创建一个自己的dataset类(RGBSDataset),然后return 的时候实例化这个类。

记得在ultralytics/data/dataset.py创建完RGBSDataset以后,在build.py文件开头import 这个类

在ultralytics/models/yolo/detect/train.py 开头import build_rgbs_dataset函数


 1.2 改写YOLODataset

我们自己的dataset类  (RGBSDataset)  需要参考   YOLODataset(ultralytics/data/dataset.py),而YOLODataset  其实是   BaseDataset(ultralytics/data/base.py)的子类,复写了他的函数扩展了部分功能。

(详情请看这篇博客:Ultralytics中的YOLODataset和BaseDataset-CSDN博客

所以我们也可以在YOLODataset() 的相同文件下,新建一个RGBSDataset()类,并且继承BaseDataset(), 然后针对部分功能复写或者拓展。

注意要在dataset的同级目录下的__init__.py文件中添加我们新建的类。


1.2.1 __init__初始化

关键是需要传入两个模态的图片和标签路径的根路径或者直接单独分别传入。

 ① 加载

### 如何使用自定义数据集训练 YOLOv11 进行 OBB 检测 #### 数据集构建要求 为了成功训练YOLOv11进行定向边界框(OBB)检测,需遵循特定的数据集构建准则。这包括但不限于图像文件及其对应的标注信息的整理方式。每张图片应配有详细的OBB标注详情,这些信息对于模型理解物体的方向至关重要[^2]。 #### 准备环境与安装依赖库 在Google Colab环境中启动一个新的笔记本,并确保已安装必要的Python包来支持YOLOv11框架的操作。通常情况下,可以通过运行如下命令完成环境设置: ```bash !pip install ultralytics ``` #### 下载预训练权重 利用官方提供的预训练模型作为初始化参数可以加速收敛过程并提高最终效果。可以从Ultralytics发布的资源中获取适合YOLOv11的小型版本`yolo11n`或其他变体[^3]。 #### 编写配置文件 创建一个描述实验设定的YAML格式配置文件,其中指定了输入尺寸、批量大小等超参数;同时也明确了所使用的backbone网络结构其他组件的选择。针对OBB任务特别需要注意的是要调整损失函数部分以适应旋转矩形而非普通的水平边框[^1]。 #### 构建数据加载器 编写代码片段读取本地磁盘上的图片列表及相应的标签记录,形成PyTorch DataLoader实例供后续迭代调用。这里假设已经按照前述提到的标准组织好了所有素材,则可以直接参照模板实现这一功能模块。 ```python from pathlib import Path import yaml from torch.utils.data import Dataset, DataLoader from PIL import Image import numpy as np class CustomOBBDataset(Dataset): def __init__(self, root_dir, transform=None): self.root_dir = Path(root_dir) with open(self.root_dir / 'annotations.yaml', 'r') as f: self.annotations = list(yaml.safe_load(f).values()) self.transform = transform def __len__(self): return len(self.annotations) def __getitem__(self, idx): img_path = str(self.root_dir / self.annotations[idx]['filename']) image = Image.open(img_path).convert('RGB') boxes = [] labels = [] for obj in self.annotations[idx]["objects"]: box = [ float(obj['bbox'][0]), float(obj['bbox'][1]), float(obj['bbox'][2]), float(obj['bbox'][3]) ] angle = float(obj.get('angle', 0)) # Convert to format expected by model (if necessary) ... boxes.append(box) labels.append(int(obj["category_id"])) sample = { "image": image, "boxes": np.array(boxes), "labels": np.array(labels) } if self.transform is not None: sample = self.transform(sample) return sample train_dataset = CustomOBBDataset('./data/train/') val_dataset = CustomOBBDataset('./data/valid/') batch_size = 8 num_workers = 2 train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=num_workers) val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False, num_workers=num_workers) ``` #### 训练流程设计 最后一步就是搭建完整的训练循环逻辑,在此期间不断更新神经网络内部状态直至满足停止条件为止。考虑到实际应用中的复杂性多样性,建议采用早停法(Early Stopping)机制防止过拟合现象发生的同时也节省计算成本。 通过上述步骤,便可以在个人定制化的数据集合之上有效地开展基于YOLOv11架构下的OBB目标识别工作了[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小老大MUTA️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值