[论文理解] CornerNet: Detecting Objects as Paired Keypoints
[论文理解] CornerNet: Detecting Objects as Paired Keypoints
简介
首先这是一篇anchor free的文章,看了之后觉得方法挺好的,预测左上角和右下角,这样不需要去管anchor了,理论上也就w*h个点,这总比好几万甚至好几十万的anchor容易吧。文章灵感来源于Newell et al. (2017) on Associative Embedding in the context of multi-person pose estimation,利用embedding后的角点的距离区分左上角和右下角的角点是否属于一个类别,同时,文章提出了Corner Pooling来确保网络得到足够的信息,这比一般的临近位置polling更加有效(这让我学会了如何在特定任务时使用特定方法)。
网络结构
网络大致结构如图所示,网络的输出由三个部分组成,分别是heatmap、embedding vectors和offsets:
网络的baseline是Hourglass Network,同时训练两个hourglass 网络,一个用来输出corner,一个用来输出右下角corner,然后再训练一个embedding网络,给输出的corner编码成向量通过编码的向量间的距离将左上角corner与右下角corner匹配组成一个box。而通过offsets可以弥补下采样带来的位置损失,并且使gt和预测更加接近。

训练前-Ground Truth分配
文章用的网络的输出由heatmap、embedding vectors和offsets三部分组成,后两者后面会详细说的。对于heatmap而言,输出的heatmap是shape为(batch_size,c,h,w),其中c为类别数,本文并没有设置背景类别,h,w分别为feature map的宽和高。
文章对gt的分配就是看在gt点的一定半径范围内的点认为是positive,半径之外的点认为是negative,而positive的点的值并不是全分配1,而是按照二维高斯分布分配值,这样做的好处就是保证在gt附近的点的预测值有一定权值,因为其也可能预测到完全框住gt的框,但是显然更靠近gt的点的权值应该被分配的大一些。看官方给的图:

这里绿色的是预测的,但是绿色框的corner并没有和gt重合,但是其却也可以包含目标,所以我们对这种点也应该分配其为positive,这样应该就理解了。
类别置信度的loss为facal loss的改进版,因为总还是会遇到类别不平衡的问题,而focal loss就正好很大程度上能解决这个问题,其loss的形式为:

这里C为类别数,H和W分别为feature map的宽高。由于本文的gt的score不一定是1,因为我们上面的高斯分布去分配score使得gt可能小于1,所以作者的改动就在不是1的时候,也就是下面的情况,这个设计使得与gt的临近点的loss惩罚比较小,由此解决hard positive exmaple的问题,α和β都是超参,额外设置的,具体看官方的代码。
offset学习
因为feature map比原始图像肯定是小的,所以在由feature map映射到原图像位置的时候就存在一定偏移,比如原始图像的位置为(220,220),下采样的比率为3,则对应的feature map的位置就是(73,73),而要映射回去的时候却出现了问题,因为73*3 = 219,所以是有偏移的,这个偏移可以通过网络学习,这样不仅可以消去偏移,而且可以让临近点尽可能忘gt靠拢。所以学习的时候就学习这个差值:

文章采用的offset的loss为smotth L1 Loss,所以loss的计算如图:

embedding学习
embedding的目的是为了group corners,对feature map embedding的目的是为了让embedding后的左上角和右下角的向量距离小,而和不同类别的corner的距离大,所以训练的loss就是下面这样子的:

ek这里是第k个box embedding之后左上角和右下角的均值,所以上面的loss可以确保相同同一个box的左上角和右下角的距离足够近,而下面的loss可以保证其和其他不同类别的vector的距离足够远。
Corner Pooling
由于一般的pooling只会利用周边的信息,而本文的任务需要利用的信息是水平的或者竖直的,对于top left corner而言,其需要利用的应该是其水平右边所有的信息和竖直下边所有的信息,比如下面这个例子:

为了确定好左上角这个corner,需要利用这个图里的帽子区域的信息和左边手这里的信息,而corner pooling就是来解决这个问题的,其具体操作如下:

对于top left corner,就是取其从改点到width的所有值中的最大值,然后取改点到height的最大值,将两者值进行相加,就得到了pooling后的值。
官方给出的例子如下:

代码实现参加github:
https://github.com/princeton-vl/CornerNet-Lite
论文地址:
https://arxiv.org/pdf/1808.01244.pdf
[论文理解] CornerNet: Detecting Objects as Paired Keypoints的更多相关文章
- 【论文阅读】CornerNet: Detecting Objects as Paired Keypoints
以下内容将介绍ECCV2018的一篇目标检测的文章<CornerNet: Detecting Objects as Paired Keypoints>.该文章讲述了一个老子就是不用anch ...
- CornerNet: Detecting Objects as Paired Keypoints
CornerNet是一种anchor free的目标检测方法,不需要设置anchor,而是通过检测关键点(Keypoints),即目标的左上角(Top-Left Corners)和右下角(Bottom ...
- 论文阅读笔记五十:CornerNet: Detecting Objects as Paired Keypoints(ECCV2018)
论文原址:https://arxiv.org/pdf/1808.01244.pdf github:https://github.com/princeton-vl/CornerNet 摘要 本文提出了目 ...
- 论文阅读 | CornerNet:Detecting Objects as Paired Keypoints
论文地址:https://arxiv.org/abs/1808.01244v1 论文代码:https://github.com/umich-vl/CornerNet 概述 CornerNet是一篇发表 ...
- [论文理解]关于ResNet的进一步理解
[论文理解]关于ResNet的理解 这两天回忆起resnet,感觉残差结构还是不怎么理解(可能当时理解了,时间长了忘了吧),重新梳理一下两点,关于resnet结构的思考. 要解决什么问题 论文的一大贡 ...
- [论文理解]MetaAnchor: Learning to Detect Objects with Customized Anchors
MetaAnchor: Learning to Detect Objects with Customized Anchors Intro 本文我其实看了几遍也没看懂,看了meta以为是一个很高大上的东 ...
- 【论文】CornerNet:几点疑问
1.cornerpooling的设计,个人觉得解释有些牵强. 这里的两个特征图如何解释,corner点为何是横向与纵向响应最强的点.如果仅仅当成一种奇特的池化方式,恰好也有着不错的效果,那倒是可以接受 ...
- R-FCN论文理解
一.R-FCN初探 1. R-FCN贡献 提出Position-sensitive score maps来解决目标检测的位置敏感性问题: 区域为基础的,全卷积网络的二阶段目标检测框架: 比Faster ...
- YOLO V3论文理解
YOLO3主要的改进有:调整了网络结构:利用多尺度特征进行对象检测:对象分类用Logistic取代了softmax. 1.Darknet-53 network在论文中虽然有给网络的图,但我还是简单说一 ...
随机推荐
- php array数组(第一部分)
创建一个数组 <?php $arr = array("My","name","is","zhangsan"); e ...
- C++ Queues(队列)
C++ Queues(队列) C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构.1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.fr ...
- sqlserver2012——INTERSECT交查询
1. select a.成绩编号,a.分数,b.姓名 From 成绩信息 a,学生信息 b ' 一般的查询 a.成绩编号,a.分数,b.姓名 From 成绩信息 a,学生信息 b ' order a. ...
- Unity 5着色器系统代码介绍(上)
http://forum.china.unity3d.com/thread-25724-1-10.html Unity 5着色器系统代码介绍(上) Unity在着色器开发方面提供了很大的灵活性.有些工 ...
- Fiddler设置断点修改Request和Response【转】
Fiddler设置断点修改Request和Response 设置断点的两种方式:工具栏和命令 1.工具栏:Rules -> Automatic Breakpoints(automatic [ɔː ...
- 【微信小程序】开发实战 之 「数据缓存API」解析
每个小程序都可以有自己的本地缓存,可以通过 数据缓存的API 实现对本地缓存进行 设置.获取和清理.本地缓存最大为10M.localStorage是永久存储的,但我们不建议将关键信息都放在localS ...
- Sublime Text 3 配置 sass
先安装Sublime Text的sass 和 sass build插件, Sublime Text新建一个test.scss文件 $color: #369; body { backgroun ...
- 黑马旅游网配置 pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- 17.视图--SQL
一.什么是视图 视图是虚拟的表 为什么使用视图 重用SQL语句. 简化复杂的SQL操作.在编写查询后,可以方便地重用它而不必知道其基本查询细节. 使用表的一部分而不是整个表. 保护数据.可以授予用户访 ...
- codeforces597C-树状数组优化dp
因为整个序列为一个1-n的排列,所以可以这样dp dp[i][j]代表长度为i,以数字j结尾的子序列 dp[i][j]=dp[i-1][1,2,3...j-1]; 这道题的答案就是 dp[k+1][1 ...