姿态识别中的loss计算方法总结

本文探讨了StackHourglass使用h5格式的热力图标注方法,与HRNet基于json格式的annotation进行训练和测试的差异。重点介绍了两者在数据解析、loss计算及目标生成方面的技术细节。同时,HRNet与PRTR(结合transformer的模型)在处理方法上的特色也做了对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 stack_hourglass

stackhourglass是采用的annotation为h5格式文件,所以在数据读取,判断过程与json格式的文件会有所不同,并且是heatmap比较的方法。

1.1 train

利用h5py.File文件解析功能,解析h5文件,并将结果分别存放于center、scale、part、visible、normalize列表中。

根据output_res和关键点个数利用GenerateHeatmap函数求得heatmaps(8,16,64,64)。计算每个样本nstack个的预测值得到combined_hm_preds(8,8,16,64,64)。其中第一个8是nstack值,第二个为batchsize。估计将每个nstack的loss后得到combined_loss(8,8)。通过torch.mean计算combined_loss所有元素的平均值得到所有nstack的loss总值,并记录。最后loss.backward反向传播,更新模型。

1.2 test

在计算test的loss时是直接采用的:

error = np.linalg.norm(p[0]['keypoints'][j, :2]-g[0, j, :2]) / normalize

然后通过error和bound(阈值,一般为0.5)比较大小,得到满足要求的结果个数。

2 HRNet

HRNet是采用的annotation为json格式文件,并且是heatmap比较的方法。

利用json.load(anno_file)函数读取json文件,存储在anno列表中。anno元素个数为22246,即所有图片数量。通过转换将数据分为image、center、scale、joints_3d、joints_3d_vis、filename和imgnum存入到列表gt_db中。

通过仿射变换将db中的数据存储到joints和joints_vis数组中。将joints, joints_vis数组通过generate_target函数生成heatmap并保存到target, target_weight中。

train和test计算loss方法相同,具体如下所示:

outputs、target:16,16,64,64。target_weight:16,16,1。

将outputs按照16个关节点分为heatmaps_pred列表,每个元素为(16,1,4096)。target同理变换为heatmaps_gt列表。如果用到target_weight,则将两列表与target_weight相乘,然后进行下一步的对比。对比采用的nn.MSELoss(reduction='mean')方法。

3 PRTR

PRTR结合了transformer,所以它的outputs、target经过特殊复杂的处理,对提高识别的准确性有所帮助。

### OpenPose人体姿态识别监督学习实现方法 OpenPose是一个基于卷积神经网络(CNN)的人体姿态估计框架,该框架利用监督学习来训练模型以识别人体的关键点并构建完整的身体骨架图[^1]。 #### 数据集准备 为了训练OpenPose模型,需要大量的标注数据作为输入。这些数据通常由图像及其对应的人体关键点坐标组成。常用的公开数据集包括COCO, MPII Human Pose等。每个样本都应包含多个人物的姿态信息以及相应的标签用于监督学习过程。 #### 模型架构设计 OpenPose采用了自底向上的策略来进行多人姿态预测。具体来说,先通过CNN提取所有潜在的关节位置(即热力图),再计算相邻关节间的关联分数(PAFs, Part Affinity Fields)[^2]。此方式能够有效减少拥挤场景下的误连情况,并提高了对于复杂姿势的理解能力。 #### 训练流程概述 - **初始化**: 加载预处理后的图片批次(batch of images), 并将其传递给定义好的网络结构. - **前向传播(forward pass)**: 输入经过一系列卷积层、池化操作后得到特征映射(feature maps). - **损失函数(loss function)**: 使用均方误差(MSE)或其他适合回归任务的目标函数衡量预测值与真实值之间的差异. - **反向传播(backpropagation)** 和参数更新(parameter update): 根据计算所得梯度调整权重使得下次迭代时能更好地拟合目标. ```python import torch from openpose import get_pose_net # 假设这是获取已配置好OpenPose模型的方法 device = 'cuda' if torch.cuda.is_available() else 'cpu' model = get_pose_net().to(device) criterion = torch.nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) for epoch in range(num_epochs): for batch_idx, (images, targets) in enumerate(train_loader): optimizer.zero_grad() outputs = model(images.to(device)) loss = criterion(outputs, targets.to(device)) loss.backward() optimizer.step() ``` 上述代码片段展示了如何设置PyTorch环境下来完成一次简单的OpenPose训练循环。实际应用中还需要考虑更多细节如学习率调度器(Learning Rate Scheduler)的选择、正则化技术的应用等。 #### 测试与验证 一旦完成了足够的轮次(epoch)训练之后就可以开始测试阶段了,在这一过程中会用到之前从未见过的新颖样本来评估性能指标比如平均精度(AP@[.5:.95])等。此外还可以借助可视化工具直观感受模型的效果好坏以便进一步调优超参或改进算法逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值