zoukankan      html  css  js  c++  java
  • cornerNet部分学习内容记录

    cornerNet来源灵感是基于多人姿态估计的从下往上思想,预测角的热图,根据嵌入式向量对角进行分组,其主干网络也来自于姿态估计的环面网络。

    cornerNet的总体框架结构图如下:

     CornerNet 模型架构包含三部分:环面网络、右下角和左上角的热图、预测模块

    环面网络同时包含多个从下往上(从高分辨率到低分辨率)和从上往下(从低分辨率到高分辨率)过程。这样设计的目的是在各个尺度下抓取信息。

    嵌入式向量使相同目标的两个顶点(左上角和右下角)距离最短,偏移用于调整生成更加紧密的边界定位框。

    corner net最大的亮点之处在于把原本预测目标采用anchor机制换为用两个关键点表示,这里采用的是左上角的点和右下角的点来确定一个目标的位置。

    这样做的好处一是能够明显的减少参数量(anchor中所需的参数),减少计算的复杂度;二是不再采用原先目标检测中的anchor机制,可以很明显的减少计算量。

    最关键的corner pooling模块:接在特征图后边
    (corner pooling有效的主要原因在于下面两点:
    1. 目标定位框的中心难以确定,和边界框的4条边相关,但是每个顶点只与边界框的两条边相关,所以角点更容易提取
    2. 顶点能更有效提供离散的边界空间,O(wh) 顶点可以表示 O(w2h2) anchor boxes
    )

    例如top-left的点预测,每个点在各自的两个方向进行 max pooling操作,结果相加,得到的是一个点的max pooling结果,

     图6是具体计算步骤:

     特征图的大小为(w,h);     左上角点坐标为(0,0),     例如对特征图中某一个点(i,j)计算pooling,首先计算从这个点到特征图右边范围内的最大值,再计算

    这个点到特征图下边范围内的最大值,把这两个值相加即可得出corn pooling的结果。

    图7是预测的基本模块,首先特征图提取出来,送入corner pooling module模块,分别进行top-left和bottom-right的pooling操作;

    中间是改进的residual模块,含有skip connection;预测的两个关键点模块分别得出三个结果,即heatmaps、embeddings、offsets;

    heatmaps即预测的角点结果;embeddings是嵌入操作,为了得到哪两个点是匹配的一个目标的左上角和右下角的点;offsets是计算误差量(在取整计算时丢失的精度信息)。

    预测的部分步骤:

    1、在得到预测角点后,会对这些角点做NMS操作,选择前100个左上角角点和100个右下角角点。

    2、计算左上角和右下角角点的embedding vector的距离时采用L1范数,距离大于0.5或者两个点来自不同类别的目标的都不能构成一对。

    3、测试图像采用0值填充方式得到指定大小作为网络的输入,而不是采用resize,另外同时测试图像的水平翻转图并融合二者的结果。

    4、最后通过soft-nms操作去除冗余框,只保留前100个预测框。

     heatmaps利用的是改进版本的focal loss,公式如下,  重点依然是加大关注对困难样本的识别。

    差别主要体现再负样本上面,对于负样本加入了一个参数β,用来控制对不同的负样本点用不同权重(原因是,不同的负样本与gt的差距不同,

    需要另外处理,有的框已经框住了大部分目标内容,所以是有用的框);

    且负样本的ycij值是基于ground truth角点的高斯分布计算得到;

     此loss函数实现的代码如下:

     1 def _neg_loss(preds, gt):
     2     pos_inds = gt.eq(1)
     3     neg_inds = gt.lt(1)
     4 
     5     neg_weights = torch.pow(1 - gt[neg_inds], 4)
     6   #对应负样本loss公式的第一部分()内容,负样本的ycij值是基于ground truth角点的高斯分布计算得到;
     7     loss = 0
     8     for pred in preds:
     9         pos_pred = pred[pos_inds]
    10         neg_pred = pred[neg_inds]
    11         #focal loss
    12         pos_loss = torch.log(pos_pred) * torch.pow(1 - pos_pred, 2)
    13         neg_loss = torch.log(1 - neg_pred) * torch.pow(neg_pred, 2) * neg_weights
    14 
    15         num_pos  = pos_inds.float().sum()
    16         pos_loss = pos_loss.sum()
    17         neg_loss = neg_loss.sum()
    18 
    19         if pos_pred.nelement() == 0:
    20             loss = loss - neg_loss
    21         else:
    22             loss = loss - (pos_loss + neg_loss) / num_pos
    23     return loss

    embeddings部分:如果一个左上角角点和一个右下角角点属于同一个目标,那么二者的embedding vector之间的距离应该很小。用这种方式来判断一组角点。

    感谢下面的参考文章

    参考链接:https://blog.csdn.net/u014380165/article/details/83032273(作者:魏凯峰 主要研究领域:目标检测、图像识别、图像对抗、模型加速压缩 ,推荐看他的文章,详细且清楚。)

         https://www.sohu.com/a/256416414_633698

  • 相关阅读:
    日常巡检
    mysql 主从
    tomcat +apache 动静分离
    ELK安装
    LVS-NAT模式
    shell 三剑客
    shell $传参
    zabbix安装
    lvs-DR 负载均衡
    解决ubuntu中pycharm的图标没有问题
  • 原文地址:https://www.cnblogs.com/ywheunji/p/11441807.html
Copyright © 2011-2022 走看看