当前位置: 首页 > news >正文

CVPR2019 CrowdPose数据集保姆级下载与使用指南(附Python解析脚本)

CrowdPose数据集实战从数据解析到模型训练全流程指南拥挤场景下的人体姿态估计一直是计算机视觉领域的难点。当多个目标密集重叠、相互遮挡时传统姿态估计算法的性能往往会大幅下降。CrowdPose数据集的发布为这一挑战提供了标准化的评估基准包含2万张精心标注的拥挤场景图像。但对于刚接触该数据集的研究者来说从原始数据到实际模型训练之间还存在不少技术障碍。本文将带你完整走通CrowdPose数据的使用流程重点解决三个实际问题如何正确解析数据集标注信息如何将数据转换为常用框架的输入格式在拥挤场景下有哪些针对性的数据增强技巧我们不仅提供可直接运行的Python代码还会分享实际项目中的经验教训。1. 数据集结构与核心字段解析拿到CrowdPose数据集后你会发现它由两个主要部分组成CrowdPose/ ├── images/ # 原始图像文件夹 │ ├── 00000001.jpg │ ├── 00000002.jpg │ └── ... └── json/ # 标注文件夹 ├── crowdpose_train.json ├── crowdpose_val.json └── crowdpose_test.json1.1 标注文件关键字段解读每个JSON文件都包含以下核心结构以训练集为例{ images: [ { file_name: 00000001.jpg, height: 640, width: 480, id: 1 }, ... ], annotations: [ { image_id: 1, keypoints: [x1,y1,v1,...,x14,y14,v14], bbox: [x,y,width,height], area: float, id: 1, iscrowd: 0 }, ... ] }其中需要特别注意的字段keypoints包含14个人体关键点的坐标和可见性标记COCO格式为17个关键点v值0未标注1标注但不可见遮挡2标注且可见iscrowd标记目标是否处于拥挤状态1表示是1.2 关键点顺序对照表CrowdPose采用14点标注体系与COCO的17点有所不同序号部位COCO对应序号0左肩51右肩62左肘73右肘84左腕95右腕106左髋117右髋128左膝139右膝1410左踝1511右踝1612头顶-13颈部12. 数据加载与可视化实战2.1 基础数据加载代码使用Python加载和解析标注数据import json import cv2 import matplotlib.pyplot as plt from matplotlib.patches import Rectangle def load_annotations(json_path): with open(json_path) as f: data json.load(f) # 构建image_id到文件名的映射 img_dict {img[id]: img for img in data[images]} # 构建image_id到annotations的映射 anno_dict {} for anno in data[annotations]: img_id anno[image_id] if img_id not in anno_dict: anno_dict[img_id] [] anno_dict[img_id].append(anno) return img_dict, anno_dict2.2 可视化关键点与边界框def visualize(img_dict, anno_dict, img_id, save_pathNone): img_info img_dict[img_id] img cv2.imread(fimages/{img_info[file_name]}) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.figure(figsize(12, 8)) plt.imshow(img) ax plt.gca() for anno in anno_dict.get(img_id, []): # 绘制边界框 bbox anno[bbox] rect Rectangle((bbox[0], bbox[1]), bbox[2], bbox[3], linewidth2, edgecolorr, facecolornone) ax.add_patch(rect) # 绘制关键点 kpts anno[keypoints] for i in range(0, len(kpts), 3): x, y, v kpts[i], kpts[i1], kpts[i2] if v 0: # 只绘制可见或遮挡的关键点 color g if v 2 else y # 绿色可见黄色遮挡 plt.scatter(x, y, ccolor, s50, markero) plt.axis(off) if save_path: plt.savefig(save_path, bbox_inchestight, pad_inches0) plt.show()2.3 实际应用示例# 使用示例 img_dict, anno_dict load_annotations(json/crowdpose_train.json) visualize(img_dict, anno_dict, img_id42) # 可视化第42张图像提示在Jupyter Notebook中运行时建议将可视化结果保存为高分辨率图片方便后续分析拥挤场景的特点。3. 格式转换与框架适配3.1 转换为COCO格式许多框架如MMPose默认使用COCO格式转换时需要处理关键点差异def convert_to_coco(crowdpose_json, output_path): with open(crowdpose_json) as f: data json.load(f) # 关键点映射将14点转换为17点COCO格式 keypoint_mapping { 0: 5, 1: 6, 2: 7, 3: 8, 4: 9, 5: 10, 6: 11, 7: 12, 8: 13, 9: 14, 10: 15, 11: 16, 12: -1, 13: 1 # 头顶和颈部分别处理 } coco_data { images: data[images], categories: [{ id: 1, name: person, keypoints: [nose,left_eye,right_eye,...], # 标准COCO关键点名称 skeleton: [...] # COCO标准连接关系 }], annotations: [] } for anno in data[annotations]: kpts anno[keypoints] coco_kpts [0]*51 # 17个点x3 # 映射已知关键点 for i in range(14): target_idx keypoint_mapping[i] if target_idx ! -1: coco_kpts[target_idx*3:(target_idx1)*3] kpts[i*3:(i1)*3] # 处理头顶CrowdPose特有 - 近似为鼻子和颈部中点 if kpts[12*32] 0: # 头顶可见 nose_x (kpts[13*3] kpts[0*3] kpts[1*3]) / 3 nose_y (kpts[13*31] kpts[0*31] kpts[1*31]) / 3 coco_kpts[0:3] [nose_x, nose_y, 2] coco_anno { **anno, keypoints: coco_kpts, num_keypoints: sum(1 for i in range(17) if coco_kpts[i*32] 0) } coco_data[annotations].append(coco_anno) with open(output_path, w) as f: json.dump(coco_data, f)3.2 转换为MMPose格式MMPose支持自定义关键点定义转换更为灵活def convert_to_mmpose(crowdpose_json, output_path): with open(crowdpose_json) as f: data json.load(f) mmpose_data [] for img in data[images]: img_info { img_file: fimages/{img[file_name]}, img_id: img[id], img_height: img[height], img_width: img[width], annotations: [] } for anno in data[annotations]: if anno[image_id] img[id]: kpts np.array(anno[keypoints]).reshape(-1, 3) mmpose_anno { bbox: anno[bbox], keypoints: kpts[:, :2].tolist(), keypoints_visible: kpts[:, 2].tolist(), iscrowd: anno[iscrowd] } img_info[annotations].append(mmpose_anno) mmpose_data.append(img_info) with open(output_path, w) as f: json.dump(mmpose_data, f)注意不同版本的MMPose可能对数据格式有细微要求建议对照官方文档调整转换逻辑。4. 拥挤场景下的数据增强策略4.1 遮挡模拟增强拥挤场景的核心挑战是遮挡我们可以通过合成方式增强数据def apply_occlusion(img, kpts, occlusion_prob0.3): 模拟遮挡效果 h, w img.shape[:2] augmented img.copy() for i in range(len(kpts)//3): if np.random.rand() occlusion_prob: x, y, _ kpts[i*3:(i1)*3] if 0 x w and 0 y h: radius np.random.randint(5, 20) cv2.circle(augmented, (int(x), int(y)), radius, (127, 127, 127), -1) return augmented4.2 人群密度增强通过复制粘贴人物实例增加拥挤程度def increase_crowd_density(img, annotations, max_add3): 增加图像中的人物密度 if len(annotations) 2: # 至少需要两个实例才能复制 return img, annotations h, w img.shape[:2] augmented img.copy() new_annos annotations.copy() for _ in range(np.random.randint(1, max_add1)): # 随机选择一个实例进行复制 src np.random.choice(annotations) src_kpts np.array(src[keypoints]).reshape(-1, 3) # 随机位移 dx, dy np.random.randint(-50, 50, 2) # 创建新实例 new_kpts src_kpts.copy() new_kpts[:, 0] dx new_kpts[:, 1] dy # 确保关键点在图像范围内 valid_mask (new_kpts[:, 0] 0) (new_kpts[:, 0] w) \ (new_kpts[:, 1] 0) (new_kpts[:, 1] h) new_kpts[~valid_mask, 2] 0 # 超出边界的标记为不可见 # 添加到标注 new_anno { keypoints: new_kpts.reshape(-1).tolist(), bbox: [src[bbox][0]dx, src[bbox][1]dy, src[bbox][2], src[bbox][3]], area: src[area], iscrowd: 1 # 标记为拥挤 } new_annos.append(new_anno) return augmented, new_annos4.3 组合增强策略在实际项目中我们会组合多种增强技术def apply_augmentations(img_path, annotations): img cv2.imread(img_path) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 随机选择增强策略 if np.random.rand() 0.5: img, annotations increase_crowd_density(img, annotations) # 对所有实例应用遮挡 for anno in annotations: kpts anno[keypoints] img apply_occlusion(img, kpts) return img, annotations5. 实际训练中的注意事项在多个拥挤场景姿态估计项目中我们发现以下经验特别重要数据平衡CrowdPose中不同拥挤程度通过iscrowd标记的样本分布不均建议训练时进行过采样或调整损失权重关键点可见性处理对于v1标注但不可见的关键点不同框架处理方式不同。有些完全忽略有些给予较低权重评估指标选择拥挤场景下传统的OKSObject Keypoint Similarity指标可能不够敏感建议同时关注crowd-specific指标如Crowd Index Precision (CIP)Occlusion Robustness Score (ORS)一个实用的训练代码片段PyTorch示例class CrowdPoseDataset(torch.utils.data.Dataset): def __init__(self, json_path, img_dir, transformNone): self.img_dir img_dir self.transform transform with open(json_path) as f: data json.load(f) self.img_dict {img[id]: img for img in data[images]} self.anno_dict defaultdict(list) for anno in data[annotations]: self.anno_dict[anno[image_id]].append(anno) def __getitem__(self, idx): img_info self.img_dict[idx] img Image.open(os.path.join(self.img_dir, img_info[file_name])) annos self.anno_dict[idx] keypoints [] for anno in annos: kpts np.array(anno[keypoints]).reshape(-1, 3) keypoints.append({ keypoints: kpts[:, :2], visibility: kpts[:, 2] }) if self.transform: img, keypoints self.transform(img, keypoints) # 转换为模型需要的格式... return img, keypoints提示在实际部署时建议对拥挤场景进行专门优化。例如可以先检测人群密集区域再对这些区域进行高分辨率处理平衡精度和效率。
http://www.rkmt.cn/news/1414149.html

相关文章:

  • mac 下好用的 ssh 终端工具
  • 曲线轨迹SAR成像:GCBP算法与二维自聚焦技术详解
  • 告别手动调参:ST-MC-Workbench无感FOC代码生成后,如何用官方工具快速调试电机?
  • 别再混淆min和argmin了!用Python和NumPy代码实例讲透机器学习里的这两个关键操作
  • HoRain云--OpenCode Skills
  • OpenCV实战:手把手教你用GMM(高斯混合模型)实现证件照背景替换与抠图
  • Taotoken模型广场首发更新带来的技术尝鲜体验
  • 2026年5月28日博客精选
  • Windows字体渲染优化实用指南:如何用MacType告别模糊文字
  • 如何快速实现动态数字动画效果:3个核心技巧指南
  • 高效智能浏览器资源嗅探工具:5步实现网页内容捕获与智能媒体提取
  • ArcGIS工具箱里这个‘栅格转点’工具,原来还能这么玩?手把手教你提取高光谱图像的光谱曲线
  • PYTHON+AI LLM DAY FIFITY-EIGHT
  • LLM预测调度技术:Block框架如何优化GPU资源利用率
  • 真空码垛吸盘厂家哪家好?2026年实战选购指南,普纳思第一名实至名归 - 玖叁鹿
  • 三步免费解锁Wand专业版:开启游戏修改新体验的终极指南
  • Ellisys抓包器进阶玩法:利用用户手册和Tips,挖掘蓝牙Wi-Fi协议分析的隐藏功能
  • 热管理进阶:散热器多参数协同仿真,从“单点试错”到“全局寻优”
  • 从消息传递到AMP:用Python一步步复现压缩感知的经典算法(附代码)
  • 全面解析开源项目:高效实现Switch游戏画面跨平台传输的完整指南
  • 别再卡在登录界面了!手把手教你搞定思科Netacad账号注册(含地区选择避坑指南)
  • 你的Mac菜单栏太乱了?5分钟学会用Ice打造清爽高效的工作空间
  • 2026 年成都空气能热水器与燃气锅炉厂家口碑推荐榜:商用热水采暖设备、锅炉维修销售、节能设备定制选择指南,产能、技术、服务三维度权威解析 - 海棠依旧大
  • 3分钟彻底优化Windows系统:免费工具让你的电脑运行如飞
  • 学信网账号安全指南:如何利用邮箱和第三方登录,绕过原手机号完成信息更新
  • 5步掌握SysML v2:从零开始系统建模的完整指南
  • DevOps实践指南:从理念到落地
  • 想让Windows拥有macOS般优雅的鼠标指针?这个免费工具包帮你轻松实现
  • 电信客服工单情绪分析和自动升级如何落地?生产级实战方案详解
  • 医药代表拜访计划能否通过AI自动生成优化?2026Agent自动化实战解析