论文阅读笔记 | 目标检测算法——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


目录
打赏
0
0
0
0
21
分享
相关文章
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
本研究基于MATLAB 2022a,使用GRU网络对QAM调制信号进行检测。QAM是一种高效调制技术,广泛应用于现代通信系统。传统方法在复杂环境下性能下降,而GRU通过门控机制有效提取时间序列特征,实现16QAM、32QAM、64QAM、128QAM的准确检测。仿真结果显示,GRU在低SNR下表现优异,且训练速度快,参数少。核心程序包括模型预测、误检率和漏检率计算,并绘制准确率图。
93 65
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
基于MobileNet深度学习网络的活体人脸识别检测算法matlab仿真
本内容主要介绍一种基于MobileNet深度学习网络的活体人脸识别检测技术及MQAM调制类型识别方法。完整程序运行效果无水印,需使用Matlab2022a版本。核心代码包含详细中文注释与操作视频。理论概述中提到,传统人脸识别易受非活体攻击影响,而MobileNet通过轻量化的深度可分离卷积结构,在保证准确性的同时提升检测效率。活体人脸与非活体在纹理和光照上存在显著差异,MobileNet可有效提取人脸高级特征,为无线通信领域提供先进的调制类型识别方案。
基于深度学习的路面裂缝检测算法matlab仿真
本项目基于YOLOv2算法实现高效的路面裂缝检测,使用Matlab 2022a开发。完整程序运行效果无水印,核心代码配有详细中文注释及操作视频。通过深度学习技术,将目标检测转化为回归问题,直接预测裂缝位置和类别,大幅提升检测效率与准确性。适用于实时检测任务,确保道路安全维护。 简介涵盖了算法理论、数据集准备、网络训练及检测过程,采用Darknet-19卷积神经网络结构,结合随机梯度下降算法进行训练。
基于yolov2和googlenet网络的疲劳驾驶检测算法matlab仿真
本内容展示了基于深度学习的疲劳驾驶检测算法,包括算法运行效果预览(无水印)、Matlab 2022a 软件版本说明、部分核心程序(完整版含中文注释与操作视频)。理论部分详细阐述了疲劳检测原理,通过对比疲劳与正常状态下的特征差异,结合深度学习模型提取驾驶员面部特征变化。具体流程包括数据收集、预处理、模型训练与评估,使用数学公式描述损失函数和推理过程。课题基于 YOLOv2 和 GoogleNet,先用 YOLOv2 定位驾驶员面部区域,再由 GoogleNet 分析特征判断疲劳状态,提供高准确率与鲁棒性的检测方法。
调研180多篇论文,这篇综述终于把大模型做算法设计理清了
《A Systematic Survey on Large Language Models for Algorithm Design》综述了过去三年大型语言模型(LLMs)在算法设计中的应用。LLMs通过自然语言处理技术,助力生成、优化和验证算法,在优化、机器学习、数学推理等领域展现出广泛应用前景。尽管存在资源需求高、结果不确定等挑战,LLMs仍为算法设计带来新机遇。论文地址:https://arxiv.org/abs/2410.14716。
128 14
基于反光衣和检测算法的应用探索
本文探讨了利用机器学习和计算机视觉技术进行反光衣检测的方法,涵盖图像预处理、目标检测与分类、特征提取等关键技术。通过YOLOv5等模型的训练与优化,展示了实现高效反光衣识别的完整流程,旨在提升智能检测系统的性能,应用于交通安全、工地监控等领域。
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
基于GA-PSO-SVM算法的混沌背景下微弱信号检测matlab仿真
本项目基于MATLAB 2022a,展示了SVM、PSO、GA-PSO-SVM在混沌背景下微弱信号检测中的性能对比。核心程序包含详细中文注释和操作步骤视频。GA-PSO-SVM算法通过遗传算法和粒子群优化算法优化SVM参数,提高信号检测的准确性和鲁棒性,尤其适用于低信噪比环境。
|
4月前
|
TDengine 检测数据最佳压缩算法工具,助你一键找出最优压缩方案
在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。
107 0

热门文章

最新文章