MMPose实战:5分钟搞定HRNet姿态估计模型训练(附完整代码)
MMPose实战5分钟搞定HRNet姿态估计模型训练附完整代码1. 环境准备与快速安装HRNet作为当前姿态估计领域的标杆模型在MMPose框架中的实现已经相当成熟。对于刚接触计算机视觉的开发者来说最头疼的往往是环境配置问题。下面我们用一个最小化方案快速搭建可运行环境conda create -n mmpose python3.8 -y conda activate mmpose pip install torch1.12.1cu113 torchvision0.13.1cu113 --extra-index-url https://download.pytorch.org/whl/cu113 pip install mmcv-full1.7.1 -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.12/index.html pip install mmpose0.29.0注意如果使用CUDA 11.6环境需要将上述命令中的cu113替换为cu116。实测在RTX 3090显卡上完整训练流程内存占用约8GB。验证安装是否成功import mmpose print(mmpose.__version__) # 应输出0.29.0常见安装问题解决方案报错提示CUDA版本不匹配检查nvcc --version与安装命令是否一致MMCV安装失败确保pip版本大于20.3建议先运行pip install --upgrade pip权限问题在Linux系统下添加--user参数2. 极简数据准备方案传统姿态估计项目需要复杂的数据标注但MMPose提供了开箱即用的解决方案。我们以COCO数据集为例展示最小化数据准备流程# 下载预处理好的微型数据集约50MB wget https://download.openmmlab.com/mmpose/datasets/coco_mini.tar.gz tar -xzf coco_mini.tar.gz数据集目录结构应如下coco_mini/ ├── annotations │ ├── person_keypoints_train2017.json │ └── person_keypoints_val2017.json └── images ├── train2017 └── val2017对于自定义数据集MMPose支持两种快速适配方案方案ACOCO格式转换from mmpose.datasets import BaseCocoStyleDataset class YourDataset(BaseCocoStyleDataset): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _load_annotations(self): # 实现你的标注加载逻辑 return annotations方案B简易CSV格式image_path,x1,y1,v1,x2,y2,v2... img001.jpg,125,340,2,156,320,2,...提示关键点可见性标记v建议采用COCO标准0-未标注1-标注但不可见2-标注且可见3. 模型配置与训练技巧HRNet在MMPose中有多个预置配置我们选择性能与速度平衡的hrnet_w32# configs/body_2d_keypoint/topdown_heatmap/coco/hrnet_w32_coco_256x192.py model dict( typeTopdownPoseEstimator, backbonedict( typeHRNet, in_channels3, extradict( stage1dict(...), stage2dict(...), stage3dict(...), stage4dict(...))), headdict( typeHeatmapHead, in_channels32, out_channels17, # COCO关键点数 lossdict(typeKeypointMSELoss, use_target_weightTrue)), train_cfgdict(), test_cfgdict( flip_testTrue, # 启用测试时增强 shift_heatmapTrue))启动训练的命令行python tools/train.py configs/body_2d_keypoint/topdown_heatmap/coco/hrnet_w32_coco_256x192.py \ --work-dir work_dirs/hrnet_w32 \ --gpus 1 \ --seed 42加速训练的三个技巧启用混合精度训练在配置中添加fp16dict(loss_scale512.)使用更大的batch size修改data.samples_per_gpu并相应调整学习率采用缓存机制设置data.val_dataloaderdict(use_cacheTrue)4. 模型推理与可视化训练完成后使用以下代码进行实时预测from mmpose.apis import inference_topdown, init_model from mmpose.utils import visualize config_file configs/body_2d_keypoint/topdown_heatmap/coco/hrnet_w32_coco_256x192.py checkpoint_file work_dirs/hrnet_w32/latest.pth model init_model(config_file, checkpoint_file, devicecuda:0) # 单张图片推理 results inference_topdown(model, demo.jpg) visualize( model, demo.jpg, results, showTrue, out_fileresult.jpg)性能优化技巧# 启用半精度推理 model.cfg.model.test_cfg.flip_test False # 关闭TTA提升速度 with torch.no_grad(): with torch.cuda.amp.autocast(): results inference_topdown(model, input_frame)对于视频流处理建议使用异步流水线from mmpose.apis import process_one_image async def process_frame(frame): return await process_one_image(model, frame) # 在视频循环中调用 results await process_frame(frame)5. 模型部署实战将训练好的模型转换为ONNX格式python tools/deployment/pytorch2onnx.py \ configs/body_2d_keypoint/topdown_heatmap/coco/hrnet_w32_coco_256x192.py \ work_dirs/hrnet_w32/latest.pth \ --output-file hrnet_w32.onnx \ --shape 1 3 256 192TensorRT加速部署import tensorrt as trt # 创建logger logger trt.Logger(trt.Logger.WARNING) builder trt.Builder(logger) network builder.create_network(1 int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) parser trt.OnnxParser(network, logger) # 解析ONNX模型 with open(hrnet_w32.onnx, rb) as f: parser.parse(f.read()) # 构建引擎 config builder.create_builder_config() config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 1 30) # 1GB engine builder.build_engine(network, config)边缘设备优化建议使用hrnet_w18替代hrnet_w32减少计算量将输入分辨率从256x192降至128x96采用INT8量化需校准数据集6. 进阶调优策略当基础模型精度不足时可以尝试以下改进方案数据增强组合train_pipeline [ dict(typeLoadImage), dict(typeTopdownRandomFlip, flip_prob0.5), dict(typeRandomBBoxTransform), dict(typeTopdownAffine), dict(typePhotometricDistortion, # 光度失真 brightness_range(0.8, 1.2), contrast_range(0.8, 1.2)), dict(typeGenerateTarget, encodercodec), dict(typePackPoseInputs) ]模型结构改进# 在HRNet后添加注意力机制 neckdict( typeSelfAttentionBlock, in_channels32, spatial_size(64, 48)), headdict( typeMultiScaleHeatmapHead, # 多尺度预测头 scales[1, 0.5, 0.25])损失函数组合lossdict( typeCombinedLoss, losses[ dict(typeKeypointMSELoss, weight0.5), dict(typeKeypointOHKMMSELoss, weight0.5)], loss_weight1.0)实际项目中在COCO val2017数据集上经过调优的HRNet-W32可以达到75.3 AP推理速度在RTX 3090上达到45 FPS输入尺寸256x192。