深度学习(三十六)——R-FCN, FPN, RetinaNet, CornerNet
R-FCN
R-FCN是何恺明/孙剑小组的Jifeng Dai于2016年提出的。
论文:
《R-FCN: Object Detection via Region-based Fully Convolutional Networks》
代码:
https://github.com/PureDiors/pytorch_RFCN
faster R-CNN对卷积层做了共享(RPN和Fast R-CNN),但是经过RoI pooling后,却没有共享,如果一副图片有500个region proposal,那么就得分别进行500次卷积,这样就太浪费时间了,于是作者猜想,能不能把RoI后面的几层建立共享卷积,只对一个feature map进行一次卷积?
上图是R-FCN的网络结构图。和上一节的Faster R-CNN相比,我们可以看出如下区别:
1.Faster R-CNN是特征提取之后,先做ROI pooling,然后再经过若干层网络,最后分类+bbox。
2.R-FCN是特征提取之后,先经过若干层网络,然后再做ROI pooling,最后分类+bbox。
FC layer在近来的CV实践中,越来越不受欢迎,因此R-FCN在最后的分类+bbox阶段,也做了一些针对性的改进(如上图所示):
1.直接将roi pooling生成的feature map连接到最后的分类和回归层效果很差。这主要是因为:基CNN本身是对图像分类设计的,具有图像移动不敏感性;而对象检测领域却是图像移动敏感的,所以二者之间产生了矛盾。
2.因此R-FCN专门设计了一个position-sensitive score maps。在feature map上通过卷积运算生成一个等大但通道数为的feature map X。
3.对这个feature map进行特殊的ROI pooling。
标准的ROI pooling:将ROI在空间上分成kxk部分,对每个部分进行pooling操作。
R-FCN的ROI pooling:将ROI在通道上分成kxk部分,对每个部分进行pooling操作,得到一个尺寸为kxkx(C+1)的tensor。上图中各种颜色部分之间的对应关系,展示了该ROI pooling操作的实现方式。
从中可以看出,feature map X不仅在空间维度上对位置敏感,在通道维度上也对位置敏感。因此也被称作position-sensitive score maps。
4.对上一步结果的每个C+1部分进行分类,这样可以得到kxk个分类结果。对所有的分类结果进行vote,得到最终结果。
从上面两图可以看出,vote的规则就是简单多数,因此k需要是奇数才行。
5.bbox也是类似的操作,只需将上面的C+1换成4(bbox位置的坐标)即可。
参考:
http://blog.****.net/zijin0802034/article/details/53411041
R-FCN: Object Detection via Region-based Fully Convolutional Networks
https://blog.****.net/App_12062011/article/details/79737363
R-FCN
https://mp.weixin.qq.com/s/HPzQST8cq5lBhU3wnz7-cg
R-FCN每秒30帧实时检测3000类物体,马里兰大学Larry Davis组最新目标检测工作
https://mp.weixin.qq.com/s/AddHG_I00uaDov0le4vdvA
R-FCN和FPN
FPN
FPN(Feature Pyramid Network)是Tsung-Yi Lin(Ross Girshick和何恺明小组成员)的作品(2016.12)。
论文:
《Feature Pyramid Networks for Object Detection》
-
图(a)为手工设计特征描述子(Sift,HoG,Harr,Gabor)时代的常见模型,即对不同尺寸的图片提取特征,以满足不同尺度目标的检测要求,提高模型性能;
-
图(b)则是深度卷积网的基本结构,通过不断的卷积抽取特征同时逐渐增加感受野,最后进行预测;
-
图(c)则是融合深度网络的特征金字塔模型,众所周知深度网在经过每一次卷积后均会获得不同尺度的feature map,其天然就具有金字塔结构。但是由于网络的不断加深其图像分别率将不断下降,感受野将不断扩大,同时表征的特征也更叫抽象,其语义信息将更加丰富。SSD则采用图c结构,即不同层预测不同物体,让top层预测分辨率较高,尺寸较大的目标,bottom则预测尺寸较小的目标。然而对于小目标的检测虽然其分辨率提高了但是其语义化程度不够,因此其检测效果依旧不好。
-
图(d)则是FPN的网络结构,该网络结构大体上分为三个部分,即buttom-up自底向上的特征抽取,自顶向下的upsampling,以及侧边融合通道(lateral coonnection)。通过这三个结构网络的每一层均会具有较强的语义信息,且能很好的满足速度和内存的要求。
上图是加了FPN之后的ResNet,其中的虚线框表示的是通道融合的方法。U-Net采用了concat模式融合下采样和上采样通道,而这里则是沿用了ResNet的融合方法:Tensor Add。
上图是Faster R-CNN+FPN。原始的Faster R-CNN的RoI pooling是从同一个feature map中获得ROI,而这里是根据目标尺度大小,从不同尺度的feature map中获得ROI。
参考:
https://mp.weixin.qq.com/s/mY_QHvKmJ0IH_Rpp2ic1ig
目标检测FPN
https://mp.weixin.qq.com/s/TelGG-uVQyxwQjiDGE1pqA
特征金字塔网络FPN
https://zhuanlan.zhihu.com/p/58603276
FPN-目标检测
RetinaNet
RetinaNet也是Tsung-Yi Lin的作品(2017.8)。
论文:
《Focal Loss for Dense Object Detection》
我们已经指出“类别不平衡”是导致One-stage模型精度不高的原因。那么如何解决这个问题呢?
答案是:Focal Loss。
上图是RetinaNet的网络结构图,可以看出它是一个One-stage模型。基本相当于:ResNet+FPN+Focal loss。
参考:
https://blog.****.net/jningwei/article/details/80038594
论文阅读: RetinaNet
https://zhuanlan.zhihu.com/p/68786098
再谈RetinaNet
CornerNet
传统的目标检测网络,无论是One-stage还是Two-stage,都有基于Anchor的。Anchor的作用主要在于:显式枚举出不同的scale和aspect ratio的基准bbox。
但就本质而言,**框对于物体来说不是一个最好的表示。**框的顶点可能甚至都不在物体上,离物体本身已经很远了。
因此,自2018年以来,逐渐有一些不基于anchor的目标检测方法出现,形成了一股Anchor-Free的热潮。下面将首先介绍一下,该类方法的开山之作——CornerNet。
CornerNet并非第一个提出Anchor-Free思想的模型,但却是第一个精度和性能达到与anchor base方法同等水平的Anchor-Free模型。
CornerNet是Princeton University的Hei Law的作品。(2018.8)
论文:
《CornerNet: Detecting Objects as Paired Keypoints》
CornerNet认为Two-stage目标检测最明显的缺点是在Region Proposal阶段需要提取anchor boxes。这样做导致两个问题:
-
提取的anchor boxes数量较多,比如DSSD使用40k,RetinaNet使用100k,anchor boxes众多造成正负样本不均衡。
-
Anchor boxes需要调整很多超参数,比如anchor boxes数量、尺寸、比率,影响模型的训练和推断速率。
上图是CornerNet的网络结构。可以看出它主要由两部分组成:
Hourglass Network
这是CornerNet的骨干部分。
Bottom-right corners & Top-left Corners Prediction Module
CornerNet堆叠两个Hourglass Network生成Top-left和Bottom-right corners,每一个corners都包括corners Pooling,以及对应的Heatmaps, Embeddings vector和offsets。
上图是Heatmaps, Embeddings vector的示意图。
-
heatmaps包含C channels(C是目标的类别,没有background channel),每个channel是二进制掩膜,表示相应类别的顶点位置。
-
embedding vector使相同目标的两个顶点(左上角和右下角)距离最短。或者也可以反过来说,两个顶点的embedding vector越相近,则它们越有可能配对。
-
offsets用于调整生成更加紧密的边界定位框。
corner pooling
corner pooling是CornerNet新提出的一种操作。其步骤如下图所示:
依top-left corner pooling为例,对每个channel,分别提取特征图的水平和垂直方向的最大值,然后求和。具体的计算如下图所示:
论文认为corner pooling之所以有效,是因为:
-
目标定位框的中心难以确定,和边界框的4条边相关,但是每个顶点只与边界框的两条边相关,所以corner更容易提取。
-
顶点更有效提供离散的边界空间,使用顶点可以表示个anchor boxes。
参考
https://mp.weixin.qq.com/s/e74-zFcMZzn67KaFXb_fdQ
CornerNet目标检测开启预测“边界框”到预测“点对”的新思路
https://zhuanlan.zhihu.com/p/41865617
CornerNet:目标检测算法新思路
https://mp.weixin.qq.com/s/e6B22xpue_xZwrXmIlZodw
ECCV-2018最佼佼者CornerNet的目标检测算法
https://mp.weixin.qq.com/s/9ldLaYKGkgq-MnJZw7CrDQ
CornerNet为什么有别于其他目标检测领域的主流算法?
https://mp.weixin.qq.com/s/ZhfnZ4IwOnTQlqeB6Ilr3A
CornerNet: Detecting Objects as Paired Keypoints解读
https://zhuanlan.zhihu.com/p/63134919
普林斯顿大学提出:CornerNet-Lite,基于关键点的目标检测算法,已开源!
https://mp.weixin.qq.com/s/8hN1RdYVJQWOqPpejjfXeQ
CornerNet