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函数实现的代码如下:

 def _neg_loss(preds, gt):
pos_inds = gt.eq(1)
neg_inds = gt.lt(1) neg_weights = torch.pow(1 - gt[neg_inds], 4)
  #对应负样本loss公式的第一部分()内容,负样本的ycij值是基于ground truth角点的高斯分布计算得到;
loss = 0
for pred in preds:
pos_pred = pred[pos_inds]
neg_pred = pred[neg_inds]
#focal loss
pos_loss = torch.log(pos_pred) * torch.pow(1 - pos_pred, 2)
neg_loss = torch.log(1 - neg_pred) * torch.pow(neg_pred, 2) * neg_weights num_pos = pos_inds.float().sum()
pos_loss = pos_loss.sum()
neg_loss = neg_loss.sum() if pos_pred.nelement() == 0:
loss = loss - neg_loss
else:
loss = loss - (pos_loss + neg_loss) / num_pos
return loss

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

感谢下面的参考文章

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

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

cornerNet部分学习内容记录的更多相关文章

  1. sql学习内容记录

    1.left函数 left(字段,长度):获取指定字段左侧的数据,类似substring函数 2.union / union all 将多个记录合并成一个完整的数据集 3.insert into se ...

  2. '"千"第一周学习情况记录

    一周过去了,今天将我这一周的学习内容和主要感想记录与此和大家共同分享,一起进步.我将自己的学习计划命名为"千",因为我喜欢这个字,希望能用此来鼓舞自己不断前进.时间总是很快的,这一 ...

  3. Lucene.net(4.8.0) 学习问题记录五: JIEba分词和Lucene的结合,以及对分词器的思考

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  4. Cs231n课堂内容记录-Lecture 4-Part1 反向传播及神经网络

     反向传播 课程内容记录:https://zhuanlan.zhihu.com/p/21407711?refer=intelligentunit 雅克比矩阵(Jacobian matrix) 参见ht ...

  5. Cs231n课堂内容记录-Lecture 3 最优化

    Lecture 4 最优化 课程内容记录: (上)https://zhuanlan.zhihu.com/p/21360434?refer=intelligentunit (下)https://zhua ...

  6. Lucene.net(4.8.0) 学习问题记录六:Lucene 的索引系统和搜索过程分析

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  7. 20155328 2016-2017-2 《Java程序设计》 第十周学习内容总结

    20155328 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 JAVA和ANDROID开发学习指南 第22章 网络概览 两台计算机用于通信的语言叫做&qu ...

  8. web前端开发学习内容

    应该 具备的 知识技能 :懂web标准,熟练手写 xhtml css3 并符合 符合w3c标准                       代码能 兼容主流浏览器.ie6.7.8.9 ff 等.    ...

  9. Activiti 学习笔记记录(2016-8-31)

    上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件

随机推荐

  1. Cluster基础(三):配置HAProxy负载平衡集群、Keepalived高可用服务器、Keepalived+LVS服务器

    一.配置HAProxy负载平衡集群 目标: 准备三台Linux服务器,两台做Web服务器,一台安装HAProxy,实现如下功能: 客户端访问HAProxy,HAProxy分发请求到后端Real Ser ...

  2. 20180826(02)-Java集合框架

    Java 集合框架 早在Java 2中之前,Java就提供了特设类.比如:Dictionary, Vector, Stack, 和Properties这些类用来存储和操作对象组. 虽然这些类都非常有用 ...

  3. String 类的常用方法

    format 是String类的一个非常有用的静态函数,可以将各类数据格式化为字符串并输出.其中format参数指定了输出的格式 toCharArray方法可以将字符串转为字符数组 getBytes方 ...

  4. ZOJ 3329 One Person Game(概率DP,求期望)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3754 题目大意: 有三个骰子,分别有K1,K2,K3个面,一次投掷可以得到三个 ...

  5. yum python mysql

    lrwxrwxrwx root root Jun : pyspark -> /etc/alternatives/pyspark lrwxrwxrwx root root Jul : python ...

  6. fiddler抓取火狐浏览器上https协议请求

    前言:现在很多网站采用https协议,当打开fiddler时.浏览https协议的网站会提示不安全,若使用fiddler抓取https协议的请求,则需要向浏览器导入证书,才能抓取https协议的请求, ...

  7. tomcat启动控制台报Exception in thread ''main".......“Could not find the main class:.....Bootstrap”问题

    startup.bat文件打开最后end下一行加pause调试,重新启动tomcat,发现配置没问题,但是依然报错,发现是jdk版本问题,jdk1.6无法与tomcat8适配,重新装个1.7版本的jd ...

  8. 【FICO系列】SAP FICO模块-财务账期的打开和关闭

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[FICO系列]SAP FICO模块-财务账期的 ...

  9. (转载)STL map与Boost unordered_map的比较

    原链接:传送门 今天看到 boost::unordered_map,它与 stl::map的区别就是,stl::map是按照operator<比较判断元素是否相同,以及比较元素的大小,然后选择合 ...

  10. File类的相关方法

    java.io.File类 文件和路径名的抽象表达形式 java把电脑中的文件和文件夹(目录)封装了一个File类,我们可以使用File类对文件和文件夹进行如下操作 创建一个文件/文件夹 删除 获取 ...