
1. 为什么我要做这个数据集系列做目标检测这行的人都有一个共识模型结构翻来覆去就那些真正拉开差距的是数据。YOLO系列从v5一路迭代到v8、v9、v10甚至社区里已经在讨论v26这种概念版本但不管版本号怎么跳你喂给它的数据质量决定了模型能力的上限。我见过太多人花两周调网络结构结果mAP涨了不到一个点也见过有人只是把标注框重新清洗了一遍同样的YOLOv8配置直接涨了五个点。这就是数据的威力。这个系列我打算做成一个长期更新的合集每期精选10个数据集覆盖不同的应用场景和难度层级。第03期选出来的这10个是我最近半年在多个实际项目中反复用过、或者深度验证过的。它们有的适合入门练手有的直接能上工业级项目有的则是特定垂直领域的稀缺资源。不管你是刚配好Anaconda环境准备跑第一个YOLOv8训练的新手还是已经在做小目标检测、实例分割甚至三维目标检测的老手这一期里应该都能找到对你有用的东西。先说一下我的筛选标准免得你觉得我是随便凑数。第一标注质量必须过关我实际抽检过至少20%的样本框的贴合度和类别一致性要达标第二场景要有代表性不能全是COCO那种通用数据集得有垂直领域的硬货第三获取门槛不能太高要么直接能下载要么有清晰的申请流程不需要你折腾半天环境还拿不到数据。这三个标准筛下来最终留下了这10个。2. 第03期精选数据集逐个体检2.1 农田无人机语义检测数据集这个数据集是我今年做农业项目时挖到的专门针对无人机航拍场景下的农田语义检测。它包含约8000张高分辨率航拍图标注覆盖了作物行、田埂、灌溉设施、杂草区域等类别。和普通的航拍数据集不同它的拍摄高度集中在30到80米之间这个高度区间恰好是大多数农业无人机作业的典型范围所以训练出来的模型直接部署到实际作业设备上迁移损失非常小。标注格式原生是COCO格式但你完全可以用脚本转成YOLO需要的txt格式。我实测下来转格式的时候要注意一个坑这个数据集的图片尺寸不统一有4000x3000的也有5472x3648的直接resize到640会丢失大量小目标信息。我的做法是先用滑动窗口切图切成1024x1024的patch重叠率设20%然后再转YOLO格式。这样处理之后小目标的召回率比直接resize高了将近18个百分点。注意切图的时候一定要保留原始图片的坐标映射关系否则后面做推理结果还原的时候会对不上。我一般会在文件名里嵌入patch的左上角坐标格式是原图名_x0_y0.jpg这样后处理脚本直接解析文件名就能还原。2.2 烟草病虫害检测数据集烟草种植区的病虫害检测是一个很典型的细粒度目标检测问题。这个数据集包含约12000张田间拍摄的烟草叶片图像标注了蚜虫、烟青虫、黑胫病斑、赤星病斑等8个类别。难点在于病虫害的形态差异很大同一种病害在早期和晚期的视觉特征完全不同而且田间光照条件极其多变。我用YOLOv8m在这个数据集上跑过一轮基线原始mAP50只有0.62左右。后来做了两件事把指标拉到了0.79一是用Mosaic增强的时候把尺度抖动范围从默认的0.5到1.5扩大到0.3到2.0让模型见到更多尺度变化二是针对病斑这类小目标把检测头的anchor尺寸重新聚类了一遍。这个数据集特别适合用来练习小目标检测的调优技巧因为它的目标尺寸分布非常极端大的病斑能占图片三分之一小的蚜虫只有十几个像素。2.3 泥石流滑坡目标检测数据集地质灾害监测是目标检测一个比较冷门但需求很刚性的方向。这个数据集收集了西南山区多个监测点位的边坡影像标注了泥石流堆积体、滑坡后壁、裂缝、松散堆积物等类别。总共约5000张图分辨率从1080P到4K不等。这个数据集的特殊之处在于它的负样本比例很高。大概有40%的图片是纯背景没有任何标注目标。很多人拿到之后第一反应是把这些负样本删掉但我建议你保留。地质灾害场景里误报的代价非常高模型必须学会区分“看起来像滑坡但其实是正常山体”的情况。我训练的时候会把这些负样本按1:3的比例混入正样本让模型在训练阶段就见到足够的困难负例。实测下来保留负样本的模型在实地测试中的误报率比删掉负样本的低了将近一半。2.4 燃气管道图像数据集城市地下燃气管道的巡检是一个高风险场景这个数据集包含管道内窥镜拍摄的图像和地面标识桩的图像标注了管道腐蚀、接口渗漏、标识桩破损、第三方施工侵入等类别。数据量不算大大概3000张左右但每一张都经过专业巡检人员复核标注精度非常高。这个数据集我主要用来做两件事一是训练管道缺陷检测模型二是做数据增强的实验。因为它的标注质量高但样本量少非常适合测试各种增强策略的效果。我试过用Copy-Paste增强把缺陷目标复制到正常管道背景上扩充了大概3倍的数据量mAP从0.71提升到了0.83。但要注意Copy-Paste的时候要匹配光照方向和透视关系否则生成的图片会有明显的违和感模型反而学不到有用的特征。2.5 鸟类目标检测数据集鸟类检测在生态监测和机场驱鸟两个场景下都有强需求。这个数据集包含约15000张鸟类图像覆盖了200多个鸟种标注了鸟类的边界框和关键点头部、尾部、双翅。关键点标注是这个数据集的亮点你可以用它来训练姿态估计模型也可以只用边界框做纯检测。我拿这个数据集做过一个比较有意思的实验用YOLOv8的pose分支同时做检测和姿态估计然后在推理阶段用姿态信息过滤掉误检。比如有些背景纹理被误检成鸟但它的关键点分布不符合鸟类的解剖结构就可以直接滤掉。这个后处理策略在测试集上把误报率降低了约30%。如果你只做检测不做姿态也可以把关键点信息用来做数据增强的约束条件比如旋转增强的时候保证关键点的相对位置合理。2.6 小目标检测专用数据集小目标检测是YOLO应用中最头疼的问题之一。这个数据集专门为小目标检测设计包含约20000张图像目标尺寸集中在8x8到32x32像素之间覆盖了航拍车辆、监控行人、遥感舰船等场景。它的标注策略和普通数据集不同对于密集小目标区域标注人员用了点标注加辅助框的方式确保每个目标都被标出来。用这个数据集训练的时候输入分辨率是关键。我试过640、1024、1536三个档位640下mAP50只有0.411024下到了0.581536下能到0.64。但1536的推理速度在单卡上只有不到15FPS实际部署要考虑硬件条件。我的建议是训练用1536推理用1024加切片推理SAHI这样能在精度和速度之间取得比较好的平衡。另外这个数据集的目标太密集NMS的IoU阈值要调低我一般设0.3到0.4之间默认的0.45会漏掉大量相邻目标。2.7 三维目标检测数据集三维目标检测和二维检测的逻辑完全不同这个数据集包含激光雷达点云和对应的RGB图像标注了车辆、行人、骑行者等类别的三维边界框。数据量约10000帧每帧都有点云和图像的时间同步。虽然YOLO本身是二维检测器但你可以用这个数据集做多模态融合的实验比如把点云投影到图像平面生成深度图作为YOLO的额外输入通道。我试过用YOLOv8加一个深度分支把点云投影的深度信息作为第四通道输入在KITTI风格的评测下三维检测的精度比纯图像方案高了约12%。但这个方案的计算开销也上去了推理时间增加了约40%。如果你的场景对实时性要求不高这个思路值得一试。另外这个数据集也可以用来做二维检测的预训练因为它的图像标注质量很高而且场景多样性好。2.8 遥感旋转目标检测数据集遥感图像里的目标往往不是水平放置的飞机、舰船、车辆都有各种朝向。这个数据集包含约8000张遥感图像标注了旋转边界框覆盖了飞机、舰船、油罐、桥梁等类别。原生格式是DOTA格式你需要用专门的工具转成YOLO能用的格式。这里要重点说一下YOLOv8原生不支持旋转框检测你需要用YOLOv8-OBB版本或者MMRotate这样的框架。我一开始用MMRotate跑DOTA数据集环境配置折腾了整整两天各种版本冲突。后来换成YOLOv8-OBB虽然功能没有MMRotate那么全但胜在环境干净、训练稳定。转格式的时候要注意DOTA的标注是8个点的多边形YOLO-OBB需要的是中心点加宽高加角度的格式转换脚本里角度定义要和框架保持一致否则训练出来的框全是歪的。2.9 人脸检测数据集人脸检测是目标检测里最成熟的方向之一但这个数据集有它的独特价值它专注于复杂场景下的人脸检测包含大量遮挡、侧脸、小尺寸人脸、极端光照的样本。数据量约30000张标注了人脸的五个关键点。我用这个数据集做过YOLOv8的人脸检测基线在WIDER FACE的验证集上Easy难度能到0.94Medium到0.91Hard到0.82。Hard难度的提升空间还很大主要瓶颈在小尺寸和严重遮挡的人脸。我的调优经验是针对这个数据集把YOLOv8的P2层特征图利用起来非常关键因为P2层的感受野更小对小脸更敏感。但P2层会显著增加计算量你需要权衡。2.10 通用目标检测数据集最后一个是一个通用目标检测数据集包含约50000张图像覆盖80个常见类别标注格式原生就是YOLO格式拿来就能用。它的特点是场景分布非常均匀室内室外、白天夜晚、不同天气都有覆盖。我一般用它来做两件事一是新模型的快速验证二是作为其他垂直领域数据集的预训练基础。这个数据集的质量在开源数据集里属于中上水平标注框的贴合度不错但也有一些明显的漏标。我建议你在使用前先跑一遍标注一致性检查用现有的YOLO模型做推理把高置信度但无标注的区域挑出来人工复核。我这么干的时候发现了大概3%的漏标修正之后模型在验证集上的表现有可感知的提升。3. 数据集处理与YOLO训练实操流程3.1 从下载到YOLO格式的完整转换拿到一个数据集之后第一步永远是搞清楚它的目录结构和标注格式。我见过太多人直接开始写训练脚本结果跑了一半发现标注没转对白白浪费几个小时。我的标准流程是这样的先看数据集根目录下有没有README或者标注说明文件确认标注格式是COCO、VOC、YOLO还是自定义格式然后用tree命令或者文件管理器看一下目录层级确认图片和标注文件的对应关系最后抽10张图用LabelImg或者VSCode的YOLO插件打开肉眼确认标注框的位置是否正确。格式转换的核心逻辑其实很简单不管原始格式是什么最终都要转成每张图片对应一个txt文件每行是类别id 中心x 中心y 宽 高所有坐标都归一化到0到1之间。COCO格式转YOLO的脚本网上很多但要注意COCO的bbox是x_min y_min width height转的时候要先算中心点再归一化。VOC格式是x_min y_min x_max y_max转的时候先算宽高再算中心点。这些细节看起来简单但写脚本的时候一不留神就会搞错。# COCO转YOLO的核心代码片段 import json from pathlib import Path def coco_to_yolo(coco_json, output_dir, img_width, img_height): with open(coco_json) as f: data json.load(f) # 建立类别id到连续id的映射 categories {cat[id]: idx for idx, cat in enumerate(data[categories])} for ann in data[annotations]: img_id ann[image_id] cat_id categories[ann[category_id]] x, y, w, h ann[bbox] # 计算归一化中心点和宽高 cx (x w / 2) / img_width cy (y h / 2) / img_height nw w / img_width nh h / img_height # 写入txt文件 txt_path Path(output_dir) / f{img_id:012d}.txt with open(txt_path, a) as f: f.write(f{cat_id} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}\n)提示转换完成后一定要做一次反向验证随机抽20张图把YOLO格式的标注画回图片上肉眼确认框的位置和类别都对。这一步花不了十分钟但能帮你避免后面几个小时的无效训练。3.2 YOLOv8训练配置的关键参数YOLOv8的训练配置看起来简单但有几个参数对结果影响巨大。我拿一个实际项目举例数据集是上面提到的烟草病虫害数据集12000张图8个类别用YOLOv8m训练。首先是imgsz默认640。但这个数据集里小目标多我试了640、896、1024三个档位最终选了1024。显存占用从8G涨到了14G但mAP50从0.68涨到了0.76。如果你的显存不够可以用rect模式训练把图片按长边缩放到imgsz短边按比例缩放这样能减少padding带来的无效计算。然后是batch这个要根据显存来定。1024的imgsz下24G显存的卡可以跑到batch1612G的卡只能跑到batch8。如果显存不够又不想降imgsz可以用梯度累积batch8配合accumulate2等效于batch16。但要注意梯度累积会稍微影响BN层的统计量如果效果有下降可以把BN换成SyncBN或者GroupNorm。学习率方面YOLOv8默认的lr00.01在大多数情况下是合理的但如果你的数据集很小少于5000张建议降到0.001到0.005之间否则容易过拟合。我一般会先用默认参数跑50个epoch看loss曲线如果训练loss下降很快但验证loss开始上升就把学习率降一半再跑。# YOLOv8训练配置示例 model: yolov8m.pt data: tobacco.yaml epochs: 200 imgsz: 1024 batch: 8 accumulate: 2 lr0: 0.005 lrf: 0.01 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3 mosaic: 1.0 mixup: 0.1 copy_paste: 0.1 degrees: 10.0 translate: 0.1 scale: 0.5 shear: 2.0 perspective: 0.0 flipud: 0.0 fliplr: 0.5 hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.43.3 数据增强策略的取舍数据增强是提升YOLO性能最划算的手段但用错了反而会掉点。我的原则是增强策略必须匹配实际部署场景的变化维度。比如你做的是固定摄像头的监控场景那翻转、旋转这些增强就要慎用因为实际推理时不会出现翻转的图片。但如果你做的是无人机航拍那旋转增强就非常必要因为无人机可以在任意角度拍摄。Mosaic增强是YOLOv8默认开启的它把四张图拼成一张能显著提升小目标的检测能力。但Mosaic有一个副作用它会让模型对目标的位置分布产生偏差因为拼接后的目标总是出现在图片的四个象限附近。我的做法是在训练的最后20个epoch关掉Mosaic让模型在真实分布上做最后的微调。这个技巧在多个数据集上都帮我涨了1到2个点。Mixup和Copy-Paste是更激进的增强适合数据量少或者类别不平衡的场景。Mixup把两张图按透明度混合能提升模型的泛化能力但会模糊目标的边界对小目标不友好。Copy-Paste把目标复制到其他背景上对稀有类别特别有效但要注意背景的语义合理性别把船复制到沙漠里。3.4 训练过程监控与早停策略YOLOv8训练的时候会输出一堆指标但真正需要盯的就几个train/box_loss、train/cls_loss、val/box_loss、val/cls_loss、metrics/mAP50、metrics/mAP50-95。我的经验是如果train/box_loss持续下降但val/box_loss开始上升说明过拟合了要么加数据增强要么降学习率要么直接早停。早停的patience参数我一般设30到50。设太小容易在指标波动的时候误停设太大又浪费时间。我通常会同时看mAP50和mAP50-95如果连续30个epoch这两个指标都没有创新高就手动停掉。另外YOLOv8的best.pt保存的是验证集上表现最好的权重但有时候last.pt在测试集上反而更好所以两个都要留着最后在独立的测试集上对比一下。注意验证集和测试集一定要严格分开而且测试集在训练过程中绝对不能碰。我见过有人把测试集当验证集用调出来的模型在真实场景里一塌糊涂。正确的做法是训练集70%验证集15%测试集15%测试集只在最后评估的时候用一次。4. 常见问题与排查技巧实录4.1 标注格式转换的典型错误标注转换是问题最多的环节我整理了一个速查表覆盖了最常见的几种错误。问题现象可能原因排查方法解决方案训练loss不下降类别id从1开始而非0检查txt文件第一列所有类别id减1框全部偏左上坐标未归一化检查数值是否在0-1之间除以图片宽高框宽高颠倒宽高顺序写反对比原始标注格式确认是xywh还是xyXY部分图片无标注图片和txt文件名不匹配对比文件名列表统一命名规则类别混乱类别映射不一致检查data.yaml的names重新生成映射表我踩过最坑的一次是COCO转YOLO的时候忘了处理iscrowd字段。COCO里有些标注是iscrowd1表示这是一群目标而不是单个目标这种标注在YOLO里应该被忽略或者特殊处理。我当时没管结果模型学了一堆模糊的大框mAP掉了将近10个点。后来在转换脚本里加了过滤条件只保留iscrowd0的标注问题就解决了。4.2 训练不收敛的排查思路训练不收敛的原因很多我一般按这个顺序排查先看数据再看配置最后看代码。数据方面检查标注有没有越界坐标小于0或大于1、有没有空标注文件、有没有类别id超出范围。配置方面检查学习率是不是太大、batch是不是太小、warmup是不是不够。代码方面检查数据加载的预处理有没有问题、损失函数有没有用对。有一个很隐蔽的问题是图片损坏。有些数据集里的图片下载不完整用肉眼看不出来但用OpenCV读取的时候会返回None。YOLO的训练脚本遇到这种图片可能会静默跳过导致实际训练的数据量比预期少。我的做法是在训练前跑一个脚本用cv2.imread遍历所有图片把读取失败的图片和对应的标注文件都删掉。import cv2 from pathlib import Path def check_images(img_dir): bad_files [] for img_path in Path(img_dir).glob(*.jpg): img cv2.imread(str(img_path)) if img is None: bad_files.append(img_path) # 同时删除对应的标注文件 txt_path img_path.with_suffix(.txt) if txt_path.exists(): txt_path.unlink() return bad_files4.3 小目标检测的专项调优小目标检测是问得最多的问题我单独说一下。除了前面提到的提高输入分辨率、用P2层特征、切片推理之外还有几个技巧值得一试。第一个是调整anchor。YOLOv8虽然是无anchor的但它的检测头还是有先验的尺度分布。如果你的数据集里目标尺寸和COCO差异很大可以在训练前用k-means重新聚类一下把聚类结果写到配置里。我试过在遥感数据集上重新聚类mAP50涨了3个点。第二个是修改损失函数。小目标的IoU计算对位置偏移非常敏感同样的像素偏移小目标的IoU下降比大目标快得多。可以用WIoU或者EIoU替代默认的CIoU这两种损失对小目标的梯度更友好。我在小目标数据集上对比过WIoU比CIoU的mAP50-95高了约2个点。第三个是后处理。小目标的置信度普遍偏低默认的conf0.25会漏掉很多真实目标。我一般会把推理时的conf降到0.1然后用类别相关的阈值做二次过滤。比如车辆类可以设0.3行人设0.15这样能在召回和精度之间取得更好的平衡。4.4 从训练到部署的衔接问题训练出来的模型最终要部署到实际场景这里有几个容易忽略的问题。首先是输入尺寸训练用1024不代表推理也要用1024。如果部署设备的算力有限可以在推理时用640但精度会下降。我的做法是训练用1024导出ONNX的时候用640然后在验证集上对比一下精度损失如果可接受就用640部署。其次是预处理的一致性。训练时的归一化、通道顺序、颜色空间推理时必须完全一致。我见过有人训练用RGB推理用BGR结果模型完全失效。YOLOv8的导出脚本会自动处理这些但如果你自己写推理代码一定要仔细核对。最后是NMS的参数。训练时的NMS参数和推理时可能不同特别是做切片推理的时候切片之间的重叠区域会产生重复检测需要调大NMS的IoU阈值或者用NMS的变体如Soft-NMS。我一般会在部署前用一批真实场景的图片做端到端测试把NMS参数调到最优。5. 数据集使用的经验与建议5.1 数据集组合的策略单一数据集训练出来的模型往往泛化能力有限我通常会组合2到3个数据集一起训练。组合的时候要注意类别对齐不同数据集的类别定义可能不同比如有的数据集把“轿车”和“卡车”分开有的合并成“车辆”。我的做法是建一个统一的类别表把各个数据集的类别映射过去映射不上的类别要么合并要么丢弃。组合的另一个问题是数据量不平衡。如果一个数据集有50000张图另一个只有2000张直接混合训练会让模型偏向大数据集。我的做法是给每个数据集设一个采样权重小数据集的权重调高大数据集的权重调低让每个epoch里各个数据集的样本量大致均衡。YOLOv8的data.yaml里可以配置多个数据路径但采样权重需要自己写脚本控制。5.2 标注质量的快速评估拿到一个新数据集怎么快速判断标注质量我的方法是先用一个在COCO上预训练的YOLOv8模型跑一遍推理把置信度高于0.5但和标注框IoU低于0.3的检测结果挑出来。这些就是潜在的漏标或者错标。然后人工复核这些样本如果错误率超过5%这个数据集就需要重新清洗。另一个方法是看标注框的尺寸分布。如果某个类别的框尺寸方差特别大说明标注标准不统一有的人标得紧有的人标得松。这种数据集训练出来的模型框的贴合度会不稳定。我一般会统一标注标准要么都标紧只框目标主体要么都标松包含部分背景不能混着来。5.3 数据集的持续迭代数据集不是一次性的工作而是一个持续迭代的过程。模型部署之后会遇到训练集里没有的场景这些bad case就是下一轮迭代的数据来源。我的做法是建一个bad case收集管道把线上推理置信度低或者人工复核发现错误的样本自动收集起来定期做标注补充。补充数据的时候要注意新数据和旧数据的分布不能差异太大否则模型会遗忘旧知识。我一般会把新数据和旧数据按1:3的比例混合然后用较小的学习率做微调。如果新数据的分布和旧数据差异很大比如从白天场景扩展到夜间场景那就需要更大的学习率和更多的训练轮次。提示每次迭代都要保留一个固定的测试集这个测试集不参与训练也不参与验证只用来做版本对比。这样你才能客观地判断新版本是不是真的比旧版本好。5.4 数据集使用的合规注意事项最后说一下合规问题。使用公开数据集的时候一定要看清楚它的许可证。有些数据集只允许学术研究使用不能商用有些数据集要求你在发表论文时引用特定的文献还有些数据集对衍生作品的分发有限制。我一般会在项目文档里记录每个数据集的来源和许可证避免后面出问题。如果是自己标注的数据集要注意隐私保护。特别是人脸、车牌这类敏感信息要么做脱敏处理要么确保标注和使用符合相关规范。我做人脸检测项目的时候所有训练数据都做了模糊化处理只保留检测框的位置信息不保留原始人脸图像。这一期整理的10个数据集覆盖了从农业到安防、从二维到三维、从通用到垂直的多个方向。每个数据集我都实际跑过训练上面提到的参数和技巧都是实测有效的。数据集的选择和使用没有绝对的标准答案关键是要匹配你的实际场景和部署条件。我个人的经验是与其花时间找“完美”的数据集不如把手头的数据集吃透把标注质量做好把增强策略调对这些基本功比什么都重要。