本文参考:
目标检测算法之CenterNet_哔哩哔哩_bilibili
目录
Faster R-CNN为Anchor Based算法,也就是先在图像上瞄框,然后预测框是背景还是物体。如果是物体,则对框的大小进行回归精细化。
CenterNet为Anchor Free算法,也就是说不需要提前在图像中瞄框,object as keypoints,一个物体当作一个点去预测。

为什么WH 以及 Offset的维度不是W * H * 2C?
因为:W * H每一个点只需要预测一个一个物体的宽高或者偏移量,即使最后的维度为2C,那么也只会用到heatmap中概率最高的那个预测物体的那个宽高或者偏移量。当前算法无法很好处理多个物体中心点在一个点的情况。

预测出feature map中的值
ground truth:标注的真实数据集

Img在feature map中相应缩放得到中心点。
(1)如果中心点为1,其他为0,对model要求过高,事实上预测点在中心点附近也能接受。
预测点相对中心点的值取高斯分布,

及
为中心点在feature map中的新坐标。

如果得到了r的值,那么σ = r / 3,继而可以得到高斯分布值。
(2)怎么计算r呢?根据IOU进行计算,根据如下3种情况可以分别得到3个r,然后取其中的最小值。

分类算法,一般用Cross Entropy交叉熵。
而在目标识别中数据分布不均衡,一个图片中只有极少数是物体中心点及其r半径内的,大部分都为负样本0,所以要用focal Loss。
原生Focal Loss为:

因为当前分类不是标准的0 / 1 分类,所以需要对Focal Loss做优化。

当Yxyc接近峰值时降低loss;当Yxyc=0时与Focal Loss一致。刚才计算出来的高斯分布值,只在1-Yxyc中起作用。
在Feature Map中
左上角和右下角分别为:

中心点为:
![]()
宽高为:
![]()
Loss值为:

在Feature Map中,针对中心点的offset。
主要是因为中心点从原图到feature map时会带来精度的损失,而offset即为拟合精度损失值。

CenterNet的loss包含3个部分,heatmap的loss,目标长宽预测的loss,目标中心点偏移值的loss。其中heatmap的loss采用改进型的focal loss,长宽预测和目标中心点偏移的loss都采用L1Loss,具体如下:

Inference:

计算出来为在feature map中预测出来的左上角和右下角的值,每个值分别由目标中心点、中心点偏移值、长/宽 组成。
处理时机:在加载数据时才处理,不提前处理。
(1)通过仿射变换将原图的值映射到feature map
(2)根据feature map的长宽求高斯半径r
(3)求feature map的中心点ct,并取整
(4)根据r的长度以及σ = r / 3构建2维高斯分布如下:

构建详细过程见(7.2)所示
(5)将高斯分布值放在heatmap[cls_id]的合适位置
(6)输出如下几个值:
处理函数:gaussian2D(shape, sigma=1)
目标:构造二维的高斯分布,其二维的中心点的值为1.0,其他值均小于1.0
步骤概述:
步骤举例说明:
m, n = [(ss - 1.) / 2. for ss in shape]
y, x = np.ogrid[-m:m+1,-n:n+1]
h = np.exp(-(x * x + y * y) / (2 * sigma * sigma))
h[h < np.finfo(h.dtype).eps * h.max()] = 0
return h
代码解读:
m=n=1
y值为-1,0,1,它的shape为(3,1)
x值也为-1,0,1,它的shape为(1,3)
x * x为(1,0,1)
y * y 为(1, 0, 1)T
x * x + y * y为:

预测出来的wh为batch(取1) * 128 * 2 的维度,pred形式为:
[[[w1p, h1p], [w2p, h2p], …]]
Ground Truth中的wh通过ind索引出wh值,维度也是batch(取1) * 128 * 2,output形式为:
[[[w1, h1], [w2, h2], …]]
然后通过mask筛选元素进行smoothL1Loss计算:loss(pred, output, mask)
推理:根据feature map中得到的hm、wh、reg值,推理出在原图中的bbox、类别、置信度。
(1)hm转化为0-1分布
通过sigmoid函数
(2)_nms在hm中寻找中心点
中心点为在3*3(可以为其他值)中满足中心点最大,其他值均小于该值的点,如下所示:

使用max_pool2d对hm进行逐一处理,stride=1,计算pad值使得输入输出的维度保持不变。
如果max_pool2d输出的hmax和hm中的点一样,则为中心点。
(3)topk选取置信度最高的中心点
输出数据(scores, inds, clses, ys, xs)
分别对应:置信度 / 中心点在一维上的坐标 / 类别 / 中心点在二维上的坐标

(4)bbox还原到原图中
通过放射变换完成,get_affine_transform(xx, inv=1)即可。
之前的放射变换get_affine_transform是把512*512映射到128*128,通过inv=1参数可将128*128映射到512*512。
DLASeg模型包含两个网络,一个是DLA的特征提取模型,可用作分类模型和检测模型的backbone。另一个网络是DLA的基础上加入一个decoder模块,组成一个分割模型,相当于把DLA看作encoder。
DLA模型又包含两部分:
HDA: Hierarchical deep aggregation,层级深度融合,用于融合各个模块(残差模块)和通道的特征,更好地融合语义特征。
IDA:Iterative deep aggregation,迭代深度融合,用于聚合不同分辨率和尺度,更好地融合空间信息。

现有的聚合方式(skip-connection)是通过将较浅和较深层连接到不同尺寸和分辨率的聚合。这种方式通常是线性且最浅层的层级的聚合程度最少的,最浅层的特征只聚合了一次。

IDA:聚合过程是从最浅层开始,逐步与深层合并,浅层级的特征能在不同stage的聚合中进行传播。


(d)是基础的Hda是一个树状的结构,通过合并blocks和stages的特征达到对特征的保留和融合。
(e)对(d)进行了优化,下一个子树的输入由上一个block的输出 变成了 上一个字数聚合节点的输出。这样之前所有blocks的信息就读能够被传播和保留。
(f)对(e)进行了优化,将同一深度的节点合并以提升效率。
主要是进行上采样
