当前位置:网站首页>CenterNet :Objects as Points 部分过程个人理解

CenterNet :Objects as Points 部分过程个人理解

2020-12-08 08:46:02 osc_sbtpzgv1

  • 训练过程:
    注意:以下提到的坐标都是以图像左上角为原点(0,0)来计算的

  • ①先读取图片信息,然后根据标签标注的物体中心点将一张图片不是物体中心点的地方全部设为0即黑化,这时就得到了一张热图(heatmap),但此时还未将高斯分布撒在这张热图上。

  • ②求高斯分布的半径,根据IOU(即假设框与真实框的交并比),求出符合这个IOU偏移范围的半径(radiu),也就是说如果以这个圆的圆心为中心点,那么在这个圆的范围内,离圆心越远的点,偏移程度越大,相应的高斯值越低,超出这个圆范围的高斯值为0。

  • ③求高斯分布图(那个小亮点),根据求出来的半径,先代入高斯公式求得一个圆形高斯分布(一个小亮点,即类似下面的矩阵)。
    在这里插入图片描述

  • ④限制范围(限制热图(masked_heatmap)和高斯分布图(masked_gaussian)的范围),先根据标注求出物体的中心坐标(center[0],center[1]),然后根据半径和物体中心点的坐标判断以物体中心点坐标为圆心,radiu为半径所画的圆是否超出了热图的边界范围,以此来划定范围。这个范围被保存在四个变量里面,分别是:left,right,top,bottom(即上下左右)

根据masked_heatmap = heat_map[y-top : y+bottom,x-left : x+right]
将热图上需要覆盖高斯图的部分保存了下来

根据
masked_gaussian = gaussian[radius - top:radius + bottom, radius - left:radius + right]
将限制好范围的高斯图保存了下来,也就是说可能对原有的高斯图进行了切割,也可能原封不动。

再通过混合比大函数,将高斯图分布在热图
np.maximum(masked_heatmap, masked_gaussian * k, out=masked_heatmap)
(out参数的意思是把输出当做masked_heatmap变量,前提是masked_heatmap的维度相同或者支持广播条件)
(该函数的作用是挨个比较两个张量里面元素的大小,取两个元素之中最大的元素,形成一个新的张量)


热图全是0,所以就等于把高斯图覆盖在了热图上。

(注意:masked_heatmap = heat_map[y-top : y+bottom,x-left : x+right]
这一步其实不单只是单纯的把heat_map赋给masked_heatmap, 而是创建一个masked_heatmap,这个maked_heatmap和heat_map属于同一个对象,所以两者中任意一个发生改变,另一个也会随之改变。)

  • 预测过程:

利用3x3最大池化求峰值的过程:

通过卷积网络预测得到的热图:
在这里插入图片描述

  • ①首先,把预测出来的热图(其中一层)传进函数里面
    在这里插入图片描述
    在 _nms() 函数里面利用3x3最大池化求出来hmax,也就是刚刚经过最大池化的图:
    在这里插入图片描述


  • ②然后经过keep = (hmax == heat1).float() 这一步来求极大值(峰值)。
    原理是:heat经过maxpool之后有的元素的值变化了,有的元素的值没变化,没变化说明这个值是比相邻的八个值都大或者与八个值中最大的值相等,因此才不会被maxpool改变。 keep = (hmax == heat1).float() 这一步的作用是将没变化的值变为1,变化了的值变为0。这就使得峰值变为了1,不是峰值的地方变为了0,于是便求得了峰值图heat*keep
    在这里插入图片描述
    在这里插入图片描述


版权声明
本文为[osc_sbtpzgv1]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4288691/blog/4780387