做YOLO训练这么久我最常被问到的问题不是“模型用什么结构”而是“数据集去哪找”“怎么才能让模型效果好一点”。模型结构网上教程一堆唯独数据集这块很少有人系统整理过。第03期就是冲着这个需求来的我把平时自己用过的、在项目里踩过坑也吃到过甜头的10个YOLO数据集挑了出来覆盖通用检测、无人机航拍、遥感旋转目标、自动驾驶、密集人群、零售商品、农业、环保公益等方向。不管你是刚学YOLO准备练手还是已经在做具体落地项目都能从里面找到可以直接下载、直接转格式、直接训练的现成资源省掉到处翻论文找链接的折腾时间。1. 内容整体设计与思路拆解1.1 为什么数据集直接决定YOLO训练的上限很多人一开始的注意力全放在网络结构上YOLOv5还是YOLOv8C3还是C2f注意力机制要不要换似乎把模型改一改效果就能飞起。但我在实际项目中的体会是模型结构决定的是性能“下限”附近的调整空间数据集才是决定性能上限的根本。换一个高质量数据集比改十层网络结构收益都明显。原因很简单。YOLO系列都是监督学习模型它学的是“图像特征到标注框”的映射关系。你喂给它的数据里有什么目标、目标长什么样、遮挡到什么程度、光线变化大不大、目标大小分布如何这些直接决定了模型能不能学到有效的特征。我在一个工业检测项目里试过同一套YOLOv5s权重用现场采集的500张图微调和用网上随便找的2000张近似图训练前者的mAP反而高出十几个点。原因就是现场数据与部署场景的分布最接近。这就是所谓的“数据分布决定效果”定律也是我整理这10个数据集时最核心的筛选标准每个数据集都要有明确的使用场景定位而不是单纯看数量大不大。1.2 10个数据集是怎么筛出来的这次挑选主要按三个维度权衡任务覆盖面、格式通用性、上手难度。任务覆盖面是指能不能照顾到主流视觉任务比如通用检测、小目标、旋转框、密集目标、多任务学习格式通用性是指数据集的标注格式是否能比较方便地转换为YOLO需要的txt格式上手难度则考虑到不同读者阶段不同既有适合入门的小型数据集也有适合刷榜的大型数据集。序号数据集核心场景主要任务规模参考1COCO 2017通用目标检测检测/实例分割118K训练图80类2PASCAL VOC 2012入门练手检测/分割约11K图20类3VisDrone 2019无人机航拍小目标检测约10K图10类4DOTA v1.0遥感影像旋转目标检测约1.8K图15类5CrowdHuman密集行人人体检测约24K图1类6BDD100K自动驾驶检测/分割/车道线100K视频帧10类7SKU-110K零售货架密集商品检测约11K图1类8Global Wheat农业遥感麦穗计数约4.7K图1类9TACO野外垃圾环境治理检测约1.5K图60类10Roboflow Universe聚合平台按需搜索平台自带量级这份清单不是网上随便拉个排名而是我实际用过之后按“拿到手能不能快速用起来”排的。后面每个数据集都会给出格式说明、适配YOLO的注意点以及我踩过的坑。1.3 拿到数据集后的大致使用路径很多人下载完数据集就懵了一堆文件夹有json有xml不知道怎么吃到YOLO的训练流程里。这里先给一条通用路径后面的章节再逐个展开。第一步把标注统一转成YOLO格式的txt文件每一行是“类别id 中心点x 中心点y 宽 高”所有数值除以图片宽高归一化。第二步按照train/val/test建好目录图片和标签各自放好。第三步写一个data.yaml指定路径、类别数和类别名。第四步直接用YOLOv5或YOLOv8的train.py开训。整个链路真正卡人的就是第一步格式转换所以我后面专门用一整章讲格式转换和人工标注代码直接给你复制就能用。2. 10个精选数据集逐个拆解2.1 COCO 2017 —— 通用目标的“标准考试”COCO几乎是目标检测领域绕不开的数据集YOLO官方仓库里预训练权重绝大多数是在COCO上训练的效果对比表也都是拿COCO的mAP说话。它的训练集有118K张图、验证集5K张图80个类别包含 person、car、dog、bottle 这些日常目标。每张图平均约7.7个实例遮挡和截断情况很常见正因为这种复杂程度它才能成为通用检测模型的标准benchmark。如果你只是想快速验证环境通不通、跑通一次完整训练流程直接拿COCO的一个子集来做非常合适。我个人的建议是不必一上来就全量训练先随机抽2000张训练、200张验证跑通流程后再考虑全量。另外要注意COCO官方标注是json格式用pycocotools可以读取如果转YOLO格式需要自己写转换脚本后面第三章会给出可直接用的代码。COCO对硬件要求偏高全量训练时显存8G以下建议用yolov5s或yolov8n这类轻量模型。2.2 PASCAL VOC 2012 —— 入坑YOLO的第一课PASCAL VOC是很多人的入门数据集包括我。它类别少、图片数量适中只有20类标注是xml格式包含飞机、自行车、鸟、船、瓶子等常见物体。整个VOC 2012的trainval大概11K张图体积不大CPU训练也不是完全不能跑非常适合第一次接触YOLO训练流程时用来做实验。VOC最大的价值不是刷分数而是拿来理解整个训练链条。我自己第一次跑通YOLOv5就是用的VOC当时被xml的解析折腾了一晚上后来才发现yolo格式和voc其实是两种世界。VOC的xml里记录的是左上角和右下角的坐标而YOLO格式要的是归一化后的中心点和宽高这一步换算新手特别容易出错。如果你学过目标检测的经典框架对VOC一定不陌生用它来做yolo格式转换的练习是最平稳的起点。2.3 VisDrone 2019 —— 无人机航拍小目标检测做无人机、安防监控、智慧城市相关项目的人应该都听过VisDrone。它是由天津大学等机构发布的无人机视角目标检测数据集训练集约6.4K张图、验证集约1.6K张、测试集约3.3K张包含行人、车辆、自行车、三轮车等10个类别。最大的特点是目标普遍很小很多目标在640x640分辨率下只有十几个像素这对YOLO来说是个巨大的挑战。用VisDrone训练我有两个深刻体会。第一锚框一定要重新聚类。默认在COCO上聚类的anchor是针对日常尺度目标的直接拿来检测航拍小目标效果很差。第二小目标增多时要考虑切图策略。把原图切成多块小图每块分别推理再把结果映射回原图坐标实践下来比直接缩放整图有效得多。VisDrone的标注格式有自己的txt结构不能直接喂给YOLO需要做一次字段映射转换后续章节会讲到通用方法。2.4 DOTA v1.0 —— 遥感图像旋转目标检测DOTA是遥感图像目标检测的权威数据集图像来自航空影像和卫星影像包含飞机、船只、储油罐、棒球场、桥梁等15个类别。v1.0版本大概有1.8K张图单张图像尺寸非常大常见的是800x800到4000x4000甚至更高。和普通水平框检测不同DOTA里大量目标带有明显的旋转角度用水平框去框会引入很多背景噪声所以通常采用旋转检测算法。如果你只是用YOLO做水平框检测DOTA也能用但会损失一部分精度。如果项目确实需要旋转检测可以考虑mmrotate这类框架它支持旋转框的标注和训练。热词榜里也有“mmrotate训练dota数据集”说明很多人在做这件事。DOTA的标注格式是“x1 y1 x2 y2 x3 y3 x4 y4 class_name is_truncated”四个点顺序是旋转框的四个顶点转成水平框YOLO格式时需要计算最小外接矩形转成旋转框YOLO角点格式又要保留角度信息。这个转换最容易出错后面会有专门说明。2.5 CrowdHuman —— 密集人群检测与防漏检行人检测在安防、零售、自动驾驶里都有需求但普通数据集里的行人样本太稀疏了根本练不出密集场景下的防漏检能力。CrowdHuman就是专门解决这个问题的训练集约15K张图验证集约4.3K张整个数据集有超过24K张图像标注了大约470K个人体实例。平均每张图超过20人拥挤、遮挡非常严重。它主要标注一个类别“person”标签同时包含可见区域框和全身框这对训练YOLO的全人检测很有帮助。我在用CrowdHuman时建议只取“full_body”这类全身框把可见框过滤掉否则一个行人会出现两个框训练时容易混淆。如果想快速提升模型在拥挤场景下的recall可以把CrowdHuman作为预训练补充数据先用它训练几十个epoch再到你自己的场景数据上微调漏检率会比直接只用自己的数据低很多。2.6 BDD100K —— 自动驾驶全栈数据集BDD100K是伯克利发布的自动驾驶视频数据集包含10万个视频片段抽帧后有约70K训练图和10K验证图标注了10个类别汽车、行人、交通灯、交通标志、自行车等。除了检测它还包含车道线、可行驶区域、语义分割、实例分割等多种标注一个数据集可以同时喂给多个模型做多任务协同非常方便。自动驾驶场景的特殊性在于目标种类多、尺度变化大、光照和天气复杂。BDD100K里白天黑夜雨天雾天都有覆盖这对模型泛化能力是很好的锻炼。不过它的标注时间跨度大部分标签噪声比较明显训练时如果发现个别类别的AP奇低可以先检查一下该类别的标签质量而不是急着调模型。格式方面图片标注是json格式转YOLO时同样要用脚本将矩形框转换为归一化坐标。2.7 SKU-110K —— 密集商品识别与零售场景SKU-110K是我在零售货架识别项目里用过的数据集全称是“A Large-scale Dataset for Robust Product Detection”。它包含约11K张货架图片标注了超过170万个商品实例只有一个类别但目标非常密集货架上的商品互相紧挨着很多框与框之间的IoU极高是测试模型在密集场景下性能的绝佳数据。用SKU-110K训练时最大的感受是NMS参数一定不能照搬默认值。默认的NMS IoU阈值通常是0.45但在商品货架场景里相邻商品的框重叠可能超过0.6阈值太高会把真正不同的商品合并成一个阈值太低又会出现大量重复框。我在这个数据集上做了对比把NMS阈值调到0.3左右配合合适的conf-thres效果明显更稳。另外这类密集检测任务对小目标特别敏感建议开启YOLO的多尺度训练参数增加输入分辨率能带来肉眼可见的提升。2.8 Global Wheat Head Dataset —— 农业场景麦穗检测农业场景的数据集相对少Global Wheat是一个专门做麦穗检测的开源数据集由全球多个研究机构联合发布目的是解决麦穗自动计数问题。它包含约4.7K张田间小麦图像标注了麦穗的边界框只有一个类别但背景复杂光照、生育期、品种差异都很大田间密集的麦穗经常互相遮挡对检测算法提出了不小的挑战。如果做植物表型分析、农作物估产、病虫害检测等方向这个数据集可以当迁移学习的起点。它的标注格式也是常见的csv或json格式转YOLO时需要先统一到同一套坐标体系。我个人的经验是农业图像往往颜色纹理相近目标边界模糊用YOLO训练时给一点HSV增强会比默认增强效果好很多尤其是饱和度轻微的随机扰动能让模型不至于过拟合到特定田块的绿色色调。2.9 TACO —— 野外垃圾检测与环境治理TACO全称Trash Annotations in Context是一个在野外环境中拍摄的垃圾检测数据集包含约1.5K张图像标注了60个类别从塑料瓶、易拉罐到轮胎、渔网都有覆盖。这个数据集的图像大多来自不同地区背景变化很大物体形态和尺寸差异也非常大是一个练手“场景迁移能力”的好数据。做环保公益项目或智慧环卫方案时TACO是很实用的开源资源。但要注意两点第一它类别有60类但很多类别样本极少训练时建议按素材情况合并成大类别比如把纸箱、纸杯、纸袋合并成“纸制品”能显著提升检测效果第二原始标注是COCO格式的json转换时需要对照类别名做映射转错类别ID是新手最容易踩的坑。好在TACO图片量不大CPU也能跑得动适合拿来做数据增强和类别合并的实验练习。2.10 Roboflow Universe —— 按需找数据集的聚合平台前面9个都是特定任务数据集但实际项目里经常需要非常细分的场景比如检测某一种零件、某一种野菜、某一种鱼这种时候就可以去Roboflow Universe这类聚合平台搜。Roboflow Universe是Roboflow官方维护的开源数据集社区上面有上万个用户上传的数据集覆盖工业、农业、医疗、体育、安防等几乎所有领域而且支持直接导出为YOLO格式下载下来就是已经分好类的txt标签省去中间转换的环节。不过平台上的数据集质量参差不齐我自己的筛选标准是优先看下载量和社区评分优先看图片数量和标签数量的比例优先看有没有预分割好的train/val/test目录。很多用户会上传自己的私有数据脱敏后的版本用于论文复现或者项目预研是完全够用的。如果搜出来的数据集质量太差也可以借助平台提供的在线标注功能自己做一份这比从零开始写工具要省事不少。3. 数据集格式转换与标注实操3.1 先搞懂YOLO标签格式归一化坐标YOLO训练时读取的标签是txt文件每一行对应一个目标实例格式为class_id x_center y_center width height这五个值的含义要记牢class_id是从0开始的整数x_center和y_center是目标中心点相对于图片宽度和高度的比例范围是0到1width和height是目标框宽度和高度相对于图片宽度和高度的比例同样是0到1。所有坐标都要归一化不能直接用像素值。举个例子一张640x480的图片里有个目标像素坐标是左上角(100, 50)、右下角(180, 200)。先算宽高宽是80高是150中心点x是140中心点y是125。分别除以图片宽高后得到x_center140/6400.21875y_center125/4800.26042width80/6400.125height150/4800.3125。这根线一定要吃透因为后面所有格式转换都是围绕这个归一化过程展开的。3.2 COCO标注转YOLO格式的Python脚本COCO格式的json是所有数据集中最常见的我直接把一个从COCO json转为YOLO txt的脚本贴出来实测可用复制存成coco2yolo.py就能用。import json import os from pathlib import Path def coco2yolo(json_path, img_dir, out_dir): json_path: COCO标注json文件路径 img_dir: 原始图片所在目录 out_dir: 输出的YOLO标签目录 Path(out_dir).mkdir(parentsTrue, exist_okTrue) with open(json_path, r, encodingutf-8) as f: coco json.load(f) # 建立图片id - 文件名 的映射 images {} for img in coco[images]: images[img[id]] img # 建立类别id - 新连续id的映射 categories {} for i, cat in enumerate(coco[categories]): categories[cat[id]] i # 按图片id聚合并标注 for ann in coco[annotations]: img_id ann[image_id] img images[img_id] width img[width] height img[height] # COCO的bbox是 [x, y, w, h] bbox ann[bbox] x, y, w, h bbox[0], bbox[1], bbox[2], bbox[3] # 转归一化中心点坐标 x_center (x w / 2) / width y_center (y h / 2) / height w_norm w / width h_norm h / height # 类别id要映射到连续id cat_id categories[ann[category_id]] # 图片名.jpg - 同名.txt txt_name os.path.splitext(img[file_name])[0] .txt txt_path os.path.join(out_dir, txt_name) with open(txt_path, a, encodingutf-8) as f: f.write(f{cat_id} {x_center:.6f} {y_center:.6f} {w_norm:.6f} {h_norm:.6f}\n) if __name__ __main__: coco2yolo(annotations.json, images/, labels/)脚本里有个细节必须注意COCO的category_id不是连续的可能从1到90中间空了很多如果你直接拿原始category_id当作YOLO的class_id训练时类别数会对不上。所以脚本里专门做了一个映射字典把原id映射到0到N-1的连续id。这一行就是我踩过坑的地方希望能帮你避开。3.3 LabelImg人工标注YOLO格式的操作流程当现有数据集满足不了需求需要自己标注时LabelImg是最轻量好用的选择之一。安装很简单直接用pip装pip install labelimg启动后在软件里打开图片目录和预输入的保存目录快捷键W开始画框A/D切换上一张下一张CtrlS保存。保存前要在左上角选择YOLO格式这样生成的就是txt文件而不是PASCAL VOC格式的xml。首次标注前需要先定义类别列表LabelImg会生成一个classes.txt里面的顺序就是最终class_id的顺序这个顺序一旦定下来后面就不能随便改否则之前标完的标签全部错乱。我在批量标注时有个习惯一个人只标一类物体或者同一批相似场景的图片这样可以最大限度保证标注一致性。因为标注是纯手工活不同人的框法习惯差异很大有的人喜欢框紧一点有的人喜欢留点边。训练集中同一类目标的框风格不一致会导致模型学到的回归目标不稳定影响最终收敛效果。3.4 训练前的数据检查与目录组织数据转换和标注完成后下一步是组织目录。YOLOv5和YOLOv8默认都接受这样的目录结构dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ └── test/图片和标签靠文件名一一对应比如images/train/0001.jpg对应labels/train/0001.txt。训练前建议写个小脚本检查几类问题有没有图片没有对应标签有没有标签行数比图片实际目标数多标签坐标有没有越界也就是小于0或者大于1。这几个检查看起来基础实际上能帮你过滤掉大量训练时突然跑飞的坑。我自己常用的一行检查命令类似这样python -c from pathlib import Path for txt in Path(labels/.train).glob(*.txt): for line in txt.read_text().splitlines(): parts line.split() if any(abs(float(v)) 1 for v in parts[1:]): print(txt, 越界, line) 如果检查出越界标签直接删掉那一行或者重新生成即可。别小看这些基础检查训练过程中loss变成nan、某个类别AP一直为0很多时候就是标签数据里有脏数据。4. 常见问题与排查技巧实录4.1 自己打标训练后AP为0这是最令人崩溃的问题之一损失正常下降验证集loss也正常结果mAP是0。先别急着改网络优先检查标签。最典型的场景是用LabelImg导出YOLO格式时classes.txt的类别顺序和训练时data.yaml里的names顺序不一致。比如你先标了“猫”再标了“狗”classes.txt是“猫 狗”训练时names写的是“dog cat”结果所有“狗”标签对应的class_id都指向了“猫”模型学到的类别对应关系全是错的。排查方法很简单随便找一张验证集图片把训练集里对应的txt文件打开看看第一列的class_id和图片里实际物体是否对应。再检查data.yaml里的nc和names写的是否和你标注时完全一致。另外还要确认标签坐标是否越界坐标归一化后一旦大于1或小于0模型推理时处理boxes会出问题表现就是recall为0、AP为0。4.2 小目标检测不到怎么调用VisDrone或DOTA这类小目标数据集时最明显的痛点是模型对小目标几乎无感。我的排查顺序是先看anchor是不是重新聚类过再看训练分辨率能不能再提高一点最后考虑其他增强手段。YOLOv5和YOLOv8都提供了锚框聚类脚本YOLOv5可以直接在训练时加参数YOLOv8会自动根据数据集做anchor自适应但实际效果上手动检查一下更稳妥。分辨率的影响非常直观。默认输入640x640如果你的原图是1920x1080一个小目标在32倍下采样的特征图上可能只剩几个像素点特征完全丢失。把输入分辨率提高到1280或更高小目标AP会有肉眼可见的上升代价是显存和训练时间增加。我实测在VisDrone上输入从640提升到1280mAP能提升差不多5到10个点这个收益比任何注意力模块都来得实在。4.3 训练数据太少怎么办很多时候项目里自定义数据只有几百张图这时候直接从头训练YOLO效果通常不太好。我的做法是先下载官方在COCO上的预训练权重然后在此基础上微调。YOLOv5的yolov5s.pt、YOLOv8的yolov8n.pt都自带COCO预训练参数训练时指定预训练权重路径即可模型会把已经学会的通用特征迁移到你的任务上。其次可以加强数据增强策略。像mosaic增强、随机仿射变换、HSV色域扰动这几个基础增强对数据量少的情况特别有效。但也不要过度增强太猛会造成训练集和验证集分布偏差太大反而拉低验证指标。最后如果类别特别不平衡少数类样本少得可怜建议对少数类做过采样也就是把稀有类图片在训练时多复制几份进dataloader比直接改损失函数更方便可控。4.4 推理阶段置信度门限怎么调热词榜里有“yolo 检测 调整置信度门限”说明这个问题困扰了不少人。做推理时YOLO有两个核心阈值conf-thres和iou-thres。conf-thres是置信度阈值只有目标置信度超过这个值的框才会被保留。调低conf-thresrecall上升、precision下降意味着你会漏检更少但误检更多调高conf-thres则相反。iou-thres是NMS阶段的重叠阈值它决定两个高重叠框会不会被合并成同一个。CrowdHuman和SKU-110K那种目标密集重叠的场景这个参数要重点调。我的经验是推理阶段先按conf-thres0.05和iou-thres0.5输出一次结果看一下模型的真实上限然后再根据业务需求调整。比如误检代价高就提高conf-thres到0.5以上漏检代价高就降到0.2以下。验证阶段计算mAP时一般会用很低的conf只调节ioumetrics曲线才能真实反映模型的召回能力。4.5 常见问题速查表现象可能原因处理方式loss变成nan学习率过大或标签越界调低学习率检查坐标是否小于0或大于1mAP为0类别映射错位检查类别文件顺序和数据yaml的names是否一致小目标完全检测不到输入分辨率太低提高imgsz重聚类anchor密集场景重复框多NMS阈值不合适降低iou-thres调整conf-thres训练慢、显存不足batch或分辨率过大降低batch启用混合精度验证集效果明显优于测试集或实际场景数据增强太强减弱部分增强参数以上这些问题我几乎都实际踩过尤其是类别映射错位和标签坐标越界这两个属于“看似简单但又隐蔽”的坑。如果你现在正在训练自己的数据集建议先把标签检查和data.yaml的类别顺序确认一遍能省下很多排查时间。最后再分享一个小技巧数据集下载下来不要直接扔进训练脚本先花半小时做一次可视化检查。把每个类别的框画到图片上肉眼扫一遍看类别对不对、框贴不贴、有没有漏标错标。这一步看着费时间实际上是最划算的投入——它能让你的训练从“盲跑”变成“可控”。我在第03期整理的这10个数据集里前9个开箱即用第10个则是你面对细分需求时的工具箱。结合格式转换脚本和训练前检查流程按这条路径走下来不管是入门实验还是项目落地数据这块基本能稳住。