作者:晟 沚            

        

前言

目前目标检测方法中深度方法主要分为one-stage(e.g. SSD, YOLO)和two-stage(e.g. RCNN系列)两种。one-stage直接在图片上经过计算生成detections。two-stage先提取proposal, 再基于proposal做二次修正。相对来说one-stage速度快, 精度低,而two-stage精度高, 速度慢。

从RCNN、SPPNet到fast RCNN,再到Faster RCNN,目标检测的三个步骤(区域选择,特征提取,分类回归)被统一到一个深度网络框架之内,大大提高了运行速度。FCN,FPN, RoI Align, Mask Branch等技术把Faster R-CNN往前极大的推进。之后又出现了FCN, IoU, NMS,ION,FPN, RoI Align和Mask Branch等技术渊源和YOLO, SSD, AttratioNet, G-CNN, R-FCN, Mask R-CNN等的进化关系!

01

背景介绍

目前的检测算法主要思路还是设置大量anchor+分配正负样本+训练的一个思路,Anchor的本质是目标的候选框,因为目标的形状和位置的多种可能性,Anchor的数量往往非常庞大,否则会出现遗漏的情况,这种情况对于one-stage的检测算法更加影响更加突出。

总的来说,Anchor有两个缺点:

1)提取的anchor boxes数量较多,只有一小部分和ground truth重合,生成了大量的负例,造成正负样本不平衡,降低了训练效率。

2)anchor boxes需要调整很多超参数,比如anchor boxes数量,大小,长宽比,影响模型的训练和推断速率

这篇文章的思路其实来源于一篇多人姿态估计的论文,主要是Bottom-Up framework,就是先对整个图片进行每个人体关键点部件的检测,再将检测到的人体部位拼接成每个人的姿态。

02

方法简述

这篇论文首先同时预测定位框的顶点对(左上角和右下角)热点图和embedding vector,再根据embedding vector对顶点进行分组。顶点的定位主要是用corner pooling。自然界的大部分目标是没有边界框也不会有矩形的顶点,依top-left corner pooling 为例,对每个channel,分别提取特征图的水平和垂直方向的最大值,然后求和,如下图所示。之所以有效原因,是因为目标定位框的中心难以确定,和边界框的4条边相关,但是每个顶点只与边界框的两条边相关,所以corner 更容易提取。再者顶点更有效提供离散的边界空间,实用O(wh)顶点可以表示O(w2h2) anchor boxes。同时论文提出的网络基于hourglass架构,使用focal loss的变体训练神经网络。

anchor free的目标检测方法--CornerNet

03

模型框架

论文提出的网络结构主要是由Hourglass Network,Bottom-right corners&Top-left Corners Heatmaps和Prediction Module三部分组成,如下图所示。堆叠两个Hourglass Network生成Top-left和Bottom-right corners,每一个corners都包括corners Pooling,以及对应的Heatmaps, Embeddings vector和offsets。embedding vector使相同目标的两个顶点(左上角和右下角)距离最短, offsets用于调整生成更加紧密的边界定位框。

anchor free的目标检测方法--CornerNet

角点检测部分

Prediction module生成的heatmaps包含C channels(C是目标的类别,没有background channel),每个channel是二进制掩膜,表示相应类别的顶点位置。

在每个ground-truth顶点设定半径r区域内都是正样本,这是因为落在半径r区域内的顶点依然可以生成有效的边界定位框,论文中设置IoU=0.7

pcij表示类别为c,坐标是(i,j)的预测热点图,ycij表示相应位置的ground-truth,论文提出变体Focal loss表示检测目标的损失函数:

anchor free的目标检测方法--CornerNet

网络下采样后模型生成的热点图相比输入图像分辨率低。因此作者提出偏移的损失函数,用于微调corner和ground-truth偏移。offset是表示在取整计算时丢失的精度信息,也就是以下公式所表达的内容。

anchor free的目标检测方法--CornerNet

Focus loss

负样本数量太大,占总的loss的大部分,而且多是容易分类的, 针对类别不均衡问题提出的一种新的损失函数:focal loss,主要有以下特点

  • 在标准交叉熵损失基础上修改得到的, 

  • 通过减少易分类样本的权重,使得模型在训练时更专注于难分类的样本

  • 当一个样本被分错的时候,pt是很小的,那么调制因子(1-Pt)接近1,损失不被影响;当Pt→1,因子(1-Pt)接近0,那么分的比较好的(well-classified)样本的权值就被调低了

  • 设定a的值来控制正负样本对总的loss的共享权重。a取比较小的值来降低负样本(多的那类样本)的权重。

角点配对

输入图像会有多个目标,相应生成多个目标的左上角和右下角顶点。对顶点进行分组,论文模型在训练阶段为每个corner预测相应的embedding vector,通过embedding vector使同一目标的顶点对距离最短,既模型可以通过embedding vector为每个顶点分组。具体如下公式:

anchor free的目标检测方法--CornerNet

anchor free的目标检测方法--CornerNet

其中Lpull损失函数使同一目标的顶点进行分组, Lpush损失函数用于分离不同目标的顶点。

Corner pooling

以Top-left为例,提出的一种新的池化方式。如下图所示,对于第1组feature maps,对每行feature scores按从右向左的顺序选择已滑动过范围的最大值,对于第2组feature maps,对每列feature scores按从下向上的顺序选择已滑动过范围的最大值。 为了更好地适应corner的检测。在目标检测的任务中,object的corner往往在object之外,所以corner的检测不能根据局部的特征,而是应该对该点所在行的所有特征与列的所有特征进行扫描。如果我们能在某行和某列检测到同一个object的边界特征,那么这行和这列的交点就是corner,这是一种间接且有效的找corner的方法。左上角角点的右边有目标顶端的特征信息,左上角角点的下边有目标左侧的特征信息。池化时不能直接对整行或整列进行max pooling,当一张图上有多个目标时,这样会导致误检。

anchor free的目标检测方法--CornerNet

 anchor free的目标检测方法--CornerNet

END

往期回顾之作者刘才权

【1】目标检测新技能!引入知识图谱:Reasoning-RCNN

【2】  MaskConnect: 探究网络结构搜索中的Module间更好的连接

【3】  tensorboard 指南

【4】  network sliming:加快模型速度同时不损失精度

机器学习算法工程师


                            一个用心的公众号

anchor free的目标检测方法--CornerNet

长按,识别,加关注

进群,学习,得帮助

你的关注,我们的热度,

我们一定给你学习最大的帮助