论文阅读笔记 | 目标检测算法——CornerNet算法

简介: 论文阅读笔记 | 目标检测算法——CornerNet算法

paper:CornerNet: Detecting Objects as Paired Keypoints


内容重点:舍去了生成anchor的思想,取而代之的是使用了关键点检测。将对象边界框检测为一对关键点(左上角和右下角)。消除了生成anchor所带来的的正负样本不均的问题。同时介绍了一种新的池化层corner pooling,使得网络可以更好的定位到两个关键点。


1. Introdution


在One-step的目标检测网络中,通常会大量的使用anchor box,依次使得准确度能够媲美Two-steps检测网络。但是由于anchor box是由一些利用的不同的面积与比例预测对象框,这意味着需要在特征矩阵上进行密集的使用。然后再通过分类网络与回归网络细化坐标或者进行筛选。


但是使用anchor的概念会带来两个缺点:


1)需要生产非常多的anchor boxes。在DSSD中需要40k+,而在RetinaNet中需要100k+。这是因为检测器被训练来分类每个anchor box是否与ground truth充分重叠,并且需要大量的anchor box来确保与大多数ground truth充分重叠。因此,只有一小部分anchor box会与ground truth重叠;这造成了正负样本(positive and negative anchor boxes)之间的巨大不平衡,减缓了训练。


2)anchor boxes的使用会导致非常多的超参数与设计的选择。仅仅对于anchor boxes,就设计到多少的boxes,什么尺寸,什么比例。这些选择需要慢慢试探。而当与多尺度体系结构相结合的时候会变得更加的复杂,比如结合FPN结构。在网络中会有多个预测特征层,需要在每个预测特征层上进行单独预测。由于每层的预测特征层拥有不同的分辨率,所以需要分别生成各组的anchor boxes。


基于以上考虑,CornerNet中没有使用基于anchor的方法。而是通过获取图像的一堆关键点(目标的左上角与右下角)来进行目标检测。


创新点:

1)利用左上角与右下角这么一对关键点进行目标检测。关键点的获取通过一个卷积神经网络生成heatmap与embedding来获取,为了提高准确度额外生成一个offsets减少偏移损失。在下文会对headmap与embedding进行详细讲解。

2)使用了一种新的池化层称为:corner pooling。有助于卷积网络更好地定位边界框的角点。

3)使用了Hourglass作为特征提取网络


利用一对关键点进行目标检测比利用anchor进行检测更加有效的可能原因是:


1)anchor的中心依赖于检测对象的4条边界,而定位一个corner只需要检测对象的两条边界,所以corner比anchor更容易定位。而在针对corner检测的cornor pooling辅助下,corner的定位会更加的容易。因为corner pooling可以获取corner定义的一些先验知识。


2)使用corner能更高效地计算boxes的离散空间位置:使用corner只要O(wh)计算复杂度就能得到所有的可能anchor boxes,但是使用anchor boxes需要O(w2h2)的复杂度。


2. CornerNet


下面会分别对CornerNet的思路,创新点等方面进行讲解。


2.1 Overview

在CornerNet中,我们将对象检测为一对关键点——边界框的左上角和右下角。通过卷积网络预测生成两组heatmap去代表不同对象类别的角点位置。其中一组用于左上角点的预测,而另外一组用与右下角点的预测。


此外,为每个预测到的角点还会提供一个embedding vetor,当来自同一个目标对象的两个角点的两个embedding vetor应该是比较相识的。也就是这两个embedding vetor之间的距离是比较小的。

image.png

同时,为了让预测的边界框更加的准确,网络还预测了offset vector,来微调预测得到的corner。所以,通过网络预测heatmaps,embedding vetor与offset,再经过检测的后处理,得到最终的预测边界框。


完整的结构如图所示:

image.png

在CornerNet中,使用了hourglass network作为骨干网络,但是这里没有多层的预测特征层,也就没有不同比例的特征,所以直接在最后一层的输出特征图上进行后续处理。


在特征提取之后,会接两个预测模块,其中一个用于左上角点的预测,令一个模块用于右下角点的预测。对于每个单独的模块,经过角点池化模块之后,都有自己的预测heatmap,embedding vetor与offset矩阵。


每组hetmap都有C通道,其中C是类别数,大小为H ×W,注意这里没有背景类别。每个channel都是一个binary mask,表明一个类的位置所在处。


以上就是CornerNet的大致过程。


2.2 Detecting Corners

对于每一个角点,都有一个ground-truth positive的位置,而其他的位置都是negative。在训练过程中,不是同等地惩罚负位置,而是在正位置的一定半径范围内减少对负位置的惩罚。

image.png

image.png


Figure5是关于对不同负样本点的损失函数采取不同权重值的原因。红色实线框是ground truth;橘色圆圈是根据ground truth的左上角角点、右下角角点和设定的半径值画出来的,半径是根据圆圈内的角点组成的框和ground truth的IOU值大于0.7而设定的,圆圈内的点的数值是以圆心往外呈二维的高斯分布;白色虚线是一个预测框,可以看出这个预测框的两个角点和ground truth并不重合,但是该预测框基本框住了目标,因此是有用的预测框,所以要有一定权重的损失返回,这就是为什么要对不同负样本点的损失函数采取不同权重值的原因。

image.png

而且,对于一般的卷积神经网络为了提取全局的信息,一般会不断的进行下采样这样会导致输出的特征矩阵与输入的特征矩阵不一致,通常输出的特征矩阵会比输入的特征矩阵的尺度要小。

image.png

2.3 Grouping Corners

图像中可能出现多个对象,因此可能检测到多个左上角和右下角。我们需要确定一对左上角和右下角是否来自同一个边界框。


这里作者借鉴了Newell等人提出的用于多人姿态估计任务的关联嵌入方法的启发。Newell等人检测所有的人类关节,并为每个检测到的关节生成一个嵌入。他们根据嵌入物之间的距离对关节进行分组。


关联嵌入的思想也适用于目标检测任务。该网络预测每个检测到的角的嵌入向量(Embedding vector),使得如果左上角和右下角属于同一边界框,则它们的嵌入之间的距离应该比较小。然后,我们可以根据左上角和右下角的嵌入之间的距离来对角进行分组。Embedding的实际值并不重要。重要的是一对corners相似就行。


embedding损失包含两部分,etk表示第k个目标的左上角角点的embedding vector,ebk表示第k个目标的右下角角点的embedding vector,ek表示etk和ebk的均值。pull loss用来缩小属于同一个目标(第k个目标)的两个角点的embedding vector(etk和ebk)距离。push loss用来扩大不属于同一个目标的两个角点的embedding vector距离,令Δ=1。


embedding距离损失公式:

image.png

2.4 Corner Pooling

corner pooling layer来帮助更好的定位物体bounding box的对角。因为有时物体bounding box的两个对角处会没有信息。

image.png

这种情况下corner就很难通过局部特征进行定位。那么为了确定某个像素点是否有一个top-left corner,我们就需要从该点出发向其水平有方向去看看,以及向其垂直向下方向看看。那么这就是corner pooling layer要做的工作,它输入两个特征层,第一个特征层,在每个像素点做该点水平右边所有像素的最大池化得到该点的一个值,第二个特征层则对每个像素点做该点垂直下面所有像素的最大池化,最后将两个池化结果相加。如下图:

image.png

这一步可以用数学公式来表示,这是一个递归的公式:

image.png

image.png


从右到左做max求每个点值得到水平特征图,从下到上求每个点值得到垂直特征图,最后相加即可。


2.5 prediction module

该模块的第一部分是residual block的修改版本

image.png

最开始的结构讲到backbone之后连接两个prediction module,分别预测两个corner。这里详细介绍prediction module内部结构,以左上角corner(top-left corner)对应module为例。


backbone之接着两个3×3的卷积module(灰色的 3×3 Conv-BN-ReLU),这两个module各自输出1个feature map分别作为上文中提到的ft和fl传到Corner pooling做池化操作,然后pooling最后输出的结果再经过一个3×3 Conv-BN layer,然后再和shortcut相加后relu激活,激活结果紧跟一个卷积module,然后再跟着3个3×3 Conv-ReLU-Conv分支分别对应heatmaps, embeddings 和offset的预测。


2.6 Hourglass Network

Hourglass Network结构如下:

image.png

CornerNet采用 Hourglass Network做骨干网,Hourglass Network是一个全卷积网络,由一个或多个hourglass module组成。每个hourglass module首先通过卷积c层和max pooling layer下采样输入特征层,然后通过一系列的上采样操作和卷积层上采样回原resolution。但是max pooling layer会丢失很多细节,于是增加了skip layer来补上细节。这样Hourglass Network就能同时捕获全局和局部特征。


hourglass module结构示意图如下:

image.png

CornerNet采用了2个Hourglass组成的Hourglass Network,作者在使用Hourglass时做了一些小调整,包括:


  1. Hourglass在下采样时不再进行max-pooling,而是在卷积时通过stride=2进行下采样。下采样的卷积进行5次,输出feature maps的通道数分别为(256, 384, 384, 384, 512)


  1. 在每个skip connection,有两个residual modules。


  1. 图片进入Hourglass前,进行了2次下采样。使用一个kernel size=7*7,stride=2,channel=128的卷积和一个stride=2,channel=256的residual block,将width和height缩小为以前的1/4。


3. Experiments


3.1 Training Details

网络在PyTorch的默认设置下随机初始化,不需要对任何外部数据集进行预处理。在训练期间,作者将网络的输入分辨率设置为511 × 511,这导致输出分辨率为128 × 128。作者使用了多种数据增加来避免过拟合,而且在输入图片之前会使用PCA预处理。


总的损失函数公式:

image.png

3.2 Testing Details

0)使用simple post-processing算法从Heatmaps, Embeddings, Offsets生成边界框。

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

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

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

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


4. Result


  • backbone与corner的作用

image.png


  • corner pooling的作用

image.png


  • 有无heatmaps与offset的对比

image.png


  • 与其他SOTA算法对比

image.png

image.png


总结:

想法比较新颖,通过一对关键点来实现预测边界框,同时使用corner pooling来辅助预测关键点。


不过看完论文之后,感觉还有很多细节没有弄懂,只是了解了大概的处理过程,完全弄懂可能得看一下代码了。


参考资料:


https://blog.csdn.net/edward_zcl/article/details/100858681

https://blog.csdn.net/u014380165/article/details/83032273

https://blog.csdn.net/yanghao201607030101/article/details/110118751


目录
相关文章
|
17天前
|
人工智能 自然语言处理 算法
首届大模型顶会COLM 高分论文:偏好搜索算法PairS,让大模型进行文本评估更高效
【8月更文挑战第26天】在人工智能领域,尽管大型语言模型(LLMs)作为自动评估工具展现了巨大潜力,但在自然语言生成质量评估中仍存偏见问题,且难以确保一致性。为解决这一挑战,研究者开发了Pairwise-preference Search(PairS)算法,一种基于不确定性的搜索方法,通过成对比较及不确定性引导实现高效文本排名,有效减少了偏见、提升了评估效率和可解释性。PairS在多项任务中表现出色,相较于传统评分法有显著提升,为自然语言处理评估提供了新思路。更多详情参阅论文:https://arxiv.org/abs/2403.16950。
29 4
|
1月前
|
机器学习/深度学习 存储 算法
【博士每天一篇论文-算法】Continual Learning Through Synaptic Intelligence,SI算法
本文介绍了一种名为"Synaptic Intelligence"(SI)的持续学习方法,通过模拟生物神经网络的智能突触机制,解决了人工神经网络在学习新任务时的灾难性遗忘问题,并保持了计算效率。
27 1
【博士每天一篇论文-算法】Continual Learning Through Synaptic Intelligence,SI算法
|
28天前
|
机器学习/深度学习 监控 算法
目标检测算法技术
8月更文挑战第11天
|
1月前
|
数据采集 机器学习/深度学习 算法
【python】python客户信息审计风险决策树算法分类预测(源码+数据集+论文)【独一无二】
【python】python客户信息审计风险决策树算法分类预测(源码+数据集+论文)【独一无二】
|
1月前
|
机器学习/深度学习 监控 算法
目标检测算法
8月更文挑战第8天
|
1月前
|
机器学习/深度学习 算法 物联网
【博士每天一篇论文-算法】Overview of Echo State Networks using Different Reservoirs and Activation Functions
本文研究了在物联网网络中应用回声状态网络(ESN)进行交通预测的不同拓扑结构,通过与SARIMA、CNN和LSTM等传统算法的比较,发现特定配置的ESN在数据速率和数据包速率预测方面表现更佳,证明了ESN在网络流量预测中的有效性。
18 4
|
1月前
|
机器学习/深度学习 存储 算法
【博士每天一篇论文-算法】Optimal modularity and memory capacity of neural reservoirs
本文研究了神经网络的模块化与记忆性能之间的关系,发现存在一个最佳模块化程度,能够在局部凝聚性和全局连接性之间实现平衡,从而显著提高神经网络的预测性能和记忆能力,并为设计神经网络和理解大脑的模块化组织提供了新的见解。
15 0
【博士每天一篇论文-算法】Optimal modularity and memory capacity of neural reservoirs
|
1月前
|
算法 Python
【python】python基于 Q-learning 算法的迷宫游戏(源码+论文)【独一无二】
【python】python基于 Q-learning 算法的迷宫游戏(源码+论文)【独一无二】
|
6天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
6天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。