动手学深度学习——数据集
1. 前言在前面的内容中我们已经学习了什么是物体检测什么是边界框边界框如何表示目标的位置但是仅仅理解这些概念还不够。如果想真正训练一个物体检测模型我们还必须解决一个核心问题训练数据从哪里来标签又该怎么组织这就引出了本节要学习的内容物体检测数据集Dataset。在图像分类任务中一个样本通常只对应一个类别标签比如这张图片是猫这张图片是狗但在物体检测中情况明显更复杂。因为一张图像中可能包含多个目标而每个目标不仅有类别还要有对应的边界框位置。所以检测数据集的组织方式比分类数据集复杂得多。这一节我们就来学习目标检测数据集长什么样图像和标签是如何对应的标签中通常包含哪些信息《动手学深度学习》中是如何读取检测数据集的2. 为什么物体检测需要专门的数据集格式在分类任务中标签通常非常简单一个数字就够了。例如0 表示猫1 表示狗2 表示汽车模型只需要学习“输入图像 → 输出类别”即可。但是在目标检测中模型需要完成两件事判断目标是什么判断目标在哪里所以一个标签已经不再只是一个类别编号而通常要同时包含目标类别边界框坐标如果一张图中有多个目标那么标签中还需要记录多个目标的信息。也就是说目标检测数据集必须能够描述一张图片中有几个目标每个目标属于什么类别每个目标的位置坐标是多少这就是为什么检测任务需要更复杂的数据组织形式。3. 目标检测数据集的基本组成一个完整的目标检测数据集通常由两部分组成3.1 图像文件也就是原始图片例如img1.jpgimg2.jpgimg3.jpg这些图片中包含我们要检测的目标。3.2 标注文件标注文件记录图片中的真实目标信息也就是常说的ground truth真实标注。对于每个目标通常需要标注类别名称或类别编号边界框位置例如一张图片中有一只狗和一只猫那么对应标注可能类似于[ [dog, x_min, y_min, x_max, y_max], [cat, x_min, y_min, x_max, y_max] ]这就表示图片中有两个目标第一个是狗对应一个边界框第二个是猫对应另一个边界框4. 目标检测标签通常长什么样为了便于训练检测标签往往会写成结构化格式。常见形式包括XMLJSONTXTCSV不同数据集格式不一样但核心信息其实都类似。4.1 VOC 风格Pascal VOC 常用 XML 文件保存标注。每张图片对应一个 XML 文件里面记录图片大小每个目标的类别每个目标的边界框坐标例如一个目标大致会标成类别dogxmin60ymin45xmax378ymax5164.2 COCO 风格COCO 数据集通常用 JSON 文件统一保存标注信息。它不仅保存类别和边界框还可能保存segmentation分割信息area目标面积iscrowd是否为密集对象COCO 的组织更复杂但功能也更强。4.3 YOLO 风格YOLO 系列常用 TXT 文件保存标签通常每张图对应一个.txt文件。每一行表示一个目标格式一般是class_id x_center y_center width height这里的坐标通常会做归一化处理即缩放到 0 到 1 之间。这种格式非常紧凑也便于训练。5. 李沐课程中使用的数据集形式在《动手学深度学习》的物体检测部分李沐老师为了便于教学没有一开始就上特别复杂的 VOC 或 COCO而是先用了一个比较小、比较容易理解的数据集示例。这类教学数据集的特点一般是数据量不大便于快速读取标签结构清晰适合演示检测数据的基本组织方式它的核心目的不是追求工业级规模而是帮助我们理解一张图像是如何与多个边界框标签对应起来的。在教学中往往会将图像路径和边界框标签通过表格、列表或者字典形式进行管理。例如某个样本可能包含图片文件名一个或多个目标类别每个目标的边界框坐标6. 物体检测数据集和分类数据集的根本区别这是很容易考察、也很适合写进博客的一点。6.1 分类数据集分类数据集通常是(图片, 类别标签)例如(cat.jpg, 0) (dog.jpg, 1) (car.jpg, 2)也就是说一张图通常只对应一个标签。6.2 检测数据集检测数据集通常是(图片, 多个目标的类别 多个边界框)例如(img.jpg, [ [class1, x1, y1, x2, y2], [class2, x1, y1, x2, y2] ])这表示同一张图中可能有多个目标。所以检测数据集相比分类数据集的核心难点就在于标签不再是单个值每张图对应的目标数量不固定每个目标都要有类别和位置7. 一个简单的检测数据集示意为了更好理解我们可以看一个简单例子。假设有一张图片catdog.jpg其中有两只动物一只狗一只猫那么它的标注可以写成[ [dog, 60, 45, 378, 516], [cat, 400, 112, 655, 493] ]其中dog表示目标类别(60, 45, 378, 516)表示狗的边界框cat表示另一个目标类别(400, 112, 655, 493)表示猫的边界框这个例子已经能很好说明检测数据集的本质一张图片对应的不再是一个类别而是一组“类别 位置”的组合。8. 数据集读取为什么重要很多初学者会觉得数据集不就是“拿来训练”的吗好像没什么可学的。但实际上深度学习项目里数据读取和标签组织常常决定了整个训练流程能否顺利跑起来。尤其在目标检测中数据集读取至少关系到以下几个问题8.1 图像与标签是否能正确对应比如0001.jpg对应的是不是0001.xml图像路径有没有写错标签文件有没有缺失只要这里出问题训练就会直接报错或者标签错位。8.2 边界框坐标是否正确例如左上角和右下角有没有写反宽高是否为正数坐标是否超出图像范围这些问题都会直接影响模型训练质量。8.3 类别编号是否统一比如cat是否统一映射成 0dog是否统一映射成 1不同文件里的类别顺序是否一致如果类别映射混乱模型训练结果就会完全错误。8.4 不同图片目标数量不同这是检测任务非常典型的特点。有些图片只有 1 个目标有些有 10 个目标所以标签长度并不固定。这就意味着检测数据加载时不能像分类那样简单地直接堆成规则矩阵而要做更灵活的处理。9. 《动手学深度学习》中数据集读取的核心思想虽然教学代码通常不会设计得像工业框架那样复杂但它背后的思想很值得理解。其核心通常包括这几步9.1 读取图像文件先把图片从磁盘加载进来转成张量或者数组形式。9.2 读取对应标签再根据图片编号找到对应的标注信息包括目标类别边界框坐标9.3 将类别和边界框整理成统一格式例如整理成[class_id, x_min, y_min, x_max, y_max]或者[x_min, y_min, x_max, y_max, class_id]具体顺序可以不同但必须统一。9.4 返回训练样本最终一个样本通常会以这样的形式交给模型(图像张量, 标签信息)这里的标签信息可能是一个二维结构因为一张图里可能有多个目标。10. 数据增强与数据集的关系在真正训练检测模型时数据集往往不仅仅是“读出来”就结束了还会配合数据增强Data Augmentation。例如常见增强包括随机裁剪翻转缩放改变颜色Mosaic 拼接但是检测任务中的数据增强比分类更复杂原因在于图像变了边界框也必须跟着一起变。比如图片缩放后框坐标也要按比例缩放图片左右翻转后框的位置也要重新计算图片裁剪后框可能被截断甚至消失所以检测数据集处理不只是“读图”更是“图像与标签同步变换”的过程。11. 为什么高质量数据集对检测任务尤其重要在目标检测里数据质量的重要性甚至比很多人想象得还高。因为模型要同时学两件事识别类别回归位置这意味着只要标签稍微不准影响就会比分类任务更明显。例如边界框画得过大会让模型学到错误背景边界框画得过小会截掉目标关键信息类别标签错了会直接误导模型漏标目标会让模型以为某些真实目标是背景所以在检测任务中常常有一句很实用的话垃圾标注喂不出好检测器。12. 本节总结这一节我们学习了物体检测中的“数据集”基础知识核心内容可以总结为以下几点。12.1 检测数据集比分类数据集复杂分类通常是一张图对应一个类别而检测是一张图对应多个目标每个目标都有类别和边界框。12.2 检测标签必须同时描述“是什么”和“在哪里”也就是类别信息位置信息这两部分缺一不可。12.3 常见检测数据集格式有多种包括VOC 的 XMLCOCO 的 JSONYOLO 的 TXT它们形式不同但核心都在描述目标类别和边界框。12.4 数据读取是检测训练的重要前提只有图像、类别、边界框三者正确对应模型训练才能顺利进行。13. 学习感悟很多人学习深度学习时更容易把注意力放在模型结构上比如卷积层、注意力机制、YOLO、Transformer。但真正做项目后会发现数据集往往才是最基础、也最容易出问题的一环。尤其在目标检测中数据不只是图片本身还包括复杂的目标标注信息。如果不能先把数据集结构理解清楚后面的锚框匹配、损失函数计算、模型训练过程都会显得很抽象。所以这一节虽然没有复杂公式也没有特别炫的模型结构但它其实是目标检测真正落地的起点。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2509051.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!