1. 为什么需要自己构建人体姿态数据集
在计算机视觉领域,人体姿态估计是一个非常重要的研究方向。无论是健身动作识别、跌倒检测,还是虚拟试衣、动画制作,都需要准确的人体姿态数据作为基础。虽然网上可以找到一些公开的数据集,比如COCO、MPII等,但这些数据集往往存在几个问题:
首先,公开数据集的场景比较固定,可能无法满足特定项目的需求。比如你要做一个专门检测老年人跌倒的系统,公开数据集中的跌倒样本可能不够多。其次,公开数据集中的人体姿态、着装、体型可能和你的目标用户群体有差异。最后,使用公开数据集做研究时,很难有独特的创新点。
我自己在做毕业设计时就深有体会。当时想做一个篮球动作分析系统,找遍了公开数据集都找不到足够多的投篮、运球样本。后来咬咬牙自己采集数据,虽然费时费力,但最终的模型效果比用公开数据集训练的好很多。这也让我明白了一个道理:在AI时代,高质量的数据往往比复杂的算法更重要。
2. 数据采集全流程指南
2.1 拍摄设备与环境准备
很多人觉得采集数据需要专业相机,其实不然。现在的智能手机摄像头完全够用,我实测过iPhone和主流安卓机拍摄的图片,在480p分辨率下都能满足标注需求。关键是要注意以下几点:
拍摄环境最好选择纯色背景,比如白墙或者绿幕。如果条件有限,至少要确保背景不会太杂乱。光线要充足均匀,避免出现明显的阴影。拍摄时要保持手机与被拍摄者眼睛平齐,这个高度拍出来的图片最符合人体姿态估计的需求。
建议让被拍摄者站在距离镜头2-3米的位置,这样既能拍到全身,又不会因为距离太远而丢失细节。可以在地上贴个标记点帮助定位。
2.2 拍摄姿势规范
根据我的经验,一个完整的人体姿态数据集应该包含三种基本状态:
- 站立状态(UP):正面、侧面、背面各3-4张
- 中间状态(BENDING):弯腰、蹲下等过渡姿势
- 跌倒状态(FALL):坐下、躺下等着地姿势
每种状态要从多个角度拍摄,建议至少包含正面、左侧面、右侧面三个视角。每个姿势要拍摄10-15张,这样可以确保有足够的样本量。拍摄时可以让人物自然移动,连续抓拍,这样得到的姿态会更自然。
特别注意要覆盖各种体型和着装的被拍摄者。如果条件允许,最好能找到不同身高体重的人参与拍摄,这样训练出来的模型泛化性会更好。
2.3 文件命名与组织规范
规范的命名和组织方式可以节省后期大量时间。我推荐使用以下命名规则:状态_编号_序号.jpg比如:
- UP_001_01.jpg(站立状态)
- BENDING_001_02.jpg(弯腰状态)
- FALL_001_03.jpg(跌倒状态)
建议把所有图片放在一个文件夹中,不要分多个子文件夹。这样在用Labelme标注时会方便很多。文件夹结构可以这样:
dataset/ ├── UP_001_01.jpg ├── UP_001_02.jpg ├── BENDING_001_01.jpg ├── FALL_001_01.jpg └── ...3. Labelme安装与配置详解
3.1 多种安装方式对比
Labelme作为最流行的图像标注工具之一,提供了多种安装方式。对于初学者,我推荐使用Anaconda来管理Python环境,这样可以避免很多依赖问题。
先创建一个新的conda环境:
conda create -n labelme python=3.8 conda activate labelme然后安装Labelme:
pip install labelme如果下载速度慢,可以尝试清华镜像源:
pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple对于不熟悉命令行的用户,也可以直接下载打包好的exe文件。Windows用户可以从GitHub Release页面下载最新的.exe安装包,双击安装即可。
3.2 界面功能全解析
安装完成后,在命令行输入labelme就能启动程序。主界面主要分为以下几个区域:
左侧是图像显示区,在这里可以看到要标注的图片。右侧是文件列表,会显示当前文件夹中的所有图片。上方菜单栏包含各种功能选项,最常用的是"Open Dir"(打开文件夹)和"Save"(保存标注)。
工具栏上有各种标注工具:
- 矩形框(目标检测用)
- 多边形(图像分割用)
- 线条(车道线等标注用)
- 点(人体关键点标注用)
对于人体姿态估计,我们主要使用"点"标注工具。标注时建议先勾选"Auto Save"选项,这样每标注完一个点都会自动保存,避免意外丢失数据。
4. 人体关键点标注实战技巧
4.1 标注规范详解
人体姿态估计通常使用17个关键点的标注方案,这些关键点对应人体的主要关节。标注时要特别注意顺序和位置准确性。下面是我总结的关键点编号和对应部位:
- 鼻子
- 左眼
- 右眼
- 左耳
- 右耳
- 左肩
- 右肩
- 左肘
- 右肘
- 左手腕
- 右手腕
- 左髋
- 右髋
- 左膝
- 右膝
- 左脚踝
- 右脚踝
标注时一定要按照这个顺序进行,因为很多姿态估计算法都依赖固定的关键点顺序。如果某个部位被遮挡,也要尽量估计位置进行标注,不要直接跳过。
4.2 标注流程分步指导
打开Labelme后,按照以下步骤操作:
- 点击"Open Dir"选择存放图片的文件夹
- 选择第一张要标注的图片
- 点击"Create Point"工具开始标注
- 按照1-17的顺序依次点击各个关键点
- 每标注完一个点,在弹出框中输入对应的编号
- 全部标完后点击"Save"保存json文件
这里有个小技巧:标注时可以先用矩形框把整个人框出来,这样有助于确定各个关键点的位置。标注过程中如果发现位置不对,可以随时右键点击关键点进行修改。
4.3 常见问题解决方案
在实际标注过程中,经常会遇到一些问题。这里分享几个我踩过的坑:
问题1:标注到一半程序崩溃 解决方案:开启"Auto Save"功能,或者每标完几个点就手动保存一次。
问题2:关键点被遮挡 解决方案:根据可见部位推测被遮挡点的位置。比如左肘被身体挡住,可以根据左肩和左手腕的位置来估计。
问题3:标注顺序混乱 解决方案:严格按照1-17的顺序标注,可以在纸上打印出关键点编号对照表放在旁边参考。
问题4:json文件损坏 解决方案:Labelme生成的json是标准格式,可以用文本编辑器打开检查。如果损坏不严重,可以手动修复。
5. 数据增强与质量检查
5.1 数据增强技巧
标注完基础数据集后,可以通过数据增强来扩充样本量。常用的增强方法包括:
- 旋转:±15度内的小角度旋转
- 平移:上下左右10%范围内的移动
- 缩放:0.9-1.1倍的随机缩放
- 亮度调整:±20%的亮度变化
可以使用OpenCV或Albumentations库来实现这些增强。这里给出一个简单的Python示例:
import albumentations as A transform = A.Compose([ A.Rotate(limit=15, p=0.5), A.HorizontalFlip(p=0.5), A.RandomBrightnessContrast(p=0.2), ], keypoint_params=A.KeypointParams(format='xy'))5.2 质量检查方法
标注数据的质量直接影响模型效果,所以必须严格检查。我通常采用三级检查机制:
第一级:标注时自查 每标完一张图,立即检查:
- 是否所有关键点都标了
- 关键点顺序是否正确
- 关键点位置是否准确
第二级:批量检查 使用脚本检查所有json文件:
import json import os for file in os.listdir('annotations'): if file.endswith('.json'): with open(os.path.join('annotations', file)) as f: data = json.load(f) assert len(data['shapes']) == 17, f"{file} has wrong number of points"第三级:抽样检查 随机抽取10%的样本进行人工复查,确保没有系统性错误。
6. 进阶技巧与注意事项
6.1 多人场景处理
当图片中有多个人时,标注要特别注意:
- 每个人都要单独标注17个关键点
- 不同人的关键点要用不同的group_id区分
- 标注顺序要一致,比如都从左到右
Labelme支持多人标注,只需要在标注不同人时点击"Create Point"重新开始一组即可。保存的json文件中会用"group_id"字段区分不同人。
6.2 标注效率提升技巧
标注工作很耗时,我总结了一些提升效率的方法:
- 使用快捷键:
- Ctrl+Z 撤销
- Ctrl+S 保存
- P 切换到点标注工具
- 先标注容易的点(如鼻子、眼睛),再标注难的点
- 相似姿势批量标注,保持节奏
- 适当休息,避免疲劳导致标注质量下降
6.3 与其他工具的对比
除了Labelme,还有其他一些标注工具:
- CVAT:功能更强大,但配置复杂
- LabelImg:只支持矩形框标注
- VGG Image Annotator:在线工具,无需安装
经过对比,Labelme在人体关键点标注上依然是最方便的选择,特别是在自定义标注方案和本地使用方面。