resnet,retinanet,fpn网络结构及pytorch实现代码

关于resnet,其巧妙地利用了shortcut连接,解决了深度网络中模型退化的问题。网络结构如下

resnet,retinanet,fpn网络结构及pytorch实现代码_第1张图片

FPN的目的

熟悉faster rcnn的人都知道,faster rcnn利用的是vgg的最后卷积特征,大小是7*7*512.而这造成了一个问题,经过多次卷积之后的特征通常拥有很大的感受野,它们比较适合用来检测大物体,或者说,它们在检测小物体任务上效果很差,所以像ssd和fpn这样的网络思想就是将前面和后面的卷积层都拿出来,组成一个multiscale 结果,既能检测大物体,也能检测小物体。

基于这个思想,fpn从resnet 34层模型构造了一组新的特征,p2,p3,p4,p5,每一个p_i都是resnet中不同卷积层融合的结果,这保证了他们拥有多尺度信息,他们拥有相同的维度,都是256。

resnet,retinanet,fpn网络结构及pytorch实现代码_第2张图片

bottom-up就是简单的使用了ResNet34,主要是top-down中的思想。
在上文中我们提到c2-c5的大小和维度分别是56x56x64,28x28x128,14x14x256,7x7x512,所以在top-down中,先用了一个1x1x256的卷积将c5:7x7x512 变成了m5:7x7x256, 每一个m之后都接了一个3x3x256卷积用来消除不同层之间的混叠效果,其实也就是缓冲作用。
关于p4的构造

我们先将m5通过上采样方法将其feature map加倍,用简单的nearest neighbour upsamping方法就行,这样m5就变成了m5’:14x14x256,同时c4:14x14x256经过1x1x256得到c4’:14x14x256, 将m5’+c4’, element-wisely,就可以得到m4:14x14x256。

所以最后的p2-p5大小分别是
56x56x256。,28x28x256,14x14x256,7x7x256。

在理解了fpn的基本操作之后,我们来看看RetineNet里面,多层次特征是怎么得到的。

首先,retinanet中使用的是resnet50,上面的图片已经给出了resnet50的结构了,其与resnet34大同小异,如何用c2-c5构造p_i是retinanet的一个特点。特别地,在retinanet中新增了p6和p7,原文解释假如p6和p7就是为了让模型更好地检测大物体,因为感受野大,而不用p2的原因是p2的feature map太大导致计算量太大。

所以如果想检测小物体,理论上有两种方法,一种是加入p2然后去掉p6和p7,但是这个代价是引入了128*128的feature map,这样在p2这一层生成的anchor数目是128*128*9=147456,有点过错了,算起来很慢的。另一种方法就是在设置anchor的base size和ratios还有scales让anchor尽量小一点。

 

 

你可能感兴趣的:(resnet,retinanet,fpn网络结构及pytorch实现代码)