• CenterNet算法by bilibili


    本文参考:

    目标检测算法之CenterNet_哔哩哔哩_bilibili

    目录

    1、CenterNet与Faster R-CNN算法区别

    2、CenterNet总体架构

    3、Heatmap

    (3.1)预测数值

    (3.2)Ground Truth数值

     (3.3)Loss值

    4、WH

    5、Offset

    6、Train and Inference

    7、代码之GT处理

    (7.1)GT处理步骤

    (7.2)构建2D高斯分布步骤

    8、代码之wh的loss计算

    9、代码之预测推理计算

    10、Backbone DLASeg解读

    (10.1)DLASeg模型组成

    (10.2)DLA模型组成

     (10.3)IDA

    (10.4)HDA

     (10.5)分割网络


    1、CenterNet与Faster R-CNN算法区别

    Faster R-CNN为Anchor Based算法,也就是先在图像上瞄框,然后预测框是背景还是物体。如果是物体,则对框的大小进行回归精细化。

    CenterNet为Anchor Free算法,也就是说不需要提前在图像中瞄框,object as keypoints,一个物体当作一个点去预测。

    2、CenterNet总体架构

     为什么WH 以及 Offset的维度不是W * H * 2C?

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

    3、Heatmap

    (3.1)预测数值

    预测出feature map中的值

    (3.2)Ground Truth数值

    ground truth:标注的真实数据集

    Img在feature map中相应缩放得到中心点。

    (1)如果中心点为1,其他为0,对model要求过高,事实上预测点在中心点附近也能接受。

    预测点相对中心点的值取高斯分布,

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

    如果得到了r的值,那么σ = r / 3,继而可以得到高斯分布值。

    (2)怎么计算r呢?根据IOU进行计算,根据如下3种情况可以分别得到3个r,然后取其中的最小值。

     (3.3)Loss值

    分类算法,一般用Cross Entropy交叉熵。

    而在目标识别中数据分布不均衡,一个图片中只有极少数是物体中心点及其r半径内的,大部分都为负样本0,所以要用focal Loss。

    原生Focal Loss为:

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

     当Yxyc接近峰值时降低loss;当Yxyc=0时与Focal Loss一致。刚才计算出来的高斯分布值,只在1-Yxyc中起作用

    4、WH

    在Feature Map中

    左上角和右下角分别为:

    中心点为:

    宽高为:

    Loss值为:

    5、Offset

    在Feature Map中,针对中心点的offset。

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

    6、Train and Inference

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

     Inference:

    计算出来为在feature map中预测出来的左上角和右下角的值,每个值分别由目标中心点、中心点偏移值、长/宽 组成。

    7、代码之GT处理

    处理时机:在加载数据时才处理,不提前处理。

    (7.1)GT处理步骤

    (1)通过仿射变换将原图的值映射到feature map

    (2)根据feature map的长宽求高斯半径r

    (3)求feature map的中心点ct,并取整

    (4)根据r的长度以及σ = r / 3构建2维高斯分布如下:

    构建详细过程见(7.2)所示 

    (5)将高斯分布值放在heatmap[cls_id]的合适位置

    (6)输出如下几个值:

    • hm:C*W*H的维度,根据C区分目标类别
    • ind:W*1的维度,记录中心点在一维中的索引值,有值的放在前面,其他数据为0
    • wh:W*2的维度,[(w1,h1), (w2,h2)...],有值的放在前面,其他数据为0
    • reg:W*2的维度,中心点的偏移值,有值的放在前面,其他数据为0

    (7.2)构建2D高斯分布步骤

    处理函数:gaussian2D(shape, sigma=1)

    目标:构造二维的高斯分布,其二维的中心点的值为1.0,其他值均小于1.0

    步骤概述

    • 将中心点设为0,0。取x,y为-shape/2 : shape/2, -shape/2: shape/2
    • 计算x * x, y * y,通过广播机制计算x * x + y * y,得到的值维度刚好也是shape
    • 通过np.exp(-(x * x + y * y) / (2 * sigma * sigma)) 得到shape维度的高斯分布值
    • 将特别小的值设为0,通过np.finfo(h.dtype).eps可以获得特别小的值

    步骤举例说明

    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为:

    8、代码之wh的loss计算

    预测出来的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)

    9、代码之预测推理计算

    推理:根据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。

    10、Backbone DLASeg解读

    (10.1)DLASeg模型组成

    DLASeg模型包含两个网络,一个是DLA的特征提取模型,可用作分类模型和检测模型的backbone。另一个网络是DLA的基础上加入一个decoder模块,组成一个分割模型,相当于把DLA看作encoder。

    (10.2)DLA模型组成

    DLA模型又包含两部分:

    HDA: Hierarchical deep aggregation,层级深度融合,用于融合各个模块(残差模块)和通道的特征,更好地融合语义特征。

    IDA:Iterative deep aggregation,迭代深度融合,用于聚合不同分辨率和尺度,更好地融合空间信息。

     (10.3)IDA

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

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

    (10.4)HDA

     

    (d)是基础的Hda是一个树状的结构,通过合并blocks和stages的特征达到对特征的保留和融合。

    (e)对(d)进行了优化,下一个子树的输入由上一个block的输出 变成了 上一个字数聚合节点的输出。这样之前所有blocks的信息就读能够被传播和保留。

    (f)对(e)进行了优化,将同一深度的节点合并以提升效率。

     (10.5)分割网络

    主要是进行上采样

     

  • 相关阅读:
    【JavaWeb】一篇文章掌握Servlet
    Debian 开机自动挂载磁盘
    Redis的Java客户端-Jedis
    面试那些事——Java全栈
    MySQL查漏补缺
    Linux使用systemctl实现开机自启动
    基于SSM框架的校园疫情防控健康打卡系统
    基础医学概论试题
    JWT快速上手 | 黑马
    当你打开终端并输入命令时会发生什么?(上)
  • 原文地址:https://blog.csdn.net/benben044/article/details/126464607