CornerNet: Detecting Objects as Paired Keypoints论文详解

2023-10-31 01:20

本文主要是介绍CornerNet: Detecting Objects as Paired Keypoints论文详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《CornerNet: Detecting Objects as Paired Keypoints》发表于ECCV2018

代码地址:https://github.com/princeton-vl/CornerNet

文章认为采用anchor进行目标检测的方式有两个不好的地方:第一,为了确保anchor能够尽可能的覆盖的所有的标注框,往往需要大量的anchor,而其中只有少部分是真正有效的,这样会导致训练时正负样本的不平衡和减慢训练速度;第二,anchor的方式需要引入各种超参数,比如anchor大小、比例、数量等。因此文章提出一种新的目标检测方式,不使用anchor来进行目标检测。文章使用左上角点和右下角点来表示检测框,所以文章提出的网络通过预测框的左上角点,右下角点和角点的嵌入向量(embedding vector)来得到最终的检测框。

下面来详细说明文章的原理

一、网络结构

网络结构如下图所示,可以看出文章采用的是16年用于姿态识别的网络hourglass作为主干网络。该主干网络提取出来的特征输入到两个模块中,一个模块用来预测左上角点,另一个用来预测右下角点。每个预测角点的模块都有自己的corner pooling,最终输出有角点对应的热图(heatmaps)、嵌入向量(embeddings)和角点的偏移信息。
在这里插入图片描述

1.1 hourglass网络

文章使用的网络由文章《Stacked hourglass networks for human pose estimation》提出,用来做人体姿态识别的任务。该网络是全卷积网络,由一个或者多个hourglass模块组成。一个hourglass模块先用一系列的卷积和maxpooling层对输入进行特征提取,同时提取出的特征会有下采样的效果,然后通过一系列的上采样和卷积操作使得特征图又慢慢变大。通过这些操作hourglass模块能将图片的局部信息和全局信息提取出来。通过多个hourglass的堆叠,网络可以更好的获取到一些高维信息,使得网络很适合用于物体检测的任务。因为特征图的先小后大,很像沙漏,网络因此而得名。

文章用了两个hourglass模块堆叠而成,且相对于原始的hourglass模块,文章做了一些小的修改。首先,文章用stride为2的卷积代替maxpooling操作。对输入的分辨率下采样5次,每次输出的特征通道数为(256,384,384,384,512)。在上采样的过程中应用了最近邻上采样接2个残差模块的方式(代码好像并没有,只是简单的上采样,然后和之前的卷积结果相加)。在与上采样相加之前之前的卷积结果会进过两个残差模块。在hourglass模块的中间,也就是512通道处有4个残差模块。输入hourglass之前,图片会进过一个 7 × 7 7\times7 7×7stride为2的卷积和一个stride为2的残差模块。

同《Stacked hourglass networks for human pose estimation》类似,在两个hourglass模块的连接处,使用了内部监督(intermediate supervision),即将第一个模块的输入经过 1 × 1 1\times1 1×1Conv-BN和第一个模块的输出也经过 1 × 1 1\times1 1×1Conv-BN的结果相加后送给ReLU,得到的结果在经过一个残差模块送入第二个hourglass模块。这里大致的结构如下图所示,详细的实现请参考代码。
在这里插入图片描述

1.2角点检测

网络预测的角点输出是左上角点和右下角点的return结果。每种热图有C个通道(C为预测的类别数),热图大小和图片一样大为 H × W H\times W H×W。输出的每个通道都是二值的mask图像,用来表示每个像素是否为角点。

对于每一个角点来说,只有一个点是正样本,其他都是负样本,但由于某些错误的点对得到的框仍能和真实的标注框有很高的重叠。所以在训练时靠近正样本的负样本有一定惩罚权重,即越靠近正样本的负样本受到的越小。惩罚权重是通过未归一化2D高斯分布( e − x 2 + y 2 2 σ 2 e^{-\frac{x^2+y^2}{2\sigma^2}} e2σ2x2+y2)来赋值的。待减少惩罚的负样本,也就是上面所说的正样本附近的负样本(附近的定义就是负样本的位置使得得到的框与groundtruth的IOU小于0.3的点),且这些点是以正样本为中心一定半径内的点,如下图所示。而高斯分布中的 σ \sigma σ就是半径的1/3。
在这里插入图片描述
因为在全卷积的网络中,往往会有卷积的featuremap的大小比原图小的情况,因此对于原图中坐标为(x,y)的点,对应到featuremap中的坐标为 ( ⌊ x n ⌋ , ⌊ y n ⌋ ) (\lfloor \frac{x}{n} \rfloor, \lfloor \frac{y}{n} \rfloor) (nx,ny),其中n为下采样的因子。当我们将特征图上的点还原到原图时会导致精度的损失。为了解决这个问题网络还会预测还原至原图需要的偏移量。偏移量的gt计算如下所示:
o k = ( x k n − ⌊ x k n ⌋ , y k n − ⌊ y k n ⌋ ) o_{k}=\left(\frac{x_k}{n}-\lfloor\frac{x_k}{n}\rfloor, \frac{y_k}{n}-\lfloor\frac{y_k}{n}\rfloor\right) ok=(nxknxk,nyknyk)
上式中, o k o_{k} ok表示偏移量, ( x k , y k ) (x_k,y_k) (xk,yk)表示原图的坐标点。

1.3 角点配对(grouping corners)

这部分原文写了几段,包括的loss是怎么计算的,先不管loss的计算,先要弄懂文中写的embedding是什么。
更广义的来说,用来进行角点配对的embedding指的是网络输出的featuremap,这个featuremap大小与预测角点的featuremap大小一样。在对应角点的位置处的feature就认为是这个角点的embedding,文章用的embedding是1维的,也就是说一个角点对应一个预测值,当预测的左上角点和右下角点的embedding值很小时,认为这两个预测点是属于同一个框的。

1.4 Corner Pooling

这个是文章为了更好的预测角点位置提出的一个新的pooling方法。拿左上角点来说,为了更好的判断featuremap中的某一点是左上角点,它需要以它当前的位置向右水平扫视,和向下竖直扫视来得到一个值(可以认为是左上角点的响应值)。对于一张大小为 H × W H\times W H×W的特征图,对于特征图上的点(i,j),corner pooling的计算方式为:
t i , j = { m a x ( f t i , j , t ( i + 1 ) j ) i f i < H f t H j o t h e r w i s e t_{i,j}=\left\{ \begin{array}{lr} max(f_{t_{i,j}}, t_{(i+1)j}) \quad if \quad i <H \\ f_{t_{Hj}} \quad otherwise \end{array} \right. ti,j={max(fti,j,t(i+1)j)ifi<HftHjotherwise
l i , j = { m a x ( f t i , j , l i ( j + 1 ) ) i f j < W f l i W o t h e r w i s e l_{i,j}=\left\{ \begin{array}{lr} max(f_{t_{i,j}}, l_{i(j+1)}) \quad if \quad j <W \\ f_{l_{iW}} \quad otherwise \end{array} \right. li,j={max(fti,j,li(j+1))ifj<WfliWotherwise
右下角点同理,提取到的两个方向的最大值后相加就是pooling的最终结果。这种pooling方法能够采用动态规划的方式高效的计算,如下图所示
在这里插入图片描述
pooling的最终结果会参与到角点的位置估计、角点的偏移量估计、角点的embedding计算中去,如下图所示
在这里插入图片描述

二、 loss的计算

本文有几种loss,一个是角点估计的loss,一个是角点偏移位置估计的loss,一个是角点组合估计的loss。下面来单个说明一下。

2.1 角点位置估计的loss计算

角点位置估计的loss计算,该loss是focal loss的变式:
L d e t = − 1 N ∑ c = 1 C ∑ = 1 H ∑ j = 1 W { ( 1 − p c i j ) α l o g ( p c i j ) i f y c i j = 1 ( 1 − y c i j ) β ( p c i j ) α l o g ( 1 − p c i j ) o t h e r w i s e L_{det}=\frac{-1}{N}\sum^{C}_{c=1}\sum^{H}_{=1}\sum^{W}_{j=1}\left\{ \begin{array}{lr} (1-p_{c_{ij}})^{\alpha}log(p_{c_{ij}}) \quad if y_{c_ij}=1 \\ (1-y_{c_{ij}})^{\beta}(p_{c_{ij}})^{\alpha}log(1-p_{c_{ij}}) \quad otherwise\end{array} \right. Ldet=N1c=1C=1Hj=1W{(1pcij)αlog(pcij)ifycij=1(1ycij)β(pcij)αlog(1pcij)otherwise

上式中,N是一张图片中物体的个数, α \alpha α β \beta β是两个超参数这里分别取为2和4。 p c i j p_{c_{ij}} pcij是在预测map中对于c类物体在坐标(i,j)下的概率值,对应位置的gt为 y c i j y_{c_{ij}} ycij,这里注意的是 y c i j y_{c_{ij}} ycij是根据高斯分布和标定真值求出来用于训练的值 ( 1 − y c i j ) (1-y_{c_{ij}}) (1ycij)用来作为真值附近的负样本的惩罚项。

2.2 角点位置偏移的loss计算

上面说到由于卷积下采样的操作会产生一定的偏移现象,偏移量用 o k o_{k} ok表示,偏移量的loss计算采用smooth L1 loss表示:
L o f f = 1 N ∑ k = 1 N S m o o t h L 1 L o s s ( o k , o ^ k ) L_{off}=\frac{1}{N}\sum^{N}_{k=1}SmoothL1Loss(o_{k},\hat{o}_k) Loff=N1k=1NSmoothL1Loss(ok,o^k)

其中 o k o_{k} ok表示真值的偏移, o ^ k \hat{o}_{k} o^k表示预测的偏移量。

2.3 角点组合估计的loss

上面提到了角点组合预测用的是embedding值的距离,而embedding值本文用的是1维的,可以认为网络对于每个预测点输出的embedding值是一个值,对于k类物体来说左上角点的embedding值用 e t k e_{t_k} etk表示,对于右下角用 e b k e_{b_k} ebk表示,loss计算如下:
L p u l l = 1 N ∑ k = 1 N [ ( e t k − e k ) 2 + ( e b k − e k ) 2 ] L_{pull}=\frac{1}{N}\sum^{N}_{k=1}\left[(e_{t_k}-e_{k})^2+(e_{b_k}-e_k)^2\right] Lpull=N1k=1N[(etkek)2+(ebkek)2]

L p u s h = 1 N ( N − 1 ) ∑ k = 1 N ∑ j = 1 , j ≠ k N m a x ( 0 , δ − ∣ e k − e j ∣ ) L_{push}=\frac{1}{N(N-1)}\sum^N_{k=1}\sum^{N}_{j=1,j\neq k} max(0,\delta-|e_k-e_j|) Lpush=N(N1)1k=1Nj=1,j=kNmax(0,δekej)

其中 e k e_k ek表示 e t k e_{t_k} etk e b k e_{b_k} ebk的均值, δ \delta δ本文设置为1.这里一个叫pull loss为了将两个一组的点对中每个点对平均值距离越近,从而loss更小。一个叫push loss,为了将不是一组的点对距离更远从而loss越小

根据上面各个loss,文中总的loss计算为:
L = L d e t + α L p u l l + β L p u s h + γ L o f f L=L_{det}+\alpha L_{pull}+\beta L_{push} + \gamma L_{off} L=Ldet+αLpull+βLpush+γLoff
文中, α \alpha α β \beta β都设为0.1, γ \gamma γ设为1。

到这里文章原理基本介绍完了,对于一些实验的结果和分析详情可以查看原文。

欢迎加入Object Detection交流,群聊号码:910457072

这篇关于CornerNet: Detecting Objects as Paired Keypoints论文详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/311829

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input