ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

对象检测数据集解析:以 D2L 香蕉检测数据集为例的数据加载与标注格式实战指南

2026/10/1 2:41:57 拓冰建站 浏览量
对象检测数据集解析:以 D2L 香蕉检测数据集为例的数据加载与标注格式实战指南 文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载导读目标检测任务需要图像 物体类别 真实边界框ground-truth bounding box三类信息的配套数据集其数据组织方式与图像分类有着本质差异。本文以《动手学深度学习》D2L仓库中自带的香蕉检测数据集为核心完整讲解该数据集的构建思路、下载方式、CSV 标注格式、read_data_bananas/BananasDataset/load_data_bananas三层数据加载管线以及 mini-batch 中标签的填充padding机制并结合 d2l/torch.py 与 d2l/mxnet.py 中的源码实现进行底层验证。读完本文你将掌握目标检测数据集从标注文件到可训练DataLoader的完整组织范式为后续阅读 SSD、R-CNN 等检测模型如 chapter_computer-vision/ssd.md打下数据基础。为什么目标检测需要一个专门的小数据集在图像分类领域研究者习惯使用 MNIST、Fashion-MNIST 这类小而标准的数据集来快速验证模型。但在目标检测领域并没有同等规模的标准小数据集——公开的检测数据集如 VOC、COCO体积大、标注复杂不适合在教材和快速原型中反复加载。为此原文档作者采取了一个非常工程化的做法人工构造一个 1000 张图片的香蕉检测数据集。具体流程是拍摄办公室里的免费香蕉照片通过对照片进行不同旋转、缩放生成 1000 张香蕉图像将每张香蕉图像随机放置到某些背景图上为每张图像标注香蕉的边界框。这种合成 人工标注的方式让研究者可以在几乎零成本的前提下获得一个包含完整目标类别与位置边界框监督信号的数据集用于快速演示目标检测模型。需要强调的是它只是一个简单的合成数据集真实世界的数据集通常复杂得多。数据集的下载DATA_HUB 注册与 SHA-1 校验在 D2L 中所有可下载数据集都统一注册在d2l.DATA_HUB字典中香蕉检测数据集也不例外#save d2l.DATA_HUB[banana-detection] ( d2l.DATA_URL banana-detection.zip, 5de26c8fce5ccdea9f91267273464dc968d20d72)注册条目是一个二元组第一项是完整下载地址由d2l.DATA_URL拼接文件名得到第二项是该压缩包的SHA-1 校验值。在 d2l/torch.py 中可以看到DATA_URL http://d2l-data.s3-accelerate.amazonaws.com/即文件最终指向banana-detection.zip的公开镜像。SHA-1 校验值的作用体现在底层下载函数download中见 d2l/torch.py先检查本地缓存若目标文件已存在于默认目录../data则逐块每次 1 MB计算其 SHA-1 并与注册值比对一致则直接复用避免重复下载不一致或文件不存在时才通过requests.get重新下载。随后的download_extract见 d2l/torch.py负责解压根据扩展名区分.zip与.tar/.gz解压到数据目录并返回解压后的文件夹路径。整个下载、校验、解压流程对用户完全透明调用方只需一句d2l.download_extract(banana-detection)。数据集目录结构与 CSV 标注格式解压后的香蕉检测数据集采用训练集 / 验证集分离的目录结构banana-detection/ ├── bananas_train/ │ ├── label.csv # 训练集标注 │ └── images/ # 训练图像 └── bananas_val/ ├── label.csv # 验证集标注 └── images/ # 验证图像每个子集的标注统一存放在label.csv中以图像文件名为索引。每行记录包含 5 个数值含义为字段含义第 1 项目标类别索引香蕉数据集全部图像只有香蕉一个类别索引为 0第 2、3 项边界框左上角顶点的 $(x, y)$ 坐标第 4、5 项边界框右下角顶点的 $(x, y)$ 坐标需要特别说明的是CSV 中的坐标以像素为单位取值范围大致在 0 到 256 之间对应 256×256 的图像边长。而模型训练通常偏好归一化坐标因此读取代码会在末尾统一除以 256详见下文将坐标缩放到 $[0, 1]$ 区间。读取数据read_data_bananas 的实现剖析read_data_bananas(is_train)是数据管线的第一层负责把 CSV 标注与图像文件读入内存。以 PyTorch 版本为例见 d2l/torch.py#save def read_data_bananas(is_trainTrue): Read the banana detection dataset images and labels. data_dir d2l.download_extract(banana-detection) csv_fname os.path.join(data_dir, bananas_train if is_train else bananas_val, label.csv) csv_data pd.read_csv(csv_fname) csv_data csv_data.set_index(img_name) images, targets [], [] for img_name, target in csv_data.iterrows(): images.append(torchvision.io.read_image( os.path.join(data_dir, bananas_train if is_train else bananas_val, images, f{img_name}))) # Here target contains (class, upper-left x, upper-left y, # lower-right x, lower-right y), where all the images have the same # banana class (index 0) targets.append(list(target)) return images, torch.tensor(targets).unsqueeze(1) / 256代码的关键处理步骤延迟下载解压通过d2l.download_extract(banana-detection)首次调用时自动下载并解压之后命中本地缓存按is_train选择子集True读取bananas_train/label.csvFalse读取bananas_val/label.csv以img_name为索引set_index(img_name)后逐行迭代用图像文件名拼接出实际图片路径并读入坐标归一化torch.tensor(targets).unsqueeze(1) / 256是关键一步——unsqueeze(1)在类别维后插入一个长度为 1 的维度详见下一节标签形状除以 256 则把像素坐标归一化到 $[0, 1]$。在 MXNet 版本见 d2l/mxnet.py中差异仅在于读图 API 换成image.imread以及通过np.expand_dims(np.array(targets), 1) / 256完成同样的升维与归一化整体逻辑完全一致。标签形状 (batch, m, 5) 与非法框填充机制为什么读取时要unsqueeze(1)升维这与目标检测 mini-batch 的标签组织方式密切相关。在演示代码中#tab all batch_size, edge_size 32, 256 train_iter, _ load_data_bananas(batch_size) batch next(iter(train_iter)) batch[0].shape, batch[1].shape运行后会得到两个形状图像 mini-batch(32, 3, 256, 256)即(batch size, 通道数, 高, 宽)与图像分类任务完全一致标签 mini-batch(32, m, 5)其中m是数据集中任意单张图像所能包含的最大边界框数量。这里存在一个普遍性问题mini-batch 计算要求 batch 内所有样本可通过拼接concatenation形成张量但真实场景中不同图像的边界框数量往往不同。解决方案是填充padding图像边界框数量少于 $m$ 时用非法边界框补齐到 $m$ 个。每个边界框的标签是一个长度为 5 的数组第 1 个元素是框内目标的类别-1表示填充产生的非法边界框区别于真实类别的非负索引后 4 个元素是左上角、右下角两顶点的 $(x, y)$ 坐标取值范围 $[0, 1]$已归一化。对香蕉数据集而言每张图像恰好只有一个边界框因此 $m 1$unsqueeze(1)后标签形状即为(batch, 1, 5)。以非法框-1作为类别占位符的设计在后续基于锚框的目标检测实现如 chapter_computer-vision/anchor.md 中assign_anchor_to_bbox的-1哨兵值中一脉相承是贯穿 D2L 检测章节的统一约定。自定义 Dataset 与 DataLoader 封装BananasDataset把读取逻辑封装为标准 Dataset第二层封装是继承框架标准 Dataset 基类的BananasDataset其职责是让香蕉数据接入框架原生的数据加载体系#tab pytorch #save class BananasDataset(torch.utils.data.Dataset): A customized dataset to load the banana detection dataset. def __init__(self, is_train): self.features, self.labels read_data_bananas(is_train) print(read str(len(self.features)) (f training examples if is_train else f validation examples)) def __getitem__(self, idx): return (self.features[idx].float(), self.labels[idx]) def __len__(self): return len(self.features)要点__init__一次性调用read_data_bananas把全部图像与标签载入内存并打印样本数量方便确认训练集 / 验证集规模__getitem__返回(图像, 标签)对PyTorch 版本把图像转为float32MXNet 版本则先astype(float32)再transpose(2, 0, 1)把 HWC 转为 CHW保证与模型输入约定一致__len__返回样本总数供DataLoader计算迭代轮数。load_data_bananas一键返回训练 / 验证迭代器第三层封装load_data_bananas(batch_size)组装出两个可直接用于训练循环的迭代器#tab pytorch #save def load_data_bananas(batch_size): Load the banana detection dataset. train_iter torch.utils.data.DataLoader(BananasDataset(is_trainTrue), batch_size, shuffleTrue) val_iter torch.utils.data.DataLoader(BananasDataset(is_trainFalse), batch_size) return train_iter, val_iter细节值得注意训练集迭代器开启shuffleTrue以打乱样本顺序随机梯度下降需要验证集则保持顺序读取shuffle取默认的False便于结果复现与逐样本评估。该函数在 d2l/torch.py 与 d2l/mxnet.py 中均有完整实现可直接from d2l import torch as d2l后调用。可视化演示展示图像与边界框数据加载完成后原文档用一个演示片段可视化 10 张图像及其真实边界框#tab pytorch imgs (batch[0][:10].permute(0, 2, 3, 1)) / 255 axes d2l.show_images(imgs, 2, 5, scale2) for ax, label in zip(axes, batch[1][:10]): d2l.show_bboxes(ax, [label[0][1:5] * edge_size], colors[w])这里的处理链条是permute(0, 2, 3, 1)MXNet 用transpose(0, 2, 3, 1)把 CHW 换回 HWC 以便绘制并除以 255 把像素值归一化到 $[0, 1]$d2l.show_images(imgs, 2, 5, scale2)将 10 张图排成 2 行 5 列展示对每张图的标签label[0][1:5]取出归一化的边界框坐标乘以edge_size 256还原为像素坐标再调用d2l.show_bboxes绘制白色边界框底层实现见 d2l/torch.py核心是bbox_to_rect生成 matplotlib Rectangle 并axes.add_patch。从可视化结果可以看到10 张图片中香蕉的旋转角度、尺寸和摆放位置各不相同——这正体现了数据集构造时引入的多样性也说明它是一个便于调试检测流程的合成数据集。仓库中的 img/banana.jpg 即属于该类香蕉素材在 chapter_computer-vision/ssd.md 中还被用作训练完成后推理演示的输入图片。总结回顾本文核心结论香蕉检测数据集由 D2L 团队人工构造1000 张、单一类别、每图一个边界框用于快速演示目标检测模型可从互联网直接下载并通过注册在d2l.DATA_HUB中的 SHA-1 校验值保证数据完整性数据加载流程与图像分类相似同样经过读图 → 封装 Dataset → 构造 DataLoader的管线但目标检测的标签额外携带真实边界框坐标这是图像分类标签所不具备的标签统一组织为(batch, m, 5)张量坐标归一化到 $[0, 1]$第 1 维类别中-1用作填充非法边界框的哨兵值保证变长标注可以拼成定长 mini-batch坐标系约定CSV 原始坐标以像素为单位读取时除以edge_size256完成归一化可视化时再反向乘以边长还原。动手练习展示更多样本修改演示代码随机选取香蕉数据集中其他图像并绘制真实边界框观察不同图像的边界框与物体外观差异如旋转角度、遮挡、背景干扰。思考数据增强的差异若要对目标检测应用随机裁剪等数据增强它与图像分类中的数据增强有何不同提示裁剪后的图像如果只包含物体的一小部分边界框标注应当如何处理例如保留、调整还是丢弃这一问题的工程答案会在 SSD 等检测模型的数据加载实现见 chapter_computer-vision/ssd.md中体现。赞分享文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载相关推荐《动手学深度学习》目标检测数据集指南香蕉检测数据集的下载、加载与边界框标注格式《动手学深度学习》目标检测数据集指南香蕉检测数据集的下载、加载与边界框标注格式 导读 在目标检测领域并不存在像 MNIST、Fashion MNIST 那样人工智能深度学习机器学习教程目标检测数据集构建与处理基于Gluon-Tutorials的香蕉检测案例目标检测数据集构建与处理基于Gluon Tutorials的香蕉检测案例 目标检测数据集概述 目标检测是计算机视觉中的重要任务它不仅要识别图像中的物体类别人工智能深度学习机器学习教程动手学深度学习目标检测数据集香蕉检测数据集的下载、读取与边界框标签详解动手学深度学习目标检测数据集香蕉检测数据集的下载、读取与边界框标签详解 目标检测任务缺少像 MNIST、Fashion MNIST 那样小巧的标准数据集为了人工智能深度学习机器学习教程上一篇华硕ROG屏幕突然发白、色彩配置文件丢失G-Helper 2分钟修复显示颜色教程下一篇3000枚免费生物科学矢量图标Bioicons 让科研插图不再从零手绘创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考