您的位置:首页 > 移动开发 > Objective-C

论文学习:《CornerNet:Detecting Objects as Paired Keypoints》

2019-09-03 21:14 1236 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_42214565/article/details/100524611

由于项目需要,需要对图像提取一些特征点进行处理,所以找到了比较有名的基于特征点的网络模型Cornernet的论文进行学习。本文记录了一些个人在学习过程中的理解,可能会有疏漏和不当之处,欢迎指正。

论文地址:https://arxiv.org/abs/1808.01244

算法源码:https://github.com/ princeton-vl/CornerNet

1. CornerNet网络的核心思想与主要贡献

在这片论文之前,广泛研究的目标检测算法主要可以分为One-Stage detectors和Two-Stage detectors,这两类方法的共同之处在于网络对图像中的特征进行提取,以检测框(bounding box)的形式给出,然而bounding box的特征与图像特征本身并没有关系,这就一定程度上造成了定位误差,大多数算法是通过对bounding box进行后续修正(如NMS或尺寸微调等)减少误差,只能一定程度上提高性能,并不能从根本上解决问题。

本文算法摈弃了anchor box的思想,将boundingbox描述为一对特征点,即bounding box左上角的点(top-left corner)和右下角的点(bottom-right corner),在此基础上构造了一组卷积神经网络实现目标检测。

根据摘要描述,本文的主要创新之处在于:

1. 提出了基于特征点的Bounding box训练模式,即上文说的将bounding box描述为top-left corner和bottom-right corner对特征进行预测;

2. 根据任务需求,提出了一种新型池化层:corner pooling,有助于更精确的定位角点(corners)。

2. 论文框架

2.1 第一节 提出问题和解决方案

文章第一节首先介绍了目前的目标检测方法并基于检测步骤把他们分为了Two-stage detectors和One-stage detectors:

Two-stage detectors以R-CNN系列算法为代表,先对图像进行检测生成一组可能存在目标的区域RoIs(在Fast R-CNN之后引入了Region Proposals)但是他们共同的问题在于:依赖独立的RoIs提取算法(或者说RPN),检测效率不如One-stage detectors,基于RoIs的算法无法实现端到端训练。

One-stage detectors以SSD和YOLO系列算法为代表,将锚定框(Anchor box)以某种方式密集地分布在整张图片上,通过对Anchor box进行置信度评估以及回归任务来修正他们的坐标,来生成最终预测的Bounding box。但是One-stage detectors有两个缺陷:1. 这种方法通常需要非常多的anchor box来保证待选区域能和Ground truth重叠,最终计算结果缺只有很少的一部分anchor box被保留下来,拉慢了训练速度(难怪YOLO一算算一星期 - -||);2. anchor box引入了大量的超参数设计选择(design choices),在多尺度特征提取的过程中,单个网络对多个分辨率特征图做出独立的预测,每个尺度都用不同的特征和anchor box,算法复杂度较高。

此外还有一个问题就是前文提到的这些算法的bounding box的特征与图像特征本身并没有关系,仅仅对尺寸和位置进行修正和回归,这就一定程度上造成了定位误差(YOLO论文也说了主要误差来源就是Localization error)

在Newell等人工作的启发下,作者不采用anchor box的方式,提出了一种新的单阶段目标检测方法CornerNet。CornerNet的优越性在于:

1. 普通算法采取基于特征中心定位的bounding box难以定位,因为它取决于目标的四个方向的边缘情况,而角点定位仅取决于两个边,因此更容易定位,算法题出的Corner pooling更有助于定位Corners,因为它是基于一些明确的关于corner的先验知识来进行的。 
2. corner提供了一种更有效的方式来聚集离散的boxes集:我们只需要数量级为O(wh)的Corner来代表可能性为O(w^2*h^2)数量级的anchor boxers。

另外文章还强调了他们所提出的Corner pooling对CornerNet的性能至关重要

2.2 第二节 相关工作

这一章节简要介绍了前文提到的Two-stage detectors和One-stage detectors的各类算法,并且介绍了作者的灵感来源。

作者基于以上人们的工作经验,再次简述了本文的主要工作:利用embeddings来检测和分组corners的任务;用corner pooling 层更好地定位corners;并且借鉴了沙漏网络结构,并进行了重大修改,增加了focal loss的新变种用以更好地训练网络。

2.3 第三节CornerNet网络结构的设计

注:三级子标题是便于我自己理解的思路,不是文章的分章结构

2.3.1 网络结构

网络的输入为512*512的RGB图像,输出为带有bounding box的图像,且没有误差的情况下Bounding box与目标的轮廓是相切的。网络总体结构如下图:

图像输入一个7*7卷积层将尺寸缩小为原来的四分之一(128*128),然后经过两个沙漏网络模块(Hourglass Network)提取特征,输出的尺寸和输入尺寸一样(128*128),输出到两个预测模块,分别预测Top-left corner和Bottom-right corner得到预测结果。预测模块由Corner Pooling层和三个输出层:Heatmaps、Embeddings以及Offsets构成。关于每个模块的介绍,有一篇文章进行了比较好理解的介绍:https://zhuanlan.zhihu.com/p/53407590 下面我自己再总结一遍。

Hourglass Networks

沙漏网络模型首先提出于一个人脸关键点检测的框架,论文详见:《Stacked Hourglass Network for Robust Facial Landmark Localisation》,借用上文链接里的图描述:

我的理解是,hourglass network是一个集成的残差网络,先通过若干次卷积层和最大池化,逐层将图像的分辨率变低,提取出各个尺度上的特征,然后再通过相同次上采样层(最邻近插值),把图像恢复成之前的采样率,为了上采样过程中损失过多特征,又引入残差网络,将上采样的特征图和之前层相同尺度的图像相加。完成一次Hourglass Network。对于hourglass network最终如何输出的描述引用一下一位大佬的描述:当到达输出分辨率的时候,再接两个1×1的卷积层来进行最后的预测,网络的输出是一组heatmap,对于给定的heatmap,网络预测在每个像素处存在关节的概率。(关于hourglass network的具体实现不是本文的重点和创新之处,所以没有详细说明,但是在源码中有所体现)更多关于hourglass network的描述推荐这位大佬的文章:https://zhuanlan.zhihu.com/p/45002720

corner pooling

文章指出,当将heatmaps中的位置重新映射到输入图像时,可能会丢失一些精度(下采样导致的,前文有描述),这将极大地影响ground truth和bounding box的IoU。为了解决这个问题,我们预测位置的偏移量(location offset)来稍微调整corner位置,然后再将它们重新映射到输入分辨率.corner pooling的描述如下

特征图的宽和高分别为W、H,如上图所示,如果对Top-left corner(i, j)进行corner pooling,就分别寻找从(H, j)到(i, j)、(i, W)到(i, j)中的最大值,并保持最大值累加到左上角的角点。用图像来描述就是:

我的输入特征图中的目标特征值会较大(当然输入corner pooling层的时候图像不可能像上图一样清晰并好理解了,知识做个示范,假设目标特征就是这个人本身),要预测的Top-left corner就是左上角的红点(i, j),pooling就从(i, W)开始往左寻找特征值最大的点,当后一个特征值比前一个特征值大,那么之后的特征值较小的点全部最大化成当前最大的值,由于经过了最大值(帽子的最上端),帽子往左的点都会编程帽子最上端那一点的值。从(H, j)往上搜索同理。分别搜索完之后,在(i, j)处累加最大值。对Bottom-right corner的pooling同理。

这样做的好处就是,我们一开始说了,bounding box和提取的特征实际上是没什么联系的,只是单纯地做了回归得出地结果,同样的,我们打出的corner原本也和目标特征是没什么联系的,真正决定检测效果的是目标特征本身通过corner pool的方式将人物上的信息,转移到了corner上,这就是CornerNet的预测点更加准确的精髓所在。

上图是文中给出的Prediction Module更详细的结构图,可以看出,corner pooling层的虚线部分执行了上文中对角点预测的步骤,然后再汇聚到一起进行一次3*3卷积,在pooling之前分出一支信息流经过1*1的Conv-BN层,将上述两部分以残差网络的形式输出并激活,进入后续的输出层。

Heatmaps

Heatmaps是CornerNet的第一个输出,它主要预测角点的位置,输出向量的维度为C * H * W,其中C为目标类别数(Channel)。Heatmaps不对背景进行判定(原文的话是没有background channel,不知道这么理解是否准确),Heatmaps每个channel都是一个二进制掩码(binary mask),用于指示一个类别corners的位置.Heatmap部分的损失函数定义为:

其中,C是类别数(channel);(i, j)是预测的heatmap(或者说corner)的坐标;N是图像中的目标数量,1/N用于对损失值进行归一化;α和β是超参数,α用来控制难易分类样本的损失权重,值取2,β用于给评定举例ground truth距离远近的部分(1-y_cij)进行加权,取值4;y_cij表示了对应位置的ground truth,本质上是一个非标准化的2D高斯模型,作者通过确保半径内的一对点生成的边界框与ground-truth的IoU ≥ t(我们在所有实验中将t设置为0.7)来确定物体的大小,从而确定半径,y_cij公式表示为:

其中,σ是半径的1/3。

y_cij得定义从公式上不太好理解,但是在另一篇有着相似设计的论文《Object as points》里一张图中,可以得到一个感性的认识:作者给角点的ground truth定义了一个区间,在区间内越靠近真正的角点的像素点,误差越小,这个误差的分布满足高斯分布,即预测corner越靠近ground truth,y_cij越接近1。

上图来源以及对该文章的解读:https://blog.csdn.net/baobei0112/article/details/94392343

Offset

作者在分析下采样造成的影响时提出了一个问题:当我们将Heatmap中的位置重新映射到输入图像时,可能会丢失一些精度。这将极大地影响ground truth和bounding box的IoU。为了解决这个问题,CornerNet预测位置偏移来稍微调整corner位置,然后再将它们重新映射到输入分辨率。完成这个任务的模块就是Offset。

Offset的修正值定义公式如下:

Ok就是Offset,xk, yk就是角点(corner)k的坐标值,n是下采样造成的尺度变化比,xk/n-|_xk/n_|就是下采样造成的损失值(下采样过程中介于两个像素之间的亚像素点以向下取整的形式进行“定位”)。从公式也可以看出,Offset的输出值为一系列二维的修正参数,有多少个corner,就有多少个Ok

之后通过一个smooth L1损失函数来监督学习这个修复参数,损失函数如下:

Embedding

Embedding对应文章3.3 Grouping corner章节的内容,在前文叙述的模块中,corner的预测都是独立的,然而实际情况是一个目标对应两个顶点,这就出现一个问题:如何找到一个目标对应的一组Top-left corner和Bottm-right corner?基于这个目的设计了Embedding输出层。

Embedding的输入是一个已经预测好所有Top-left corner和Bottm-right corner的特征图,并且可以知道哪些点是属于Top-left corner哪些点属于Bottm-right corner。embedding的任务主要由两个损失函数实现,Pull loss和Push loss。直观理解上,同一个目标的Top-left corner与Bottom-right corner应该尽可能地小,所以定义了Pull loss减小同类角点的距离,push loss增大不同组角点的距离,使得角点可以进行有效的匹配,公式如下:

etk表示类别k目标的左上角角点的embedding vector,ebk则表示其右下角角点的embedding vector,ek是他们的均值。Embedding通过计算找出使得损失函数最小一对对点,为对应角点配对。

网络损失函数

整个网络的损失函数就是上述三个输出层的损失函数加权和的形式:

其中,α=β=0.1,γ=1.

2.4 第四节 实验数据和算法比较

第四节详细展示了模型训练和测试过程中的一些细节,大概总结一下文章给出的一些结论:

1. corner pooling在检测不同图像象限的corners时,能不断提高网络性能,表明corner pooling在小区域和大区域都是有效和稳定的;

2. hourglass net网络对CornerNet的性能很重要;

3. 与其它检测器相比,CornerNet在高IoU情况下表现更好;

4. 误差分析时,用ground truth值替换预测的heatmap和offset。仅使用ground truth的heatmap就可以将AP从38.4%提高到73.1%,这表明CornerNet的主要瓶颈是检测corners

5. Cornernet的计算速度:Titan X(PASCAL)GPU上每张图像的平均预测时间为244毫秒

3. 个人感想

这种基于关键点的检测模型使得图像目标检测的神经网络有了更加广泛的应用价值,很多情况下需要基于特征点的目标识别,就有了应用切入点。值得吐槽的是,文章在描述测试细节的时候在corner heatmaps上用了一个3*3的最大池化进行NMS,这算不算“步了One-stage detectors的后尘”抛开了特征对检测框进行修正。。。。个人基于有限的认值认为,如果要进行更精确的关键点定位操作,就需要尽可能摈弃类似NMS这样的基于重叠面积来修正检测框的办法(不负责任猜想);并且如果按照corner pooling这样的训练模式,岂不是在构建训练集的时候就让每一个特征的ground truth的边缘和目标边缘相切,想想就觉得好累啊orz

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: