openpose中生成高斯热图的函数详解

本文讲解了在目标检测和姿态估计中使用高斯热图的方法,涉及numpy函数和高斯核的计算,以及置信度图的累积过程。
摘要由CSDN通过智能技术生成

高斯热图的生成

高斯热图通常用于目标检测和姿态估计等计算机视觉任务中,用于表示目标的位置和置信度分布。
下面是 代码片展示。

def putGaussianMaps(center, accumulate_confid_map, sigma, grid_y, grid_x, stride):

    start = stride / 2.0 - 0.5
    y_range = [i for i in range(int(grid_y))]
    x_range = [i for i in range(int(grid_x))]
    xx, yy = np.meshgrid(x_range, y_range)
    xx = xx * stride + start
    yy = yy * stride + start
    d2 = (xx - center[0]) ** 2 + (yy - center[1]) ** 2
    exponent = d2 / 2.0 / sigma / sigma
    mask = exponent <= 4.6052
    cofid_map = np.exp(-exponent)
    cofid_map = np.multiply(mask, cofid_map)
    accumulate_confid_map += cofid_map # 多个点会叠加的
    accumulate_confid_map[accumulate_confid_map > 1.0] = 1.0
    
    return accumulate_confid_map

逐行注释
def putGaussianMaps(center, accumulate_confid_map, sigma, grid_y, grid_x, stride):: 这是一个函数定义,接受目标中心点坐标、累积置信度图、高斯核的标准差、网格行数、网格列数和步长作为输入参数。
start = stride / 2.0 - 0.5: 计算起始位置,即每个网格的中心坐标。


关于网格中心点求解中-0.5的理解

起初以为是为了避免计算结果出现小数,但是又想到要是这样为什么不能+0.5。然后发现可能是:在右边界和上边界计算出的网格编号会溢出,减去0.5相当于把整张网格向左下方平移了0.5个单位(理解还有一些疑惑,希望大佬批评指正)。
y_range = [i for i in range(int(grid_y))] 和 x_range = [i for i in range(int(grid_x))]: 创建了表示网格行和列索引的列表。
xx, yy = np.meshgrid(x_range, y_range): 使用 meshgrid 函数创建了网格坐标矩阵,其中 xx 表示列坐标,yy 表示行坐标。


关于meshgrid函数

用代码去解释会好理解一些:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
m, n = (5, 3)
x = np.linspace(0, 1, m)
y = np.linspace(0, 1, n)
X, Y = np.meshgrid(x,y)

然后x和y分别是:

x
out:
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ])
y
out:
array([ 0. ,  0.5,  1. ])

X和Y分别是:

X
out:
array([[ 0.  ,  0.25,  0.5 ,  0.75,  1.  ],
       [ 0.  ,  0.25,  0.5 ,  0.75,  1.  ],
       [ 0.  ,  0.25,  0.5 ,  0.75,  1.  ]])
Y
out:
array([[ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0.5,  0.5,  0.5,  0.5,  0.5],
       [ 1. ,  1. ,  1. ,  1. ,  1. ]])

图片理解为:


xx = xx * stride + start 和 yy = yy * stride + start: 将网格坐标转换为实际图像坐标。
d2 = (xx - center[0]) ** 2 + (yy - center[1]) ** 2: 计算每个网格中心点到目标中心点的距离的平方。
exponent = d2 / 2.0 / sigma / sigma: 计算高斯核的指数部分。
mask = exponent <= 4.6052: 创建了一个掩码,用于限制高斯核的范围。
cofid_map = np.exp(-exponent): 计算高斯核的值,即高斯热图。
cofid_map = np.multiply(mask, cofid_map): 将高斯核限制在掩码范围内。


高斯核

高斯核是一个函数,用于表示一组相邻点与中心点之间的距离,为较近的点分配较高的权重。该函数与高斯分布密切相关,因为最终构成矩阵的点是根据高斯分布计算的。高斯核将高斯分布获得的数据点转换成更高维的空间,得到的矩阵类似于通过高斯分布得到的钟形曲线,假设曲线的峰值时分配了最高权重的点。
应用:
处理图像:图像的平滑或模糊。它们通常用于减少图像中存在的噪点并去除颗粒状外观,使图像更平滑。这是通过将每个像素的强度替换为其相邻像素的强度来完成的。
SVM:主要用于分类和回归任务。主要目标是将高维空间分类为不同的类别。高斯核可以在这些类之间创建这些决策边界,从而最终创建超平面。
公式:

sigma表示分布的标准差,用于确定矩阵的分散度或光滑度。总结果介于0-1,值越大代表距离越小,即权重越大。


accumulate_confid_map += cofid_map: 将当前计算得到的高斯热图叠加到累积置信度图上。
accumulate_confid_map[accumulate_confid_map > 1.0] = 1.0: 对累积置信度图进行截断,确保置信度不会超过1。
return accumulate_confid_map: 返回更新后的累积置信度图。

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值