高斯热图的生成
高斯热图通常用于目标检测和姿态估计等计算机视觉任务中,用于表示目标的位置和置信度分布。
下面是 代码片
展示。
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: 返回更新后的累积置信度图。