【研二下 | 知识学习 | Ing】

热图

Gaussian heatmap是将一个高斯分布函数应用于每个关键点的位置,生成以该关键点为中心的高斯热力图,以此表示关键点的位置。具体来说,以关键点为中心的高斯分布函数将在该点处取得最大值,随着距离中心点的增加而逐渐减小。这种方法将关键点的位置表示为一个连续的、光滑的函数,适用于像素级别的关键点检测任务。在关键点检测任务中,我们通常需要生成高斯热图(Gaussian heatmap),用于表示每个关键点的位置概率分布。高斯热图是一种平滑的概率分布,其具有连续性和平滑性,可以更好地表示关键点的位置信息。

生成高斯热图时,通常采用的方法是在关键点位置处生成一个以该点为中心、标准差为 $\sigma$ 的二维高斯分布,然后将这个高斯分布叠加到图像中对应的位置上,最终得到高斯热图。在生成高斯热图时,通常会选择一个合适的高斯核大小 $k$,然后将其应用于高斯分布上,生成一个大小为 $k \times k$ 的高斯核 $G$。接下来,我们将这个高斯核 $G$ 和原始的热图 $H$ 做卷积运算,得到一个平滑的热图 $H'$。这个卷积过程可以用常规的卷积操作来实现,例如使用 PyTorch 的 conv2d 函数。在实现时,我们需要注意高斯核的生成和归一化,以及卷积时的边界处理等问题。

||

为了生成高质量的高斯热图,我们通常需要对热图进行卷积平滑操作。这是因为,原始的高斯热图往往存在一些噪声和不连续性,这些问题可能会对关键点检测的准确性造成一定的影响。通过对高斯热图进行卷积平滑操作,我们可以去除这些噪声,使得高斯热图更加平滑和连续,从而提高关键点检测的准确性。Gaussian-smoothed heatmap则是将原始图像进行卷积平滑后,再应用高斯分布函数生成热力图。与Gaussian heatmap不同的是,Gaussian-smoothed heatmap在生成热力图时考虑了图像中相邻像素的相似性,这可以使得热力图更具有空间连续性,适用于像素级别以上的关键点检测任务。        另外,由于高斯热图是通过对关键点位置进行高斯分布建模得到的,因此在实现时通常需要通过卷积操作来生成高斯核,然后再将其应用于图像的每个像素点上,得到对应的高斯热图。在这个过程中,卷积平滑操作就是生成高斯核的一部分,它可以帮助我们生成一个平滑的高斯核,从而得到高质量的高斯热图。

||

卷积平滑(Convolutional Smoothing)是一种常用的图像处理方法,其主要思想是通过对图像进行滤波操作,去除图像中的噪声和细节,使得图像变得更加平滑、连续。具体来说,卷积平滑是通过对图像中每个像素周围的邻域进行加权平均操作,得到该像素的平滑值。加权平均的权重通常采用卷积核(Convolutional Kernel)中的值,卷积核是一个二维矩阵,其中心点的值最大,其它点的值随着距离中心点的增加而逐渐减小。卷积平滑操作可以通过卷积核和图像的卷积操作来实现。卷积平滑可以有效地降低图像中的噪声和细节,使得图像更加平滑,这对于某些图像处理任务非常有用,例如在关键点检测任务中,通过对原始图像进行卷积平滑操作,可以得到更加清晰、连续的特征表示,有助于提高关键点检测的准确性。

平滑可以去噪的原因:在图像处理和计算机视觉中,平滑操作可以对图像进行降噪处理。这是因为平滑操作可以去除图像中的高频噪声,保留图像中的低频信息。在图像中,高频信号通常表示图像中的细节和噪声,低频信号通常表示图像的整体特征。通过平滑操作,我们可以去除图像中的高频噪声,保留图像中的低频信息,从而减少图像中的噪声,并突出图像中的特征。

在平滑操作中,我们通常使用平滑核来对图像进行卷积操作。平滑核可以使像素值在一定范围内进行平滑,从而减少图像中的噪声和细节,并突出图像中的特征。常用的平滑核包括均值核和高斯核等。其中,高斯核由于其具有良好的平滑效果和可调节的参数,通常被广泛使用。

需要注意的是,平滑操作不仅可以减少图像中的噪声,也会使图像变得模糊。因此,在实际应用中,需要根据具体情况进行权衡,选择适当的平滑核大小和参数,以获得较好的平衡效果。

从预测的热图中提取出2D关键点坐标。在文献[2]的基础上,作者使用可微分的local soft-argmax方法来减少由于热图量化误差带来的误差。具体而言,对于每个关键点,作者首先使用softmax函数将其热图转换为概率分布。然后,他们将网格坐标和相应的概率值视为2D图像中的像素,并使用双线性插值来估计局部最大值的位置。最终,这些位置被解码为预测的2D关键点坐标。这种方法比传统的argmax方法更加平滑,能够减少离散化带来的误差。

||

argmax是一个数学函数,用于求取一个函数在某个定义域内取得最大值的自变量。具体来说,在一个数列或向量中,argmax函数会返回数值最大的元素的索引。例如,argmax([3, 5, 1, 7])会返回3,因为7在该数列中的索引为3。

softmax函数也是一个数学函数,用于将一个K维向量(K为任意正整数)压缩到另一个K维向量中,使得该向量的每个元素都在0到1之间,并且所有元素的和为1。softmax函数在深度学习中经常用于将模型的输出转换为概率分布,以便进行分类任务的训练和预测。

argmax函数通常用于获取数列或向量中的最大值的位置信息,而softmax函数则常用于将向量转换为概率分布。在某些情况下,softmax函数的输出也可以通过argmax函数获得最终的分类结果。

||

当我们得到一个热图(heatmap)时,需要将其转换成对应的坐标点(keypoint),这个过程可以使用argmax函数来实现,即在热图中找到值最大的位置作为坐标点。

但是,这种方法存在一个问题,即由于像素坐标是离散的,argmax得到的坐标可能会存在误差。为了解决这个问题,可以使用soft-argmax函数,将离散的像素坐标转换成连续的坐标值。soft-argmax函数可以通过对每个像素的坐标值乘以对应像素的概率值,然后对所有像素的加权坐标进行求和得到。这种方法可以减少离散化带来的误差。

Local soft-argmax则是在soft-argmax的基础上进行的改进。Local soft-argmax可以将像素坐标限制在一个局部区域内,避免坐标点过于敏感,进一步减小误差。这种方法通常需要设置一个卷积核大小和步长,以决定局部区域的范围。Local soft-argmax是一种用于从高斯热图中提取坐标信息的方法。在该方法中,每个特征点被表示为高斯分布在热图上的峰值,因此每个点的坐标可以被视为峰值的位置。传统的argmax操作会导致量化误差,因为它只返回最大值的位置,而忽略了峰值周围的细微变化。

为了解决这个问题,Local soft-argmax使用了一种可微的方式,对热图进行插值,从而得到更精确的坐标。具体来说,它将每个峰值看作一个局部坐标系的中心,并对每个峰值周围的像素进行双线性插值,以得到峰值的子像素级别的坐标。因此,该方法可以有效地减少量化误差,提高坐标预测的精度。

||

热图量化误差:在热图中,每个像素代表了一个关键点的可能性分布。因此,在将热图转换为关键点坐标时,需要找到最可能的位置,即找到热图中的最大值像素。这个过程被称为量化,因为最大值像素只能表示为离散的像素坐标。如果像素的分辨率较低,就会导致量化误差,即预测的关键点位置可能会偏离其真实位置,这会导致模型的性能下降。因此,采用可微分的local soft-argmax方法可以减少这种量。

离散化像素坐标:像素坐标指的是图片中每个像素的坐标,它们是以整数值表示的,而不是连续的实数值。例如,一张1000x1000的图像中,每个像素的坐标都是以整数表示的,范围为(0,0)到(999,999。这里的离散指的是像素坐标是有限、离散的,而不是连续的实数值。因此,对于连续函数的离散化处理,像素坐标就是一种典型的离散化表现形式。

离散化是因为计算机处理的数据是以离散的形式呈现的,包括像素坐标、像素值等都是以离散的形式存在的。因此,在进行计算机视觉任务时,需要将连续的数据转化为离散的数据。例如,在人体姿态估计中,需要将关键点坐标从连续的值转化为离散的高斯热图。离散化不仅符合计算机处理数据的方式,还能够有效地减少计算量和存储空间,使得计算机能够更快速地进行计算和处理。

||

sargmax(Scaled Argmax)是一种对argmax的改进,可以应用于计算机视觉中的各种任务,如语义分割、人体姿态估计等。在argmax中,我们通常会得到一个离散的点,而在sargmax中,我们得到的是该离散点周围区域的加权平均值。这个加权平均值的权重是由离散点与其周围像素的距离决定的。

soft-argmax是sargmax的一种变体,它通过将离散的argmax操作替换为一个可微的softmax操作,从而避免了对空间变换的离散采样。相对于sargmax,soft-argmax对于近似连续函数的反应更加平滑,更加连续。

Local soft-argmax是一种针对语义分割任务提出的改进。在传统的soft-argmax中,所有像素都被平等地加权,而在local soft-argmax中,只有离某个特定像素近的像素会被加权。这种加权方式可以提高模型对于图像局部细节的感知能力。

sargmax_coord 属性是预测热力图上每个关键点的坐标,它是根据预测热力图得到的,表示每个关键点在图像中的位置。在该代码段中,这个属性被复制到 manual_pred 中,这样在手动标记时就可以根据该属性确定标记的位置。

the non-normalized Gaussian kernel

参数σ is used to control the propagation of the peak

Heatmap关键点检测算法_CSDN博客阅读笔记

一般来说,我们可以把姿态估计任务分成两个流派:Heatmap-based和Regression-based。

其主要区别在于监督信息的不同,Heatmap-based方法监督模型学习的是高斯概率分布图,即把GroundTruth中每个点渲染成一张高斯热图,最后网络输出为K张特征图对应K个关键点,然后通过argmax或soft-argmax来获取最大值点作为估计结果。这种方法由于需要渲染高斯热图,且由于热图中的最值点直接对应了结果,不可避免地需要维持一个相对高分辨率的热图(常见的是64x64,再小的话误差下界过大会造成严重的精度损失),因此也就自然而然导致了很大的计算量和内存开销。

Regression-based方法则非常简单粗暴,直接监督模型学习坐标值,计算坐标值的L1或L2 loss。由于不需要渲染高斯热图,也不需要维持高分辨率,网络输出的特征图可以很小(比如14x14甚至7x7),拿Resnet-50来举例的话,FLOPs是Heatmap-based方法的两万分之一,这对于计算力较弱的设备(比如手机)是相当友好的,在实际的项目中,也更多地是采用这种方法。

说到Regression-based方法的优点,那是就是好呀就是好,可以简单总结为以下三点:

1、没有高分辨率热图,无负一身轻。计算成本和内存开销一起大幅降低。
2、输出为连续的,不用担心量化误差。(Heatmap-based输出的热图最大值点在哪,对应到原图的点也就确定了,输出热图的分辨率越小,这个点放大后对应回去就越不准。Regression-based输出为一个数值,小数点后可以有很多位,精度不受缩放影响)
3、可拓展性高。不论是one-stage还是two-stage,image-based还是video-based,2D还是3D,Regression-based方法都可以一把梭。此前就有用这种方法来将2D和3D数据放在一起联合训练的文章。这是Heatmap-based方法做不到的,因为输出是高度定制化的,2D输出必须渲染2D高斯热图,3D就必须渲染3D的高斯热图,计算量和内存开销也蹭蹭蹭地暴涨。

Heatmap-based方法通过显式地渲染高斯热图,让模型学习输出的目标分布,也可以看成模型单纯地在学习一种滤波方式,将输入图片滤波成为最终希望得到的高斯热图即可,这极大地简化了模型的学习难度,且非常契合卷积网络的特性(卷积本身就可以看成一种滤波),并且这种方式规定了学习的分布,相对于除了结果以外内部一切都是黑盒的Regression-based方法,对于各种情况(遮挡、动态模糊、截断等)要鲁棒得多。

基于以上种种优点,Heatmap-based方法在姿态估计领域是处于主导地位的,SOTA方案也都是基于此,这也导致了一种学术研究与算法落地的割裂,你在各种数据集和比赛里指标刷得飞起,但项目落地时我们工程师却只能干着急,因为你用的方法又慢又吃内存,真实项目里根本没法用啊。
-------------------------------------------------------分割线-------------------------------------------------------

(2) 采用预测高斯热图方式,然后argmax找出峰值对应的索引即为坐标点,例如cornernet、grid-rcnn和cpn等等。以单人姿态估计为例,输出是一张仅仅包含一个人的图片,输入是所有关键点的高斯热图,label是基于每个关键点生成的高斯图。如果每个人要回归17个关键点,那么预测输出特征图是(batch,h_o,w_o,17),即每个通道都是预测一个关节点的热图,然后对每个通道进行argmax即可得到整数型坐标。
基于高斯热图输出的方式会比直接回归坐标点精度更高,原因并不是高斯热图输出方式的表达好,而是由于其输出特征图较大,空间泛化能力较强导致的,那么自然能解释如果我依然采用(1)直接回归坐标的方法预测,但是我不再采用全连接,而是全卷积的方式依然会出现精度低于高斯热图的现象,原因是即使全卷积输出,但是像yolo-v2、ssd等其输出特征图很小,导致空间泛化能力不如方法(2)单从数值上来看,肯定是直接回归坐标点方式好啊,因为直接回归坐标点的话,输出是浮点数,不会丢失精度,而高斯热输出肯定是整数,这就涉及到一个理论误差下界问题了。假设输入图片是512x512,输出是缩小4倍即128x128,那么假设一个关键点位置是507x507,那么缩小4倍后,即使没有任何误差的高斯热图还原,也会存在最大507-126*4=3个像素误差,这个3就是理论误差下界。如果缩小倍数加大,那么理论误差下界还会上升。所以目前大部分做法折中考虑速度和精度,采用缩小4倍的方式。

该类做法优点是精度通常高于全连接层直接回归坐标点方法;缺点也很明显,从输入到坐标点输出不是一个全微分的模型,因为从heatmap到坐标点,是通过argmax方式离线得到的(其实既然argmax不可导,那就用soft argmax代替嘛,有论文确实是这么做的)。并且由于其要求的输出特征图很大,训练和前向速度很慢,且内存消耗大。

在heatmap产生坐标的过程中,缺点:(1)使用的argmax之类的处理过程,是不可微分的,不能进行直接学习;(2)heatmap到坐标的过程中,存在着量化误差。heatmap与输入分辨率的下采样倍数越大,量化误差越大。更值得注意的是,监督是建立于heatmap 上的,这将导致损失函数与我们的度量(坐标上)之间相隔开来了。在推理时,我们只使用其中的某个(某几个)像素进行数值坐标计算,但在训练时,对所有像素都会造成损失。

总结一下,虽然高斯热图预测的精度通常高于回归的方法,但是其存在几个非常麻烦的问题:(1) 输出图很大,导致内存占用多、推理和训练速度慢;(2) 存在理论误差下界;(3) mse loss可能会导致学习出来的结果出现偏移;(4) 不是全微分模型;

池化

普通池化(Max Pooling或Average Pooling)通常是在每个feature map上独立进行的,它会将每个feature map分成若干个不重叠的子区域,然后在每个子区域内取最大值(或平均值)作为该子区域的输出。具体来说,对于一个C×W×H的输入,Max Pooling会将每个C单独进行下采样,将W和H分别划分成若干个不重叠的子区域,然后在每个子区域内找到最大值作为该子区域的输出;Average Pooling则是将每个C单独进行下采样,将W和H分别划分成若干个不重叠的子区域,然后在每个子区域内取平均值作为该子区域的输出。最终得到的输出特征图的形状是C'×W'×H',其中C'=C是通道数不变,W'和H'由输入的W和H以及子区域的大小和步长决定。

普通池化操作通常是在卷积神经网络中使用的一种操作。它将输入的特征图按照设定的窗口大小,进行划分成若干个区域。然后对每个区域内的数值进行池化操作,比如取平均值或者取最大值等等,得到一个池化后的数值。这样池化后的结果通常可以压缩数据、减小计算量和提高模型的鲁棒性。

全局池化操作与普通池化有所不同,它并不是将特征图分成多个区域进行池化操作,而是对整个特征图进行池化操作。全局平均池化是对特征图内每个通道内的数值进行平均,得到一个通道内的单个值;而全局最大池化是对特征图内每个通道内的数值进行最大值操作,得到一个通道内的单个值。这种池化操作可以捕获到整个特征图的全局信息,通常用于特征提取和分类任务中。

对于一个输入特征图,它的维度为[C, W, H],其中C表示通道数,W表示特征图的宽度,H表示特征图的高度。在全局平均池化中,会对每个通道内的特征图进行平均,得到一个通道内的单个值,因此输出的特征图维度为[C, 1, 1]。也就是说,对于每个通道,它的所有元素都将被平均池化操作所影响,最终得到一个通道内的单个值。

全局最大池化中,我们将整张特征图上的每个通道的所有像素值取最大值,得到一个通道内的单个值。例如,如果输入特征图的尺寸为 C×W×H,其中 C 为通道数,W 和 H 分别为宽度和高度,那么经过全局最大池化后,每个通道会变成一个长度为1的向量。

而在全局平均池化中,我们将整张特征图上的每个通道的所有像素值取平均值,得到一个通道内的单个值。与全局最大池化类似,每个通道会变成一个长度为1的向量。

这两种池化方式通常用于将整张特征图的全局信息编码成一个向量,以便在全局范围内捕获图像的特征。

普通池化和全局池化的结果都是对输入特征图进行降维操作,得到一个输出的特征图。都是对每个通道进行池化的。不同的是池化区域,普通池化的输出特征图的空间大小会比输入特征图的空间大小小,而全局池化的输出特征图只有一个元素(也可以理解为空间大小为1×1)普通池化是在一个局部区域内进行取均值或最大值的操作,而全局池化是在整个特征图上进行取平均值或最大值的操作。因此,全局池化可以聚合整个特征图的信息,产生一个单一的值,而普通池化则产生一个尺寸较小的特征图。

卷积神经网络的输出特征图比输入图像的尺寸要小。这种设计不仅可以减少计算成本,还可以减轻由于输出分辨率降低而导致的正负点之间的不平衡问题

简单来说,卷积神经网络在进行特征提取时,通常会通过多次卷积和池化操作来逐渐减小特征图的尺寸,从而提取出更抽象、更高级别的特征。由于这些操作会导致分辨率的降低,因此输出特征图的尺寸通常会比输入图像的尺寸小。

这种设计可以节约计算成本,因为随着输出特征图的尺寸减小,需要计算的特征点数也会减少。此外,由于减小了输出分辨率,使得正负点之间的数量差异更小,从而可以减轻由此产生的不平衡问题,提高模型的稳定性和性能。

减小输出分辨率确实可以减轻正负样本数量之间的不平衡问题,但是这种影响通常比较有限。具体来说,对于一张输入图像,如果将其经过多次卷积和池化操作后,输出特征图的尺寸从原来的 H × W 减小到 h × w,那么每个像素点上都对应着原始图像中一个大小为 k × k 的局部区域,其中 k 通常是一个奇数。因此,输出特征图上的每个像素点都可以看作是原始图像中的一个小区域经过卷积和池化操作后的结果。

在分类任务中,正负样本的数量通常是相对平衡的,因此输出特征图上每个像素点对应的正负样本数量也会比较平衡。然而,在一些特殊情况下,比如目标检测和语义分割等任务中,正负样本数量之间的不平衡问题可能比较严重,这时减小输出分辨率确实可以在一定程度上缓解这种问题。

一文搞懂熵(Entropy),交叉熵(Cross-Entropy)

实验指标

在医疗领域,可靠的性能验证是至关重要的:在一般情况下,模型使用更多的训练数据会得到更好的效果。但在某些特殊情况下,训练集太小可能会导致模型出现过拟合的问题,即模型在训练集上表现很好,但在测试集上表现很差。在医学领域,由于数据的获取和标注过程比较复杂和昂贵,可用于训练的数据通常比较少。为了避免过拟合并得到可靠的性能评估,作者可能采用了一个小的训练集和一个大的测试集。这样可以更好地评估模型的泛化能力,即模型在未见过的数据上的表现

|| 

平均径向误差(MRE)是一种广泛使用的关键点检测性能度量指标。对于一个包含K个关键点的图像,MRE被定义为所有关键点与它们对应的估计位置之间的欧氏距离的平均值。MRE的计算方法是MRE = 1/K * ∑K_i=1 ||p_i - ˆp_i||,其中p_i是第i个关键点的真实位置,而ˆp_i是对应的估计位置。

MRE适合用于关键点检测任务,因为它考虑了所有关键点的预测误差,而不仅仅是单个关键点的误差。此外,MRE可以很好地表达关键点预测结果的平均准确度,因为它是所有关键点误差的平均值。

需要注意的是,MRE不考虑预测误差的方向,因此在某些情况下可能会出现MRE相同但是实际上关键点预测结果不同的情况。因此,在使用MRE作为评估指标时,应该结合具体任务需求和其他评估指标进行考虑。

||

BRS (Boundary Recall Score)、f-BRS (free Boundary Recall Score) 和 RITM (Region Intersection over the Minimum area) 是用来评估图像分割模型性能的指标,一般用于检查模型在分割边界和区域重叠方面的表现。

具体来说,BRS 和 f-BRS 都是用于度量模型预测的分割边界和真实边界之间的重叠程度。其中 BRS 考虑边界重合度和误差,f-BRS 则是在 BRS 基础上考虑了边界平移不变性。这两个指标的计算需要设定一个阈值,来决定哪些预测边界与真实边界被视为匹配。在计算 BRS 和 f-BRS 时,一般还会分别考虑预测边界内、边界上、边界外的像素。

RITM 则是用于度量模型预测的分割区域和真实区域之间的重叠程度,特别的,它考虑到了区域的最小面积。它可以同时度量模型在分类正确和定位正确方面的表现。RITM 的计算通常需要将预测区域和真实区域进行交和并操作,并计算它们的面积。

实验过程

self.model.train()这段代码体现了开启 Dropout 和 BatchNormalization 的训练模式:

在 PyTorch 中,通过调用 train() 方法,可以将模型设置为训练模式,此时模型中的 Dropout 和 BatchNormalization 层会被打开,以进行模型的训练。反之,如果调用 eval() 方法,则模型将被设置为评估模式,此时模型中的 Dropout 和 BatchNormalization 层会被关闭,以进行模型的评估。

进行模型验证的部分。在验证阶段,需要关闭 Dropout 和 BatchNormalization 层。使用 self.model.eval() 命令将模型转换为验证模式。

接着,在验证集上对模型进行前向传播,得到输出 outbatch。在验证阶段,不需要对模型进行反向传播和参数更新,因此可以使用 torch.no_grad() 命令关闭梯度计算,以提高代码效率。

累加每个 batch 的验证损失到 val_loss 中。然后使用 self.metric_manager.average_running_metric() 计算当前验证集上的平均指标,存储到 val_metric 中。

最后,根据当前的验证指标,通过 optimizer.scheduler_step() 命令对学习率进行更新。具体而言,此函数根据 save_manager.config.Train.decision_metric 决策指标的值调整优化器的学习率。该决策指标由配置文件中的 Train.decision_metric 参数控制。

Pytorch优化器全总结(一)SGD、ASGD、Rprop、Adagrad

Pytorch优化器全总结(二)Adadelta、RMSprop、Adam、Adamax、AdamW、NAdam、SparseAdam

Pytorch优化器全总结(三)牛顿法、BFGS、L-BFGS 含代码

Pytorch优化器全总结(四)常用优化器性能对比 含代码

猜你喜欢

转载自blog.csdn.net/sinat_40759442/article/details/129911248
ing
今日推荐