Pose Estimation 相关操作-HeatMap生成

本文深入探讨了三种不同的HeatMap生成方法,包括使用numpy和OpenCV库的基本方法,CPM中相似的实现方式,以及在SimpleBaseLine上采用的高效算法,特别关注于3sigma区域的高斯分布应用,加速计算的同时确保精度。

1、HeatMap的生成相关代码

(1)

import numpy as np
import cv2
input_size=(96,96)
center=(10,10)
stride=1
start=stride/2-0.5#用来控制center的位置,默认stride为1
xx=np.arange(1,input_size[0])
yy=np.arange(1,input_size[1])
xx,yy=np.meshgrid(xx,yy)
xx=xx*stride+start
yy = yy * stride + start
D=(xx-center[0])**2+(yy-center[1])**2
exponent=D/2/sigma/sigma
heatmap=np.exp(-exponent)
heatmap*=255
type(heatmap)
heatmap=heatmap.astype(np.uint8)
heatmap=cv2.applyColorMap(heatmap, cv2.COLORMAP_HOT)
cv2.imwrite('./4.jpg',heatmap)

(2)CPM类似用法

import numpy as np
import cv2
input_size=(96,96)
center=(10,10)
sigma=3
gaussmap_result=np.zeros(shape=input_size,dtype=np.float32)
for i in range(input_size[1]):
    for j in range(input_size[0]):
        D=(i-center[1])**2+(j-center[0])**2
        exponent=D/2/sigma/sigma
        gaussmap_result[i,j]=np.exp(-exponent)
gaussmap_result*=255
gaussmap_result=gaussmap_result.astype(np.uint8)
heatmap=cv2.applyColorMap(heatmap, cv2.COLORMAP_HOT)
cv2.imwrite('./5.jpg',heatmap)

(3)mxnet在Simple BaseLine上面生成HeatMap与其他两种均不同,其只对3倍的Sigma的区域进行高斯分布(为什么是3sigma,我理解的是高斯分布数值%99.8的概率会落在-3sigma-3sigma区域),加快了计算速度。

import numpy as np
sigma=2
target = np.zeros((96,96),dtype=np.float32)
tmp_size = sigma * 3
mu=(10,10)
ul = [int(mu[0] - tmp_size), int(mu[1] - tmp_size)]
br = [int(mu[0] + tmp_size + 1), int(mu[1] + tmp_size + 1)]
size = 2 * tmp_size + 1
x = np.arange(0, size, 1, np.float32)
y = x[:, np.newaxis]
x0 = y0 = size // 2
g = np.exp(-((x - x0) ** 2 + (y - y0) ** 2) / (2 * (sigma ** 2)))
g.shape
# usable gaussian range
g_x = max(0, -ul[0]), min(br[0], 96) - ul[0]
g_y = max(0, -ul[1]), min(br[1], 96) - ul[1]
# image range
img_x = max(0, ul[0]), min(br[0], 96)
img_y = max(0, ul[1]), min(br[1], 96)
target[img_y[0]:img_y[1], img_x[0]:img_x[1]] = g[g_y[0]:g_y[1], g_x[0]:g_x[1]]
target*=255
type(heatmap)
heatmap=target.astype(np.uint8)
heatmap=cv2.applyColorMap(heatmap, cv2.COLORMAP_HOT)
cv2.imwrite('./3.jpg',heatmap)

 

PCDPose 是一种专注于轻量级2D人体姿态估计的模型,其设计目标是在资源受限的设备上实现高效且准确的姿态估计。该技术在近年来的研究中展现出卓越的性能,尤其是在结合注意力机制和上下文信息传播方面[^1]。 ### PCDPose 的核心组件 #### 1. **Pose-Enhancing Attention** PCDPose 引入了“pose-enhancing attention”机制,旨在通过增强关键点之间的空间关系来提升姿态估计的准确性。这种注意力机制能够动态地调整不同关节之间的依赖关系,从而更好地捕捉人体结构的复杂性。具体来说,它通过计算每个关节与其他关节之间的相关性权重,对特征图进行加权处理,使得模型更关注于与当前关节相关的区域[^1]。 #### 2. **Context Broadcasting** 为了进一步提升模型的表现,PCDPose 还采用了“context broadcasting”策略。这一策略的核心思想是将全局上下文信息广播到局部特征表示中。通过对高层特征进行全局平均池化并将其作为额外输入注入到低层特征中,模型能够在保持高分辨率的同时获得更强的语义表达能力[^1]。 ### 在轻量级2D人体姿态估计中的应用 PCDPose 被广泛应用于需要实时处理的场景,如移动设备上的动作识别、虚拟现实交互等。由于其轻量化的设计,PCDPose 可以在不牺牲精度的前提下显著减少计算资源的消耗。这使其成为嵌入式系统和边缘计算平台的理想选择[^1]。 此外,PCDPose 还支持与其他先进技术的集成,例如 CLIP(Contrastive Language–Image Pre-training)模型。CLIP 提供了一种跨模态的理解方式,能够将文本描述与图像内容相结合。通过引入 CLIP 指导的持续新类别发现(CLIP-guided continual novel class discovery),PCDPose 可以在面对未见过的动作或姿势时,利用语言描述来辅助模型推理,从而提高泛化能力和适应性[^1]。 ### 示例代码 以下是一个简化的 PCDPose 模型架构示例,展示了如何构建一个基于 PyTorch 的轻量级姿态估计网络: ```python import torch import torch.nn as nn class PoseEnhancingAttention(nn.Module): def __init__(self, in_channels): super(PoseEnhancingAttention, self).__init__() self.query = nn.Conv2d(in_channels, in_channels // 8, kernel_size=1) self.key = nn.Conv2d(in_channels, in_channels // 8, kernel_size=1) self.value = nn.Conv2d(in_channels, in_channels, kernel_size=1) self.gamma = nn.Parameter(torch.zeros(1)) def forward(self, x): batch_size, C, H, W = x.size() query = self.query(x).view(batch_size, -1, H*W).permute(0, 2, 1) key = self.key(x).view(batch_size, -1, H*W) energy = torch.bmm(query, key) attention = torch.softmax(energy, dim=-1) value = self.value(x).view(batch_size, -1, H*W) out = torch.bmm(value, attention.permute(0, 2, 1)) out = out.view(batch_size, C, H, W) return self.gamma * out + x class PCDPose(nn.Module): def __init__(self, num_joints=17): super(PCDPose, self).__init__() self.backbone = torch.hub.load('pytorch/vision:v0.10.0', 'resnet18', pretrained=True) self.feature_extractor = nn.Sequential(*list(self.backbone.children())[:-2]) self.attention = PoseEnhancingAttention(512) self.head = nn.Conv2d(512, num_joints, kernel_size=1) def forward(self, x): x = self.feature_extractor(x) x = self.attention(x) heatmap = self.head(x) return heatmap ``` 上述代码定义了一个简单的 PCDPose 模型,其中包含了特征提取器、注意力模块和热力图生成头。该模型可以用于训练和预测任务,适用于多种姿态估计应用场景。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值