搞计算机视觉的兄弟应该都懂这个痛:图像分类有 ImageNet,目标检测有 COCO,一到"手"这个目标,能用的干净数据就那么几份,下载还要填表、等邮件、签协议。前阵子带新人做手势识别项目,第一周全耗在找手部开源数据集上,官方页面扒了一圈,能直接用的没几个,不是格式老旧就是标注残缺,要不就是 License 写满了"仅限科研"。这篇就把我用过和调研过的手部开源数据集按任务类别完整捋一遍:手势分类、手部检测、关键点检测、3D姿态估计、手物交互,覆盖 RGB、深度、合成数据,顺手把下载入口、标注格式、常见坑都交代清楚。给准备入手部项目又不想从零标数据的人一份能照着抄的清单。
1. 手部数据集为什么稀缺:先搞清楚难点再选型
1.1 采集难:手是画面里最"灵活刁钻"的目标
手部数据之所以这么难找,最直接的原因是采集成本天然比别人高。通用物体检测随便拿相机在街上扫一圈就能攒几万张,手部任务要求"手必须清晰可见、动作完整、尺度合适",这就麻烦多了。手指动作每毫秒都在变,同一只手在侧拍、俯拍、强光、逆光下的视觉差异极大,手指之间还会互相遮挡,在低分辨率图里五根手指的边界几乎消失,连人眼都分不清哪根是哪根。
早期团队做手部关键点检测时,标完第一批图才发现有大量样本因为手太小、严重自遮挡或运动模糊属于废样本,后面被迫做了一轮人工清洗。这种情况反馈到数据集上,就是公开数据普遍存在两个问题:要么是实验室环境干净但场景单一,要么是真实场景丰富但数量上不去。所以你会发现一个很有趣的现象:通用检测数据集动辄上百万张,而手部关键点数据集能超过十万张的屈指可数。
1.2 标注贵:21个关键点的标注成本远超你想象
手部关键点通用标注是 21 个点,手腕 1 个,拇指、食指、中指、无名指、小指各 4 个。这 21 个点里只要有一个标歪,训练出来的模型在指尖位置就非常离谱。一线标注员标一张手部图通常要 15 到 30 秒,遇到手指交叉、重叠的图还得反复看原图确认,常常要标两遍再校对一遍。所以 COCO 物体检测能轻松标几十万张,而手部关键点数据集的规模普遍小一个数量级。
这也是我为什么建议大多数人放弃自建数据集,直接用手部开源数据集起步。自己标注不仅贵,还容易标出脏数据,里外里亏得慌。与其纠结"数据不够干净",不如先把手头开源数据吃透,再针对自己的场景补几十张数据做微调,这个投入产出比要高得多。
2. 主流手部开源数据集全盘点:按任务分类慢慢挑
2.1 手势分类与检测:Jester、HaGRID、NVGesture
20BN-Jester(视频手势分类)
Jester 是视频手势分类绕不开的选手,出自 TwentyBN,总共 148,092 个视频片段,每个片段约 3 秒,标注了 27 类手势,包括滑屏、放大缩小、转动手指、点赞、停止这些日常交互动作。数据是 MP4 视频,不是单帧图片,因此非常适合做视频级手势识别、时序模型这类任务。官方只提供视频级标签,没有帧级框标注,如果你要做的是帧级检测,Jester 就不太对口。
Jester 的下载需要注册官网账号,填一个申请表格,审核后官方会给一个下载脚本,里面是一堆 URL 列表,挨个下载就行。由于视频总数多,整体体积不小,建议用支持断点续传的工具挂着拉,别用浏览器直接下。这个数据集在手势分类领域属于"起步第一份"的地位,跑通一遍你就知道视频手势分类大概是怎么回事了。
HaGRID(手势检测+分类)
HaGRID 全称 HAnd Gesture Recognition Image Dataset,2022 年前后发布,让我眼前一亮的新数据集。它包含约 55 万张 RGB 图像,覆盖 18 类常见交互手势外加无手势背景,图像里自带手部检测框和手势类别标签,一套数据同时支持目标检测和手势分类两个任务。数据来源是众包采集,场景、肤色、光照变化比较充分,比纯实验室数据实用不少。
HaGRID 在 Kaggle 上就有,下载比 Jester 省心太多,不需要填表,直接拉就行。如果你要做一个"人机交互手势识别"的落地项目,我强烈建议把它当成主力数据。唯一要注意的是它自带的手势类别偏向"交互控制"这一类,比如点赞、比心、握拳、比数字、喊停、OK 这些,手语方向就不太适用了。
NVGesture(驾驶场景手势交互)
NVGesture 是 NVIDIA 发布的驾驶环境下手势交互数据集,包含 1,532 个视频序列,25 类手势,由 20 位受试者完成,数据同时提供 RGB 和深度图,类别涵盖滑动手势、点击、旋转等。这个数据集的特殊价值在于场景:它拍摄的是驾驶员在中控台附近做手势的画面,背景固定、光照相对复杂,适合做车载手势交互。
下载需要申请,NVIDIA 官方审核后会提供下载链接。因为场景比较专一,拿它做驾驶舱内手势识别很贴切,但你也别指望把它直接迁移到其他场景,背景差异太大会导致泛化明显变差。
2.2 关键点与姿态估计:AI Challenger、FreiHAND、BigHand2.2M、NYU、ICVL、RHD
AI Challenger 手部关键点数据集
国内做手部关键点的同学应该都听过 AI Challenger,这是 2017 年 AI Challenger 大赛放出的大规模手部关键点数据集,标注了 21 个关键点,采用 JSON 标注格式,里面包含训练集和验证集。图像来自网络真实生活场景,尺度、遮挡、复杂度都很可观,是少有的中文社区友好数据集,很多人拿它跑 HRNet、OpenPose 这些模型做手部关键点。
它的标注格式和 COCO 不完全一样,关键点坐标是一长串按顺序排列的数值,没有 visibility 这个位,用的时候要注意做转换。这个数据集现在依然能找到下载入口,部分机构在百度网盘和 AI Studio 上有转存版本,下载难度算中等。
FreiHAND(RGB 3D手部姿态+MESH)
FreiHAND 是我做 3D 手部姿态时用得最多的一份数据,来自弗莱堡大学,CVPR 2019 发布。它是纯 RGB 图像,总共 36,520 张,其中 32,560 张训练图像,3,960 张评估图像。标注非常全:2D关键点、3D关键点、MANO 手部网格参数都有,评估集的标注不公开,需要提交到官方服务器评测。
FreiHAND 的图像包含各种背景、物体、遮挡情况,和实验室纯色背景的深度数据完全是两个路子,现在很多 3D 手部重建论文都用它做基准。下载需要在官网同意条款后获取链接,License 是非商业用途,做科研没问题,商用要谨慎。
BigHand2.2M(大规模深度手部姿态)
BigHand2.2M 顾名思义是 220 万帧深度图像,来自帝国理工等机构,用十位受试者的左右手采集,标注了 21 个 3D 关节。它是深度模态里规模最大的那一档,特别适合训练纯深度图像下的手部姿态估计模型。
这个数据集的申请流程相对严格,一般要填表并说明用途,官方审核后发下载链接。深度图本身没有颜色信息,训练出的模型图像域和 RGB 完全不同,想做跨模态迁移还需要额外处理。
NYU Hand Pose(RGB-D多视角)
NYU Hand Pose Dataset 是 2014 年的老牌数据集,用 Kinect 采集,包含三个视角,训练集 72,757 帧,测试集 8,250 帧,标注了 36 个关节。它提供的多视角信息和深度图质量不错,是早期手部姿态估计研究的标配。虽然年份久远,但做算法对比、跑基准仍然够用,我家机子跑 3D 手部姿态时还经常拿 NYU 做 sanity check。
ICVL Hand Posture(深度+纯关节)
ICVL 是小而干净的代表,深度图像,标注 16 个关节点,训练数据约 1.8 万帧,测试集几百帧。它规模不大,适合快速验证模型思路,或者当初版训练集先跑通整体流程。
RHD(合成渲染手部数据)
RHD 是 Rendered Hand Dataset 的缩写,用 3D 模型渲染出 4 万多张合成手部图像,包含 21 个 2D 关键点、3D 关键点、分割 mask 和深度图。合成数据最大的优势是标注极其精确,不存在"标歪了"的问题,非常适合做预训练。先用 RHD 让模型学会手部结构,再用真实数据微调,是我非常推荐的打法。
2.3 手部分割与第一人称检测:EgoHands、Tzutzu、MPII Hand
EgoHands(第一人称手部分割)
EgoHands 是 CMU 发布的第一人称手部数据集,从 YouTube 上的一百多个第一人称视频里选了 48 个,抽取 4,800 张图像,做了像素级左右手 mask 标注。第一人称视角的手部数据和第三人称完全不同,手在画面里又大又变形,遮挡和运动模糊很常见,因此特别适合做 AR/VR、头戴设备、第一人称视频分析这一类任务。
它的标注是像素级 mask,不是框,做分割训练直接拿原图和 mask 就行。下载方式比较传统,可能需要申请或者从官方渠道拉取。
Tzutzu(视频手部分割)
Tzutzu 是一个手部分割数据集,标注内容是视频帧中的手部 mask,标注相对细致。它没有前面几个那么出名,但在"人物视频里把多只手都分割出来"这类场景里有价值,比如视频会议、直播、手势交互产品。用它做分割模型的补充数据,比单纯用检测框效果好。
MPII Hand(RGB关键点)
MPII Hand 是马普所出的手部关键点数据集,RGB 图像为主,标注 21 个关键点,规模不算大但质量稳定。它的场景偏自然生活,适合作为真实 RGB 手部关键点的验证集,和 AI Challenger、FreiHAND 形成互补。
2.4 手物交互与3D网格:HO3D、DexYCB、ObMan、CMU Panoptic
HO3D(手+物体交互)
HO3D 是 CVPR 2020 发布的手物交互数据集,包含约 7.7 万帧 RGB 图像,人手和日常物体同时出现,标注了 MANO 手部网格、物体 3D 姿态和物体模型。它专门针对"手抓取/操作物体"这个场景,机器人抓取、AR/VR 交互、动作理解都经常用。
DexYCB(大规模手物抓取)
DexYCB 是 CVPR 2021 的大规模手物抓取数据集,包含 1,000 个视频序列、接近 60 万帧,使用两个相机视角拍摄,标注了手部 MANO 网格和物体的 6D 姿态。它在手物交互任务里是目前规模最大的一档,适合训练手抓取物体的深度模型。
ObMan(合成手物网格)
ObMan 是利用 MANO 模型生成的大规模合成手物交互数据,手部网格和物体网格成对提供,标注天然精确,适合做单目 RGB 下的手部网格重建预训练。它和 RHD 思路类似,都是"合成数据当主力,真实数据做微调"的优质原料。
CMU Panoptic(多视角手部数据)
CMU Panoptic 数据集来自卡内基梅隆大学的 Panoptic Studio,用几十上百个相机同步采集,能提供多视角手部画面和准确的 3D 关键点。做多视角重建、跨视角匹配这类研究时它是非常难得的数据来源,缺点是数据体量大、格式复杂,普通项目慎入。
3. 数据集选型决策表:按任务、算力和成本做取舍
3.1 五步选型法
面对一堆数据集,我的习惯是走一套"五步选型法",能省掉大量试错时间:
- 确定任务类型:你要做的是手势分类、检测、关键点还是3D姿态。任务直接决定模态,Jester 是视频分类,HaGRID 是检测加分类,FreiHAND 是3D姿态,硬要混用只会让 pipeline 越来越复杂。
- 确定输入模态:线上产品大多是 RGB 单目,那就优先 FreiHAND、AI Challenger、HaGRID;如果有深度相机,再加 BigHand2.2M、NYU、ICVL。
- 看 License 和下载方式:很多数据只允许科研,商用前必须先读 License。先判断你能不能用,再决定要不要投入时间。
- 看标注格式和现有代码的兼容度:和 PyTorch、MMPose、YOLO 这类框架的格式匹配度越高,上手越快。
- 估算数据量是否够训:图像分类几万张够了,关键点最好十万级,3D mesh 建议配合合成数据。
3.2 数据量、标注质量与 License 怎么算账
选型时不能只看数量,还要看"有效信息密度"。Jester 虽然 14 万段视频,但每段只有 3 秒且只带一个视频级标签,对帧级检测帮助有限;HaGRID 单张图像里手部占比大、标注框准确,对检测任务来说有效样本率非常高。量大数据乱不如量小数据准,这个原则在关键点任务上尤其明显。
标注质量可以用一个土办法核验:随便抽三五十张图,把关键点画出来转成网格图肉眼扫。一看标注点是否贴合手指关节,二看是否存在大量"死点"(永远标在同一个位置的点),三看类别分布两侧是否失衡。发现脏数据率超过 5%,这份数据就要慎重用,或者做好清洗。
License 方面,最常见的是 CC BY-NC 4.0,表示"署名 + 非商用"。学术研究、比赛、开源项目里注明出处一般没问题;一旦你的模型要集成到商业产品里按份卖钱,必须逐字读 License,必要时联系数据作者申请商业授权。FreiHAND、HaGRID 等一批主流数据都是非商用,这个坑我见太多人踩过了。
3.3 混合数据与合成数据补充
纯靠单一数据集构建训练集很难满足真实需求,我的做法是"真实数据打底,合成数据补边角"。有一类边界 case 是真实数据永远覆盖不到的:手指完全重叠、极端光影、罕见角度的自遮挡。这些用 Blender 渲染合成手部图像可以低成本补齐,RHD 和 ObMan 就是现成的合成数据源。
数据增强也是对抗数据稀缺的重要手段。手部任务和通用目标检测不太一样,幅度太大的拉伸和翻转反而会破坏手的拓扑结构,左右翻转虽然手指位置会镜像,但类标签不受影响,可以放心用。我常用的增强组合是随机旋转 ±15 度、平移、色域扰动、随机遮挡小块,最后保证增强后的图上手指仍然是完整的、可辨认的。
4. 下载、解压与标注格式实战
4.1 下载前的准备工作与常见入口
下载这一步劝退了很多人,其实大多数手部开源数据集不是下载难,而是"入口绕"。Jester、BigHand2.2M、FreiHAND 这类都需要先到官网填申请,说明机构、用途、联系方式,等审核通过再发链接。填写申请时建议用机构邮箱,写清楚你是做科研还是工程落地,审核通过率会高很多。提交后定期查一下垃圾箱,不少人的申请链接就躺在那里。
有些数据集在 Kaggle、Hugging Face Datasets 上有转存版本,比如 HaGRID 在 Kaggle 就很方便,不用等邮件。如果一些国外官网访问缓慢或反复超时,可以先找这类镜像入口,第三方转存通常没有官方那么全,但应付大部分训练场景够了。下载时推荐使用支持多线程和断点续传的下载工具,避免下到一半中断又要重来。所有压缩包解压之前先做校验,官方一般会提供 MD5 或者 SHA 值,对不上就果断重下。
4.2 标注格式对照:JSON、CSV、深度图各有各的脾气
手部数据集的标注格式五花八门,我先把最常见的几种说清楚。
AI Challenger 的 JSON 格式大致长这样:
{ "images": [ {"image_id": "hand_0001", "file_name": "00000001.jpg", "height": 720, "width": 1280} ], "annotations": [ { "image_id": "hand_0001", "keypoint_annotations": { "hand_1": [x1, y1, x2, y2, ..., x21, y21] } } ] }它这里的坐标是一个一维数组,前两个数是第 1 个关键点的 x、y,以此类推,一共 42 个数。没有 visibility 标记位,也没有面积、分组等字段,读取很简单,但要自己维护一个"哪个点是哪根手指"的顺序表。
FreiHAND 的标注更复杂,训练集的 JSON 里包含 2D 关键点、3D 关键点、MANO 参数、相机参数,每个主题下还有对应的图集 ID。评估集的图像只有图片没有标注,需要用官方评测服务跑分数。
Jester 的标注最简单,就是一张 CSV 表,每行是一个视频目录(视频被拆成一组图片帧文件夹)和对应的类别数字。20BN 官方用这个 label 做视频分类训练,你要是想做帧级模型,还得自己从视频里抽帧。
不管用哪个数据集,我建议训练前统一做一个格式"翻译",第一步永远是写一个可视化代码,把标注画到原图上确认顺序对不对。这一步能省掉后面排错的大量时间。
下面这段代码是一个读取 AI Challenger 标注并画图的最简脚本:
import json import cv2 with open("keypoint_train_annotations.json", "r") as f: data = json.load(f) img_meta = data["images"][0] ann = data["annotations"][0] key = list(ann["keypoint_annotations"].keys())[0] pts = ann["keypoint_annotations"][key] img = cv2.imread(img_meta["file_name"]) for i in range(0, len(pts), 2): x, y = int(pts[i]), int(pts[i + 1]) cv2.circle(img, (x, y), 3, (0, 255, 0), -1) cv2.imwrite("vis.jpg", img)跑完你会发现大部分数据集转换的关键不在于"会读",而在于"顺序统一"。
4.3 把数据统一成 COCO / YOLO 格式的实操
手部关键点项目我建议统一转成 COCO keypoint 格式,因为 MMPose、Detectron2、MMDetection 这些框架原生支持,省得自己写训练循环。COCO keypoint 的核心结构是每个关键点用三个数表示[x, y, v],v 的取值是 0 表示缺失、1 表示存在但不可见、2 表示可见。AI Challenger 转成 COCO 时,需要把一维数组拆成 21 个点,并把 v 全部置为 2,因为你不知道哪些点被遮挡了,只能全部当作可见处理。
如果是做检测加分类,就转 YOLO 格式。YOLO 的归一化坐标需要知道图像的宽高,然后算 bbox 中心点坐标和宽高占图像的比值:
x_center = (x_min + x_max) / 2 / img_width y_center = (y_min + y_max) / 2 / img_height box_w = (x_max - x_min) / img_width box_h = (y_max - y_min) / img_height如果数据集自带的是关键点标注,没有 bbox,可以先根据关键点坐标扩展外扩一定像素再生成框。我一般会外扩 20% 到 30%,让框里包含一点手腕和背景,对关键点检测比紧贴手指的框更友好。
4.4 训练前的数据检查与增强
数据喂进网络之前,我强烈建议做一遍全面体检,别急着训练。第一步先扫分辨率,把小于 96 像素的手部小目标样本单独拎出来,或者干脆过滤掉,否则模型学到的主要是"大手的特征"。第二步检查坐标边界,有些数据集标注的坐标偶尔会超出图像范围,比如 x 等于 1201 而图像宽度只有 1200,这类样本要修正或丢弃。第三步做可视化抽查,把每个 batch 的标注图拼成网格图整体扫一遍,脏数据这时候就原形毕露了。
增强策略上,手部任务的旋转范围不用太大,5 到 20 度的旋转就能覆盖正常手势变化。亮度、对比度、饱和度的随机扰动可以提高模型对光照的鲁棒性。随机遮挡可以用 erase 类方法,模拟手指被其他物体挡住的情况。需要提醒的是,手指的细节在高分辨率下才有意义,训练分辨率建议至少 256 以上,能用 384 或 512 更好,代价是显存占用和推理速度,需要自己平衡。
5. 高频问题与避坑速查
5.1 下载环节常见问题
官网打不开或者申请邮件迟迟不来,是手部数据集频次最高的痛点。处理办法:检查垃圾箱,用机构邮箱重新申请,去 Kaggle 或 GitHub 搜数据集转存。下载过程中断或压缩包损坏,优先用带校验的下载工具,拿到文件先验证 MD5 再解压,报错就重新下载对应分卷。
有些数据集官网只放了部分文件,比如先给一个样本子集,完整版需要邮件单独要,这种情况耐心沟通一般都能解决。哪怕是大厂出品的数据集,服务器负载也很高,高峰期下载经常限速,我习惯把下载安排在晚上或者用支持断点续传的工具挂着。
5.2 标注格式与坐标坑
标注顺序是最隐蔽的坑。AI Challenger、FreiHAND、NYU 的 21 个关键点顺序并不完全一致,直接拿不同数据集混训时会发现 loss 莫名其妙飘,或者指尖的位置跑到手腕上,本质就是关键点 index 没对齐。处理办法是写一张索引映射表,把每个数据集的点数顺序统一成同一套约定,再进训练管线。
另一个高频坑是坐标原始尺度不一致。有的数据集标注是在原图分辨率上的绝对坐标,有的是裁剪后的局部坐标,还有的是做了归一化的相对坐标。混合使用前必须先检查标注数值范围,如果发现坐标都在 0 到 1 之间,说明已经是归一化坐标,需要乘回宽高才能绘图和转格式。
5.3 训练效果不理想怎么办
模型训练不起来,先别换网络结构,九成是数据问题。手指小目标检测不到,就提高输入分辨率、加大裁剪区域比例,不要整图送入网络,先让网络"看清楚手"。关键点抖动明显,是训练数据里同类手势太少,需要合并多个数据集或者用合成数据补。类别不均衡在 HaGRID 这类大众分类数据集里尤其明显,no_gesture 这类背景样本往往占一半以上,建议做负采样或者给少数类加权重。
过拟合的话,优先用 RHD 这类合成数据做预训练,再用真实数据微调,比单纯堆数据增强有效得多。如果模型在验证集上精度不错但换场景就崩,通常是数据速查表里有偏差,需要补充目标场景的样本再做域自适应。
5.4 License 与合规提醒
手部数据集的 License 是一个容易忽视但影响极大的环节。FreiHAND、HaGRID、BigHand2.2M 等绝大多数主流数据都是科研友好、商用受限,哪怕只是放到 GitHub 上做开源项目,也要仔细看是否允许 "commercial use"。遇到过不止一次,项目模型做完了,商业化评审时才发现训练数据不允许商用,只能推倒重新找数据。
另外很多手部数据集包含真人影像,存在肖像权和使用范围问题。发布 demo 和模型前,注意对人脸、环境信息做脱敏处理,不要直接把包含个人特征的原始图像放出来。自己采集数据更是如此,一定要取得被采集者授权,这一步省不了。
最后再分享一个个人习惯:拿到任何新数据集的第一件事,永远是写一个可视化脚本把标注全部画出来,肉眼扫一遍。文档写得再清楚,都不如亲眼看两张标注图来得实在。看图的五分钟,能帮你避开后面一整天的排错时间。