十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

YOLO数据集挑选指南:10个精选数据集与格式转换实战

YOLO数据集挑选指南:10个精选数据集与格式转换实战 做目标检测这些年我最大的感受是YOLO本身的门槛已经低到不能再低了真正卡住新手的从来不是模型代码而是“我到底该拿什么数据来训练”。环境配好了官网权重也跑了一到“训练自己的数据集”就卡壳——去哪找数据、找到的数据能不能直接用、格式怎么转每一步都能劝退一批人。这期是数据集合集的第四期我按自己的使用经验挑出10个真正值得往硬盘里存的数据集覆盖通用检测、遥感、无人机、自动驾驶、人脸、交通标志和农业等方向。前几期聊过环境部署和模型优化这期就专门把“数据”这件事讲透。1. 为什么挑数据集比选模型版本更关键1.1 数据集直接决定模型上限很多刚入门的朋友喜欢纠结“到底用YOLOv5还是YOLOv8”甚至每隔几天就追新版本。我的观点一直没变过在目标检测里模型结构带来的提升远不如数据质量带来的提升明显。你拿一份脏乱差的数据集去训练哪怕用最新的YOLO架构出来的模型照样惨不忍睹反过来一份高质量、分布合理的数据集配上YOLOv8s这种小模型落地效果可能比你想象的还要好。打个比方模型是发动机数据集就是油品。你往发动机里加兑了水的油再好的发动机也跑不起来。所以每次有读者来问“我的模型mAP怎么这么低”我第一个问题永远是你的训练集长什么样图片模糊、目标极小、标注框歪七扭八、类别严重不均衡……这些问题靠调参是救不回来的。1.2 判断YOLO数据集的四把尺子这些年我下载过的数据集少说也有几十个踩过的坑比很多教程里写的步骤都多。综合下来判断一个数据集能不能用来训练YOLO我一般看四个维度第一是标注格式。YOLO系列用的是txt格式每行“类别ID 中心点x 中心点y 宽 高”坐标全部归一化到0-1之间。很多数据集给的是COCO的JSON格式或者VOC的XML格式不能直接喂给YOLO得先转换。这个我会在第3章详细说。第二是类别设定。你得先搞清楚数据集的类别和你的业务场景对不对得上。比如有的交通标志数据集是“全标注版”把整个标志牌框住有的是“红圈版”只框里面的图案。选错版本训练出来的模型行为会很奇怪。第三是图像质量与尺寸。YOLO默认输入640x640如果你的训练集里有大量8000x8000的遥感大图直接扔进去训练会非常浪费显存而且小目标会被压没。这种大图通常要切片处理。第四是类别平衡程度。有的数据集里“天空”类图片占了八成“车辆”就零星几张训练出来的模型当然只会认天空。看到数据集先数一数每个类别的样本量差距太大的话要做数据增强或者筛选。还有一类数据集要特别提醒不是所有叫“数据集”的东西都能拿来跑YOLO。比如Iris鸢尾花数据集是经典的机器学习分类数据DEAP是脑电生理信号数据GDP空间分布网格数据是地理栅格数据西瓜数据集3.0来自教材案例。这些在热词搜索里经常和YOLO混在一起出现但它们和目标检测完全是两码事别浪费时间下载。2. 10个精选YOLO数据集逐个拆解先把速览表放在前面方便你快速定位数据集适合方向规模原始格式上手难度COCO 2017通用目标检测训练集118K张80类JSON中PASCAL VOC入门练手20072012约20K张20类XML低DOTA v1.0遥感旋转框检测2,806张大图15类txt高AITODv2航空小目标检测数十万实例40类JSON/图像高VisDrone 2019无人机视角训练集6,471张10类txt中高KITTI自动驾驶训练集7,481张8类自定义txt中WIDER FACE人脸检测32,203张约40万人脸txt中CCTSDB交通标志数千张多版本XML低农业病虫害类行业垂直场景几百到几千张不等不一定中自建小样本个性化业务自定义自定义低2.1 COCO 2017目标检测的标准题库如果说目标检测领域有一个公认的“标准题库”那一定是COCO。COCO 2017训练集包含约11.8万张图片、80个类别从人、车、动物到各种日用品都有每张图片的标注信息非常丰富不光有检测框还有分割掩码和关键点标注。几乎所有主流YOLO版本的预训练权重都在COCO上跑过所以它也是对比模型性能的基准。我的建议是COCO不适合作为初学者的第一个训练集但它是你理解“现代目标检测精度”的参照物。你用YOLOv8s在COCO上训练100轮mAP能到40出头这个数字就是你的“基线水平”。以后换到自己的数据集发现mAP只有十几个点不是模型出了问题而是任务难度和数据分布变了。COCO原始标注是JSON格式转YOLO格式需要写脚本。这类脚本我留在第3章给出来拿到就能用。另外注意COCO数据集体量大、单张图片目标多训练一轮很久如果你显卡显存不够先别碰它。2.2 PASCAL VOC入门最简单也最容易跑通VOC2007加VOC2012加起来大概两万张图、20个类别类别虽然不多但全是常见物体飞机、自行车、鸟、船、瓶子、公交车、车、猫、椅子、牛、餐桌、狗、马、摩托车、人、盆栽、羊、沙发、火车、电视。这个数据集体量小、每张图目标少、背景相对干净特别适合验证环境、测试训练流程。我经常跟刚学YOLO的朋友说第一次训练自己的模型不要一上来就搞高难度数据。先用VOC跑通整个流程下载数据、转换格式、配置yaml、跑训练、看损失曲线、做验证、导出模型。这一套流程你完整跑一遍之后再换复杂数据集就有底了。VOC标注格式是XML里面存的是左上角和右下角坐标。注意用这个数据集时有个常见的坑官方给的划分里有“trainval”和“test”两个集合新手容易把trainval直接当成训练集但里面其实包含了val训练时自己再切一份验证集更稳妥。2.3 DOTA v1.0遥感旋转框检测的必跑项目DOTA是遥感图像目标检测领域绕不开的数据集总共2,806张遥感大图15个类别包括飞机、轮船、储油罐、棒球场、篮球场、网球场、港口、桥梁、大型车辆、小型车辆、直升机、环岛等。这些图像很多是8000x8000甚至更大分辨率直接用YOLO训练是不可能的需要切成小图tiles。DOTA最有价值的地方在于它提供了旋转框标注。普通的YOLO水平框在处理“排列紧密的飞机”、“斜着停的车”时预测框之间会大面积重叠NMS一压就漏检。旋转框能贴着目标边缘效果明显更好。如果你要做遥感相关的落地项目建议搭配MMRotate这套工具来训练旋转框检测模型纯原生YOLO对旋转框支持有限。使用DOTA时有个细节官方下载后给的是txt格式的坐标点序列比如“x1 y1 x2 y2 x3 y3 x4 y4 类别 难易标志”要先转成MMRotate要求的DOTA格式或者转成四个顶点形式的简化格式。另外遥感图里很多目标极小切片时建议设置重叠区域避免目标正好被切在两块中间。2.4 AITODv2航空小目标检测硬核场AITODv2是航空图像目标检测里名气很大的数据集由西北工业大学王鑫团队发布。它有可见光和红外两个版本覆盖了车辆、飞机、船只、储油罐、桥梁等多个类别官方标注数量达到数十万量级。和DOTA偏重“大尺度场景”不同AITODv2更考验模型对极小目标的感知力。实际用下来AITODv2有一个很有意思的现象部分标注框比目标实际的轮廓要大不少。这是航拍数据集的通病因为标注员在高空图像里很难精确贴住目标边缘。所以训练时不要期望模型输出和标注框完全一致的贴合能稳定框住目标主体就算合格。另外AITODv2图像分辨率高、目标密集显存不够的话要用大图切片加小batch的训练策略。如果你的业务涉及无人机巡检、卫星监测、智慧城市这类方向AITODv2值得好好研究。它比DOTA更难但也更接近真实部署场景。2.5 VisDrone 2019无人机视角的实战级数据VisDrone是天津大学等机构发布的无人机视觉数据集DET任务训练集有6,471张图片共10个类别行人、人、自行车、汽车、货车、面包车、三轮车、遮篷三轮车、公共汽车、摩托车。这些图都是无人机在真实场景下拍的视角从几十米到上百米都有目标大小变化剧烈。VisDrone对我来说是“最能检验模型真实水平”的数据集。COCO类目标大、分布均匀模型很容易刷到不错的分VisDrone里大量目标只有十几个像素类别之间长得又像行人、骑自行车的人、骑摩托车的人弄混是家常便饭。如果你准备做无人机巡检或安防监控VisDrone就是最好的试炼场。这个数据集官方给的标注是txt格式但坐标系不是YOLO的归一化格式需要转换。另外注意它的类别里“pedestrian”和“people”是分开的前者指站立行人后者指一群人聚集训练时模型很容易把两者搞混可以自己斟酌是否合并。2.6 KITTI自动驾驶入门的经典搭档KITTI是自动驾驶圈子里的元老级数据集由德国卡尔斯鲁厄理工学院和丰田美国研究院联合发布。它提供了相机图像、激光雷达点云、GPS定位等多样数据其中2D目标检测任务包含7,481张训练图像类别主要是汽车、行人、骑自行车的人等图像分辨率约1242x375。KITTI的标注格式是自定义的每行开头是类别名后面是截断程度、遮挡程度、观测角度以及左右上下四个角坐标。转成YOLO格式时需要把四个坐标换算成中心点加宽高。数据本身质量很高但类别少、场景偏城市道路。如果你做的是矿山、园区、港口之类的封闭场景车辆检测KITTI可以作为预训练来源再用自己场景的数据微调。我个人的习惯是用KITTI跑通了自动驾驶检测流程之后再扩展到BDD100K或者SemanticKITTI这类更复杂的数据集。SemanticKITTI其实更多用于点云语义分割和SLAM和YOLO目标检测的契合度不如KITTI本体别搞混。2.7 WIDER FACE人脸检测的强度测试做人脸检测WIDER FACE是目前最常用的评测基准之一。它包含32,203张图像标注了约40万个人脸框按检测难度划分成了Easy、Medium、Hard三个子集。Hard子集里的人脸小、遮挡多、光照差很多模型在Easy上能跑出90多的mAP到Hard直接腰斩。用YOLO做WIDER FACE训练要注意人脸这个类别非常特殊所有人脸都属于同一个类但尺度差异巨大。有的脸占满整张图有的脸只有三五个像素。建议用640以上的输入尺寸配合Mosaic增强和多尺度训练效果会明显好一些。还有一点很实用人脸检测数据集标注的边界框通常比较“松”上下左右留了余量。如果你做的是人脸识别检测框稍微留边影响不大但如果你做的是人脸关键点对齐检测框越紧越好训练前可以自己稍微收缩一批标注框。2.8 CCTSDB 交通标志一个典型的标注版本陷阱CCTSDB是长沙理工大学发布的交通标志检测数据集很多做智能交通的朋友用它起步。但它恰恰是我遇到过“最容易被坑”的数据集之一。早期流传的版本里有两个标注版本一个是全标注版把整个交通标志牌包括外面的白边都框住一个是红圈版只标注标志内部的红圈区域。如果你下载的是全标注版训练出的模型会把整块标志牌当作目标检测框明显大于标志本身的图形区域。看着好像没毛病但在实际部署时检测框会影响后续识别模块的输入裁剪导致识别准确率下降。我建议训练交通标志检测时想清楚下游任务是什么如果只是为了“找到标志”全标注没问题如果还要做分类识别尽量用紧贴图形的标注。这类教训说明一件事拿到任何数据集先看它的标注说明文档别急着开训。花十分钟读README能省你后面许多重新标注的麻烦。2.9 农业病虫害类数据集行业垂直场景的定制思路农业视觉这几年很火围绕烟草病虫害、水稻病虫害、玉米病害等方向的YOLO数据集在不少学术团队和开源社区里都有分享。这类数据集通常规模不大少的几百张多的几千张类别从几种到十几种不等图片质量参差不齐有的还是从论文里抠出来的截图。我的建议是农业病虫害这类细分场景别指望一个现成数据集直接解决你的问题。同一片烟叶不同光照、不同生育期、不同拍摄设备拍出来模型表现差距巨大。正确做法是找一份病虫害YOLO数据集作为基准跑通流程再自己拍摄补充目标场景的图像做二次标注。数据规模不需要很大把病虫害的典型症状覆盖全各类别不严重失衡模型效果就会比较可用。这也是我反复强调的一点行业定制数据集真正的价值不在“量”而在“贴合”。公开数据集能帮你验证方案解决不了最后的场景适配。2.10 自建小样本数据集用LabelImg自己造数据很多业务场景根本找不到现成数据集最靠谱的办法就是自己造。最常见的标注工具是LabelImg一个基于Python的图形化标注软件支持PascalVOC、YOLO、CreateML三种输出格式导出YOLO格式时就地生成与图片同名的txt文件。如果你觉得LabelImg太老可以试试Label Studioweb版功能更全适合多人标注。新建标注项目时我建议输出格式直接选YOLO省得后面再转。标注的时候有几个原则目标被遮挡超过一半就跳过不标边界框尽量贴住目标轮廓不要留太多背景模糊到看不出来是什么的目标不要硬标。标注数据集的规则一致性比标注数量更重要。小样本数据集的规模不用贪多每个类别起步300张左右先跑一个模型看效果哪类误检多再针对性补数据。这比一次性标几千张效率高得多也不容易标吐。3. 格式转换不是小事从COCO/VOC到YOLO3.1 一张图搞懂YOLO标签格式YOLO标签文件是txt格式每行对应一个目标格式是类别ID 中心点x 中心点y 宽度 高度其中中心点坐标和宽高都是相对图片宽高的归一化值取值范围0到1。比如一张1280x720的图片里某个目标框左上角在(320, 180)宽高为(640, 360)那么归一化后的中心点是((320640/2)/1280, (180360/2)/720) (0.5, 0.5)宽高是(0.5, 0.5)。训练时YOLO会读取与图片同名的txt文件放在images的同级目录labels文件夹下。图片和标签的目录结构长这样datasets/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yaml这个结构是YOLO的默认约定后面写data.yaml时还要用到。3.2 COCO JSON 转 YOLO TXT 的参考脚本COCO标注是JSON文件里面通过categories类别、images图片信息、annotations标注框三部分互相关联。转YOLO时可以把每张图像的标注信息合并写出单独的txt。下面这个脚本直接可用import json import os from pathlib import Path def coco_to_yolo(json_path, out_dir): with open(json_path, r, encodingutf-8) as f: data json.load(f) # 将COCO类别ID映射为连续从0开始的YOLO类别ID categories {cat[id]: idx for idx, cat in enumerate(data[categories])} os.makedirs(out_dir, exist_okTrue) # 建立image_id到标注的索引 anns_by_image {} for ann in data[annotations]: anns_by_image.setdefault(ann[image_id], []).append(ann) for img in data[images]: img_id img[id] w, h img[width], img[height] anns anns_by_image.get(img_id, []) lines [] for ann in anns: cat_id categories[ann[category_id]] x, y, bw, bh ann[bbox] # COCO bbox是左上角坐标宽高 cx (x bw / 2) / w cy (y bh / 2) / h nw bw / w nh bh / h # 防止归一化后出界 cx min(max(cx, 0), 1) cy min(max(cy, 0), 1) nw min(max(nw, 0), 1) nh min(max(nh, 0), 1) lines.append(f{cat_id} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}) out_path Path(out_dir) / (img[file_name].rsplit(., 1)[0] .txt) out_path.write_text(\n.join(lines), encodingutf-8) if __name__ __main__: coco_to_yolo(annotations/instances_train2017.json, labels/train)这个脚本的逻辑是固定的主要变量就是JSON路径和输出目录。如果转换后发现txt文件里第一列的类别ID不是你自己yaml里希望的编号检查一下categories映射那一段就行。3.3 VOC XML 转 YOLO TXT 的注意事项VOC的XML标注格式很直观每个object节点里有一个bndbox子节点存的是xmin、ymin、xmax、ymax。转换时主要工作是解析XML树然后把坐标归一化。这里要注意VOC和COCO一个是“左上右下”一个是“左上宽高”公式别用混。另外VOC的类别名是字符串转换时要建立一个从类别名到数字ID的字典。这个字典必须和你后面data.yaml里的names顺序保持一致否则训练时类别就错位了。我自己写转换脚本时习惯先扫所有XML文件把出现的类别名先去重收集一遍再去人工确认顺序最后生成字典。这个做法可以避免动手写死在脚本里的字典少了某个类别。3.4 划分train/val的黄金比例转换完标签还得把图片和对应标签划分成训练集和验证集。常见比例是8:1:1或者9:1但更重要的是按“场景”而不是“图片”来划分。如果你用的是安防监控数据同一个摄像头拍出的连续帧不能一部分进训练集一部分进验证集否则验证集会变相变成“开卷考试”分数虚高到自己都不信。最简单的做法是先把所有图片按文件夹或拍摄时间分组再把整个组划入训练或验证。这一步看起来不起眼但对模型真实性能的影响非常大。我见过不少项目因为随机划分数据训练时mAP很高一上真实环境就露馅问题就出在这个环节。4. 用YOLOv8训练自己数据集的完整流水线4.1 环境准备与数据集目录组织在Anaconda里创建虚拟环境是稳妥的选择Python版本建议3.8或3.9。安装YOLOv8很简单conda create -n yolov8 python3.9 -y conda activate yolov8 pip install ultralytics训练代码是现成的你不需要手写训练循环。真正要花心思的是把数据集整理成YOLO期望的结构。我在3.1小节已经给了目录结构的例子按那个结构放置图片和标签即可。4.2 写一份正确的data.yamldata.yaml是训练配置的入口里面定义了数据集路径和类别信息。示例path: /datasets/visdrone # 数据集根目录 train: images/train # 相对path的训练图片目录 val: images/val # 相对path的验证图片目录 nc: 10 names: [pedestrian, people, bicycle, car, van, truck, tricycle, awning-tricycle, bus, motor]这里最容易出错的是names顺序和标签txt里的类别ID必须完全对应。YOLO按“标签里的第一个数字是几就去names里取第几个名字”来处理顺序一旦错整个训练就是在让模型学错误答案。4.3 训练参数设置建议启动训练的命令很简洁yolo detect train datavisdrone.yaml modelyolov8s.pt epochs100 imgsz640 batch16几个关键参数我的经验值是这样epochs不要低于100除非数据量非常大且任务简单imgsz默认640如果检测小目标可以试1280但显存占用会暴涨batch以能放得下为准显存不够就调小别硬撑。训练过程中观察loss曲线train loss一直在降、val loss开始反弹就是过拟合信号可以停下来了。如果训练集只有几百张图我强烈建议加载预训练权重yolov8s.pt而不是从零开始。预训练权重是在COCO上学过的相当于你已经认识了世界上的常见物体再学你的小样本数据会快得多。4.4 验证与部署训练完成后官方会在runs/detect/train/weights目录下生成best.pt和last.pt。best.pt是验证集上表现最好的权重last.pt是最后一轮的权重部署时选best.pt。验证命令yolo detect val datavisdrone.yaml modelruns/detect/train/weights/best.pt导出成ONNX方便部署yolo export modelruns/detect/train/weights/best.pt formatonnx导出时有个细节如果你的部署环境用TensorRT推理导出格式选engine用OpenVINO的话选openvino。不同硬件平台导出的优化程度差很多别随便选一个。5. 常见问题排查与避坑实录整理一份我实际踩过的坑按频率排序问题常见原因解决方案训练报错“no labels found”图片和标签目录不对应或txt里没有内容检查images和labels目录结构确认标签文件名和图片名一致标签类别ID越界txt第一列数字大于names长度减1打开txt看一眼第一列数字对照data.yaml的names长度训练loss不降或乱跳数据量太少、学习率太高、标签标注错误先用几十张图跑5轮验证流程再放大规模mAP极高但实测很差训练集和部署场景差异太大补充真实场景数据做数据增强降低对验证集的依赖检测框偏大或偏小标注习惯不一致、训练尺寸不匹配统一标注规则训练和推理使用相同的imgsz5.1 “no labels found”到底是谁的锅这个报错几乎每个YOLO新人都遇到过。第一次我碰到时以为是标签文件缺失后来发现是data.yaml里的路径写错了。YOLOv8的path字段是数据集根目录然后train和val字段是相对路径。如果根目录写错它自然找不到任何东西。还有一个隐蔽原因图片是JPEG格式但文件名后缀是大写的.JPG或.JPEGYOLO匹配标签时按文件主名来找txt后缀变化不影响匹配但有些框架对图片格式敏感。建议统一转成小写后缀的.jpg省得后面各种莫名其妙的问题。5.2 为什么你的模型“见图就框”我见过一个真实案例有人说自己训练的交通标志检测模型把所有标志牌连白边整个框住还框得特别大。问了他用的数据集果然用的是CCTSDB的全标注版本。这就是我在2.8节说的“标注版本陷阱”。这种情况不是模型坏了是训练数据给它的“标准答案”就是这样。你要么换数据集版本要么自己重新清洗一遍标注。有些数据集作者更新了标注文件但网上流传的网盘链接还是旧版下载后一定要检查标注是否和图片目测一致别偷懒直接开训。5.3 数据量太少模型学了个寂寞很多行业场景能收集到的有效图片可能只有几百张。这种情况下数据增强比更换模型结构更有效。YOLOv8默认开启Mosaic增强把四张图拼成一张训练对小数据集帮助很大。还可以适当增大hsv_h、hsv_s这些颜色增强参数让模型对光照变化更鲁棒。不过增强也不是越猛越好。增强过猛会让模型看到的训练样本严重偏离真实分布比如把标签框转得和真实目标角度差太多模型学到的东西反而不可靠。增强参数要在“过拟合”和“分布漂移”之间找平衡我的习惯是先默认参数跑一轮效果不理想再逐步加。最后再分享一点个人经验。做目标检测项目这么久我越来越觉得“找数据”这件事靠的不是运气而是方法。先想清楚业务场景需要什么类别的目标、图像尺度大概是多大、部署环境是什么再对照这些约束去筛选公开数据集最后用自己场景的数据做补充这条路最稳。尤其是那些行业垂直的场景别指望网上有一个数据集正好长在你的需求上自己动手标注一批高质量数据往往比到处凑数量管用得多。数据集的积累是个慢功夫但你一旦攒下几份真正贴合业务的数据后续模型迭代的底气就完全不一样了。
返回列表