1. 先把数据集地图画清楚:CV到底在解决哪几类问题
做计算机视觉这几年,被问得最多的问题不是模型怎么调,反而是数据集上哪找。很多人一上来就问我要网盘链接,或者问有没有现成的下载包,但真正高效的做法,是把 CV 领域常用的开源数据集当成一个工具库来管理。这篇内容叫“CV领域深度学习用开源数据集大全”,我不打算只丢一个网址清单,而是把实际项目中反复用到的数据集、每种数据集的适用场景、下载和预处理时容易踩的坑,一次性讲清楚。适合刚入门深度学习、准备做课程设计或论文复现、以及想快速验证一个 idea 的同学。
很多人以为收集数据集就是“越多越好”,其实 CV 的问题类型决定了数据集的形态完全不一样。图像分类、目标检测、实例分割、姿态估计、OCR、人脸识别、视频理解,虽然都是深度学习模型在处理图像,但标注方式天差地别。如果你连自己要解决的是哪类问题都没想清楚,先下几个 T 的数据回来,后面基本会浪费大量时间在解压和格式转换上。
1.1 图像分类:数据集的起点与标尺
图像分类是整个 CV 领域最基础的任务,数据集的标注方式也最简单:每张图片对应一个类别标签。模型只需要把整张图归到一个类别里。MNIST、CIFAR-10/100、ImageNet 就是这一类任务的典型代表。
MNIST 的手写数字识别几乎被当成深度学习界的“Hello World”,但它的图像尺寸只有 28x28 灰度图,今天用来跑通一个训练脚本没问题,用来验证模型性能已经不太够。CIFAR-10/100 是 32x32 的彩色小图,类别少、单张图片内存占用小,非常适合在普通笔记本上做快速实验。ImageNet 则是大规模图像分类的事实标准,ILSVRC 2012 比赛用的那个版本有 1000 个类别、约 128 万张训练图片,是很多论文验证模型性能必须用到的基准。
对于刚入门的人,我建议不要一上来就下载 ImageNet。先用 CIFAR 把数据加载、训练、评估这条链路跑顺,再去用 ImageNet 子集或者全量数据做实验,会轻松得多。
1.2 目标检测:从 Pascal VOC 到 COCO 的演化
目标检测要求在图像中找出所有目标,并给出每个目标的类别和矩形框位置。它的标注比分类复杂很多,一张图里有几个物体,就要画几个框,所以数据集的格式也相对复杂。
Pascal VOC 是早期的经典检测数据集,VOC 2012 有 20 个目标类别,训练验证图片加起来约一万多张。虽然规模不大,但它的标注干净、类别均衡,非常适合做算法原型验证。后来出现的 COCO 数据集把检测任务推到了一个更复杂的层次:80 个类别,训练集图片超过 11 万张,每张图的目标数量和遮挡情况更接近真实场景。再加上它同时提供了实例分割掩码、人体关键点、图像描述等标注,已经成为检测与分割领域的事实标准。
用 COCO 做检测项目,要注意区分年份和标注类型。很多人下载了多个 json 文件,却不知道 2014 和 2017 的 train/val 划分不一样,结果训练脚本读错数据集,白白跑了好几天。
1.3 分割任务:语义、实例与全景
分割可以理解为“像素级别”的分类。语义分割把每个像素归到某个类别,不区分同一个类别的不同物体;实例分割则要区分出同一类里的每个个体;全景分割是两者的结合,既要处理前景物体,也要处理背景区域。
常见的语义分割数据集有 Cityscapes 和 ADE20K。Cityscapes 是街景驾驶场景的数据集,包含 50 个城市的高质量像素级标注,训练集和验证集合计约 5000 张精标注图像,另外还有两万张左右粗糙标注图像,适合做城市交通场景的语义分割。ADE20K 有 150 个语义类别,覆盖室内外各种场景,是衡量分割模型泛化能力的常用数据集。
实例分割方面,COCO 提供了 stuff 和 things 的区分,LVIS 则在 COCO 的基础上把类别规模扩大到 1200 多个,专门用来研究长尾分布下的实例分割问题。如果你只是做入门练习,Cityscapes 和 COCO 就够用了,没必要一上来就碰 LVIS。
1.4 人脸、姿态、OCR 等垂直场景
除通用识别外,CV 还有大量垂直方向的任务。人脸检测和人脸识别常用 WIDER Face、CelebA、LFW;人脸关键点检测常用 300W、WFLW;人体姿态估计用 COCO Keypoints 和 MPII;OCR 方向常用 SynthText、ICDAR 系列、CTW 中文数据集。
这一块我的经验是:按任务过滤,而不是按名字收集。很多人收藏了几十个数据集链接,实际用到的不到十分之一。你需要什么任务,再去对应领域的公开榜单上看排名前列的方法都用了什么数据集,然后只下载那一个,效率会高很多。
2. 选数据集之前,先搞清楚这三件事:任务、规模与应用场景
数据集选型没有那么玄乎,核心就三件事:你的任务需要什么标注格式,你的机器能承受多大数据量,你的最终应用场景和数据集是否匹配。这三件事想清楚,能少走很多弯路。
2.1 任务决定标注格式
同样是图片数据,分类任务可以直接用文件夹名当标签,检测任务需要框的坐标,分割任务需要像素级掩码。不同数据集的标注格式也可能完全不一样,Pascal VOC 用的是 XML 文件,COCO 用的是 JSON 文件,YOLO 工具链更习惯用 TXT 文件。
所以在选数据集之前,先想清楚自己用的框架需要什么输入。如果你用的是 YOLOv8 这种偏工程化的框架,它通常支持 COCO 格式,也支持 YOLO 格式。如果你用的是 mmdetection,它更习惯 COCO JSON。提前做好格式匹配,把时间花在模型训练上,而不是花在格式转换的重复劳作上。
2.2 规模不是越大越好
看到 80GB、200GB 的数据集压缩包,很多人第一反应是“全下了再说”。但下载只是开始,后续的解压、加载、遍历、清洗才是消耗时间的大头。如果你只有一块普通显卡,甚至只有 CPU,那么跑 ImageNet 全量数据基本不现实。
我的做法是分级使用:在小数据集上调试代码,验证 loss 能下降、指标有变化,再用中等规模数据集跑完整实验,最后才考虑是否上大数据集。比如先用 CIFAR-10 验证模型实现有没有 bug,再切到 Pascal VOC 或 COCO 子集上做检测指标评估,这样能尽早发现问题,避免浪费大量训练时间。
此外,建立子集也是一种常用策略。从 COCO 训练集中随机采样 5000 张图片,单独建一个coco_subset目录,所有快速实验都在子集上跑。很多框架都支持通过配置文件做采样,不需要真的把数据复制一份出来。
2.3 领域分布和长尾问题
公开数据集并不代表数据分布就一定合理。以 COCO 为例,常见类别如 person、car 的样本非常多,但某些物品类别的样本很少,这种长尾现象在真实业务里更严重。
如果你的项目关注长尾分布,最好选择专门处理这类问题的数据集,比如 LVIS 或 ImageNet-LT,它们在类别设计上刻意保留了长尾特性。如果你只是自己训练一个通用检测器,那就需要留意类别权重、采样策略或者损失函数,避免模型被高频类别带偏。
另一个容易被忽略的问题是场景迁移。学术数据集拍的是自然场景,你的业务数据可能是工厂流水线上的零件。模型在 COCO 上表现好,不等于在你的业务数据上表现好。这时候要先找领域相近的数据集,遥感图像优先看 DOTA,工业检测优先看特定竞赛公开数据,而不是盲目套用通用数据集。
3. 常用开源数据集逐个拆解(含获取方式和坑)
这一部分把真正高频使用的数据集挑出来,逐个说清楚内容构成、获取方式和实际使用中容易踩的坑。可能不够全,但足够覆盖大部分 CV 场景。
3.1 ImageNet:分类任务的老大哥
ImageNet 在深度学习发展史上的地位不用多说。我们常说的 ImageNet,一般指 ILSVRC 2012 分类数据集:训练集约 120 万张图片,验证集 5 万张,类别数 1000。它每张图片都经过人工审核,类别层次结构清晰,是检验模型表达能力的最高频基准。
获取方式上,官方要求注册申请后才能下载,有时候还需要教育或机构邮箱。个人使用也可以找一些高校或云厂商做的镜像站,但一定要比对文件校验值。很多人用各种下载工具拉 ImageNet,解压时才发现文件损坏,原因大多是下载工具不支持断点续传。建议用aria2c这类支持多线程续传的工具,下载完成后用 md5 校验一遍。
ImageNet 的目录结构本身不算复杂,train文件夹下面按类别编号建子目录,每个子目录里是图片文件。踩坑最多的反而是标签映射:meta.mat、ILSVRC2012_mapping.txt、synsets.txt这些东西容易搞混。如果你只用 PyTorch,torchvision.datasets.ImageFolder配合meta文件就能读,但建议先打印前几条样本,确认类别索引和标签名称一一对应。
3.2 COCO:检测与分割的事实标准
COCO 是一个非常庞大的数据集体系,它包含目标检测、实例分割、全景分割、人体关键点、图像描述等多项标注。做检测或实例分割,大部分现代模型默认用 COCO 2017 版本。它把数据分成train2017和val2017两个图片压缩包,以及annotations_trainval2017.zip标注压缩包。如果你只需要检测标注,解压后找instances_train2017.json和instances_val2017.json就对了,不要把所有 json 都加载进内存,特别是captions这类额外标注文件会白白增加内存占用。
COCO 的标注 JSON 结构是嵌套字典,顶层包含images、annotations、categories等字段。每个annotation里有bbox、area、iscrowd和分割掩码。用的时候一般配合pycocotools,这套工具已经成了事实标准。踩坑点在于:bbox格式是[x, y, width, height],不是[x1, y1, x2, y2];如果自己写转换逻辑,一定不要搞反。另外iscrowd=1的标注通常表示人群等密集目标,在目标检测评估里会特殊处理,初学者最容易忽略。
3.3 Pascal VOC:学术实验的轻量选择
Pascal VOC 虽然年代久远,但到今天仍然有人用,原因是它轻量、干净,跑起来快。VOC 2012 的检测任务包含 20 类,训练验证图片约 1 万多张,一个中等显卡就能在较短时间内完成多轮训练。很多经典论文在最初的实验阶段都会拿 VOC 做调试。
VOC 的标注是 XML 格式,每个目标一个<object>节点,里面有<name>、<bndbox>等字段。图片和标注文件单独放在JPEGImages和Annotations目录里。初学者用它做数据加载,自己写个 XML 解析器就行,不需要引入额外库。
坑主要出在分割标注上。VOC 的SegmentationClass目录里是调色板索引图,用 PIL 读出来是 P 模式,像素值对应的是类别 ID,而不是常见的 RGB 分割图。如果你直接把图片读成 RGB,再当作 mask 去算 loss,结果一定不对。正确做法是转成索引图,提取像素值作为类别标签。
3.4 Open Images、LVIS 与其他大型数据集
Open Images 是 Google 发布的大规模数据集,V7 版本包含约 900 万张图片,600 多个类别的检测框标注,还有关系标注、视觉关系等内容。规模比 COCO 大很多,适合做预训练或大规模模型研究,但不适合入门。它的标注文件是 CSV 格式,类别体系是分层的,比如“动物”下面有“狗”“猫”,有些父类也有自己的标注,处理起来比 COCO 更繁琐。
LVIS 可以看作 COCO 的扩展版本,图像来源和 COCO 重叠度很高,但类别扩充到 1200 多个,并且针对长尾分布做了精心设计。如果你研究少样本检测、长尾学习,LVIS 是很合适的 benchmark。需要注意,LVIS 的评估指标和 COCO 不太一样,它会按类别频率分组报告 AP,不能直接用 COCO 的评估脚本跑。
另一个常被忽视的数据集是 Objects365,它有 365 个类别,标注框数量超过 1000 万,是国内团队发布的通用物体检测数据集。和 Open Images 相比,Objects365 的类别更贴近日常物体,但获取也需要申请。这类大规模数据集适合做预训练,不适合作为第一份练手数据。
3.5 垂直领域数据集推荐表
这里整理一张常用数据集推荐表,方便你按任务快速定位。这张表不是完整目录,但覆盖了大多数常见场景。
| 任务方向 | 推荐数据集 | 规模特点 | 标注类型 | 适合场景 |
|---|---|---|---|---|
| 图像分类 | CIFAR-10/100、ImageNet | 小/大 | 类别标签 | 入门、论文基准 |
| 目标检测 | Pascal VOC、COCO、Open Images | 中/大 | 矩形框 | 学术、预训练 |
| 实例分割 | COCO、LVIS | 大 | 多边形掩码 | 长尾、通用分割 |
| 语义分割 | Cityscapes、ADE20K | 中 | 像素级别 | 街景、通用场景 |
| 人脸检测 | WIDER Face | 中 | 人脸框 | 人脸检测 |
| 人脸识别 | LFW、CelebA | 中 | 身份标签、属性 | 人脸识别/属性 |
| 人体姿态 | COCO Keypoints、MPII | 中 | 关键点 | 姿态估计 |
| OCR 文字检测 | SynthText、ICDAR 2015 | 中 | 文本框、文字 | 场景文字检测 |
| 视频动作识别 | UCF101、Kinetics-400 | 中/大 | 视频标签 | 视频理解 |
| 图像超分 | DIV2K | 小 | 高分辨率原图 | 超分辨率重建 |
| 遥感图像 | DOTA、NWPU VHR-10 | 中 | 旋转框/框 | 遥感检测 |
4. 数据集下载与预处理的实战经验
到这一步,你需要的不再是数据集名字,而是怎么把数据真正用起来的工程能力。下面这段是我踩过不少坑之后整理出来的完整流程。
4.1 下载方式盘点:官方脚本、镜像与学术网络
最稳妥的下载方式永远是官方渠道。很多数据集官网会给出下载脚本或命令,比如wget、curl,甚至提供 Python 下载器。不要为了省事直接用一个百度网盘分享链接,因为你无法保证文件没有被改动,尤其是那些动辄几十 GB 的数据集,解压失败后重下代价很高。
如果需要多线程下载大文件,aria2c是很好的选择:
aria2c -x 16 -s 16 -d /data/datasets -o train2017.zip "https://example.com/train2017.zip"-x 16表示每个服务器最多开 16 个连接,-s 16表示将文件分成 16 段下载,速度一般能拉满。下载完成后,记得比对文件的 md5 或 sha256 值。如果你用的是学校或公司的内部镜像,也要对准版本号,镜像同步可能存在延迟。
4.2 解压、目录结构与标注格式转换
建议把数据集统一放在一个根目录下,比如datasets/,每个数据集单独建文件夹,内部保持官方结构。不要为了“方便”手动重命名文件,很多框架的 Dataset 类会按固定路径查找文件,改乱之后很难排查。
不同框架对标注格式的要求不同。最让我花时间的就是 COCO JSON 转 YOLO TXT。YOLO 格式要求每张图片对应一个 TXT 文件,每行是class_id x_center y_center width height,坐标必须归一化到 0 到 1。一个简单的转换思路如下:
import json from pathlib import Path coco_path = Path("instances_train2017.json") out_dir = Path("labels_train2017") out_dir.mkdir(exist_ok=True) with open(coco_path) as f: data = json.load(f) image_id_to_name = {img["id"]: img["file_name"] for img in data["images"]} annotations = data["annotations"] for ann in annotations: image_name = image_id_to_name[ann["image_id"]] txt_name = out_dir / (Path(image_name).stem + ".txt") cat_id = ann["category_id"] bbox = ann["bbox"] # [x, y, w, h] # 如果你需要归一化,还要读取图片宽高 # 这里默认你已经拿到了 image_w, image_h # ...实际使用中,你还需要读取每张图片的宽高,才能把坐标归一化。更省事的方案是用现成工具,比如roboflow的格式转换功能,或者ultralytics框架自带的标注格式转换脚本,但原理都一样,理解清楚比复制代码更重要。
4.3 数据清洗与类别不平衡处理
开源数据集不代表不需要清洗。我曾经下载过一个公开检测数据集,解压后发现里面有几十张损坏的 JPEG 图片,训练到一半直接报错,排查了很久才发现是图片文件不完整。
稳妥的做法是训练前先跑一遍校验脚本,用 PIL 检查每张图片能否正常打开:
from PIL import Image from pathlib import Path for img_path in Path("images").glob("*.jpg"): try: with Image.open(img_path) as img: img.verify() except Exception as e: print(f"corrupt: {img_path}")这一步虽然耗时,但能在训练开始前就把脏数据排除掉。接下来是类别分布检查。你可以统计每条类别在训练集中出现的次数,看看有没有明显的长尾。如果某个类别的样本特别少,可以用过采样、类别重加权或者合成数据来缓解,但核心原则是:先保证验证集和测试集的类别分布能真实反映实际场景。
4.4 自制数据集的起点:标注工具与格式
开源数据集很难完全覆盖业务需求,所以你迟早要面对自制数据集的问题。个人或小团队做标注,我用得最多的是 LabelImg 和 Labelme。LabelImg 适合画矩形框,可以直接导出 Pascal VOC XML 或 YOLO TXT;Labelme 适合画多边形,做分割标注更顺手。
如果你的标注需求复杂、多人协作,可以考虑 CVAT 这类在线标注平台。它支持自定义标签体系、多人标注、自动追踪进度,还内置了半自动标注模型。团队标注时,一定要提前写好标注规范:哪类目标需要框进去,遮挡目标怎么处理,类别边界模糊时以哪个标签为准。没有规范的标注团队,产出的数据质量很难保证。
5. 一个可落地的选型思路:从论文复现到业务落地
数据集选型不是一刀切。复现论文和做业务落地,对数据的要求完全不同,下面分开说。
5.1 复现论文怎么选
复现论文时,最好直接使用论文官方指定的数据集、数据划分和评估脚本。如果论文在 ImageNet 上做了报告,你也应该用 ImageNet 的同一版本,至少是同样的类别数和数据划分。很多人为了图省事用 CIFAR-100 去替代,结果论文里的优化技巧和超参数根本不匹配,复现不出来的原因不是模型写错,而是数据口径不对。
如果机器资源有限,可以做“缩小版复现”:把训练集随机采样一部分,保持类别占比,验证模型和 loss 是否正常。完整精度指标还是在论文设定的数据集上跑,不然评测没有可比性。
另外,论文官方仓库里往往会写明数据集的预处理方式,比如图片缩放尺寸、裁剪策略、归一化均值标准差。这些细节要和数据集版本一起记录下来,否则后续对比实验结果时很容易困惑。
5.2 业务落地怎么选
业务落地场景通常不可能靠开源数据集一步到位。开源数据集的正确用法是作为预训练来源或 baseline 对照,最终还是要用业务数据微调。比如你做工业质检,可以先在 COCO 或 Open Images 上预训练一个检测器,再用几百张标注好的业务图片微调,得到的效果通常比从随机初始化开始训练好很多。
但 domain gap 问题需要警惕。通用数据集上的图像分布和工业流水线拍摄的图像差别很大,直接迁移有时候会不如预期。我遇到过的情况是,用 COCO 预训练的模型在业务数据上 AP 不升反降,后来发现是因为业务图片成像角度、光照和背景高度一致,预训练权重带来的通用特征反而干扰了领域特有特征。遇到这种情况,可以尝试冻结 backbone 的前几层,只微调后面几层,或者适当地用业务数据做更长时间的训练。
5.3 数据增强和子集策略
数据增强是提升模型泛化能力最直接的方法之一。常用的库有 albumentations、imgaug、torchvision.transforms。我建议优先学 albumentations,它的增强算子丰富,而且性能不错,适合 CV 训练流程。
增强需要和场景匹配。做检测时,翻转和尺度变化通常有效;做 OCR 时,随机旋转和透视变换要小心,可能把文字扭曲得不可读;做医学图像时,某些几何增强会改变解剖结构,这时候需要考虑使用弹性形变等更保守的增强方式。
子集策略上,我习惯按阶梯方式做实验:先用 1000 张数据跑通训练流程,确认数据加载、loss 计算、评估指标都正确;再逐步扩大到 5000 张、全量数据。这样做的好处是,如果代码有 bug,小数据量能让你快速发现;如果小数据量上模型就欠拟合,大概率是模型容量或学习率设置的问题,和数据集规模关系不大。
6. 开源数据集的 License、引用规范与一些容易被忽略的边界
这部分内容看起来不像技术,但搞不好会给你带来大麻烦。很多开源数据集虽然“开源”,但使用条款并不一样,而且有的数据来自社交网络,涉及肖像权或隐私问题。
6.1 License 不是小事
COCO 数据集采用的是 CC BY 4.0 许可,这意味着你可以自由使用、修改,但要注明出处,不能附加限制别人的条款。Pascal VOC 有自己的使用条款,通常在官网页面里说明。Cityscapes 则需要注册并同意协议后才能下载。ImageNet 的使用条款也明确规定,下载和使用要遵循它的限制条件。
如果你只是做学术实验,这些问题可能不会马上暴露;但如果你要把模型商业化、上线部署,就必须逐条检查数据集的许可协议。有些数据集明确标注“仅限研究用途”,商用会构成侵权。我见过一个项目因为训练数据里包含了一批不可商用的开源数据,最后整个模型都要重训,成本极高。
6.2 标注一致性和数据版本管理
数据集的版本问题也很容易被忽视。同一份数据,2014 版本和 2017 版本的划分可能不一样;官方修复某个标注错误后,也会发布新版本。写代码时一定要把数据版本号和校验值固定下来,最好用一个配置文件统一管理。
我在实际项目中用 DVC 管理数据集版本,虽然初期配置有点麻烦,但好处是每个实验跑出来的结果都能追溯到具体的数据版本和代码版本。如果你不想引入额外工具,至少要在实验记录里写清楚:用了哪个数据集、哪个年份、哪个标注文件、下载链接是什么。
另外,如果项目涉及人脸数据,要格外谨慎。公开数据集如 CelebA 虽然可以用于研究,但发布包含人脸图像的模型演示时,需要考虑肖像权和隐私问题。不要为了追求效果,把敏感数据随意传到公共平台上做训练或评估。这一条不是技术建议,而是必须养成的职业习惯。
最后分享一个我自己的小经验:收藏数据集链接没什么用,真正有用的是建立一张自己的“数据集台账”。我会在本地维护一个表格,记录每个数据集的名称、版本、下载日期、校验值、目录路径、使用项目、License 类型。这样每次开新项目,先从台账里找有没有能直接复用的数据;没有的话,再按照本文的方法去选新的开源数据集。坚持下来,你会发现 CV 项目最耗时间的往往不是模型,而是数据治理,但这件事做扎实了,后续的模型工作会顺畅很多。