第三十章 FPN算法及其变种(车道线感知)

目标检测算法:FPN

论文基本信息

  • 标题:Feature Pyramid Networks for Object Detection
  • 链接:https://arxiv.org/abs/1612.03144
  • 代码:https://paperswithcode.com/paper/feature-pyramid-networks-for-object-detection

已有方法

feature pyramid是用来检测不同scale的object的1种基本方法。

如图1和图2所示,基于feature pyrimid来检测不同scale的object,共有5种思路:4种已有思路(分别缩写为ABCD)和本文思路(FPN)

img

img

img

问题

feature pyramid是用来检测不同scale的object的1种基本方法,但最近的deep learning detector(RCNN、SPPNet、Fast RCNN、Faster RCNN)却都没有使用pyramid representation(在多个尺度不同的feature map上进行检测),其中部分原因是它们计算量大、需要大量memory

方法/研究内容

FPN:基于CNN固有的pyramid hierarchy,通过skip connection构建top-down path,仅需少量成本生成feature pyramid,并且feature pyramid的每个scale都具有high-level semantic feature,最终在feature pyramid的各个level上进行目标检测

创新点/优点

  • 在deep learning detector中构建pyramid(而最近的RCNN、SPPNet、Fast RCNN、Faster RCNN都没有使用pyramid representation),仅需少量成本并且feature pyramid中每个level都具有high-level semantic feature
  • 速度快、精度高
  • generic:FPN独立于骨干网络,可以用于改进多种算法,本文将其用于Faster RCNN(RPN+Fast RCNN)、instance segmentation proposals

性能/效果

  • 准确度:SOTA,将FPN应用于Faster RCNN,在COCO detection上超过所有single-model
  • 速度:GPU上达6FPS

不足

  • PoolNet指出top-down路径中高级语义信息会逐渐稀释
  • Libra RCNN指出FPN采取的sequential manner使得integrated features更多地关注于相邻层,而较少关注其它层,每次fusion时非相邻层中的semantic information就会稀释1次

FPN算法流程

  • 输入:任意scale的单张图片
  • 输出:在多个level输出对应size的feature map

FPN的构建包括1个bottom-up path、1个top-down path和skip connection

bottom-up path

  • backbone:bottom-up path就是backbone的feedforward

  • stage:

    • 定义:将backbone分为多个stage,将每个stage定义为1个pyramid level
    • 输出:每个stage中,所有layer输出特征图的size是相同的,取其中最后1层的输出作为该stage的输出,因为每个stage中最深的层应该具有最强的特征
    • 下采样:相邻stage之间的下采样比例为2
  • FPN for ResNet:本文将ResNet的后4个stage{C_2,C_3,C_4,C_5}(相对于输入的下采样比例分别为4、8、16、32)的输出定义为4个pyramid level,并不将第1个stage的输出包含到FPN中因为其内存占用量比较大。

ResNet50网络结构图及结构详解 - 知乎 (zhihu.com)

top-down path

  • motivation:high-level semantic information有助于识别目标但有害于定位目标,low-level spatial information有害于识别目标但有助于定位目标(由于下采样次数较少,所以可以更准确地定位)
  • 构建:通过skip connection来构建top-down path
  • 注:在开始top-down path之前,会在bottom-up path顶层使用1×1卷积生成the coarsest resolution map

skip connection

img

  1. 将来自top-down path的coarser-resolution feature map上采样。上采样比例为2,简单起见就使用nearest neighbor upsampling
  2. 使用1×1卷积减少来自bottom-up path的对应feature map的通道数
  3. 对上2步得到的2个feature map(size和channel数量都相同)进行element-wise addition

输出

top-down path得到的输出{P_2,P_3,P_4,P_5}就是FPN的输出,其和bottom-up path中的{C_2,C_3,C_4,C_5}相对应,其中C_i和P_i的spatial size相同、C_i,P_i表示其分辨率比输入低2^i

  • 3×3卷积:对每个element-wise addition得到的feature map分别进行3×3卷积,即得到FPN的输出,这样可以减少上采样带来的aliasing effect

  • More about 3×3卷积

    • 作用:这样可以减少上采样带来的aliasing effect**(TODO:明确下aliasing effect是什么?那加上3×3卷积为什么能解决aliasing effect?)**
    • 激活函数:3×3卷积后没有非线性激活函数,作者通过实验发现其影响很小(注:我在做毕设时尝试将3×3卷积换为1×1卷积,也发现影响不大)
    • 通道数:FPN和传统的featurized image pyramid一样,各个pyramid level共享classifier/regressor,所以将这些3×3卷积层的输出通道数设置为256

FPN for Faster RCNN

FPN for RPN

如未特别指出,则其余设置与Faster RCNN相同

  • FPN输出:{P_2, P_3, P_4, P_5, P_6},其中P_6只是1个步长为2的下采样,引入它是为了覆盖更大的anchor scale 512^2

  • RPN结构:1个3×3卷积 + 2个并行1×1卷积

  • RPN输入:在5个pyramid level上,分别运行同1个RPN

  • anchor:5个level共有5×3=15种anchor

    • scale:引入FPN后,每个pyrimid level上的anchor就不需要是multi-scale的了。每个pyramid level上的anchor各只有1种scale,{P_2, P_3, P_4, P_5, P_6}上anchor的scale分别为{322,642,1282,2562,512^2}
    • aspect ratio:每个level上都有3个aspect ratio的anchor(1:2, 1:1, 2:1)
  • training label assignment:

    • 正样本:和GT BBox的IoU最大的anchor、和GT BBox的IoU大于0.7的anchor
    • 负样本:和所有GT BBox的IoU都小于0.3的anchor
  • GT BBox assignment:并不根据GT BBox的scale将GT BBox分配到某个pyramid level。而是不同scale的anchor已对应到某个pyramid level、GT会根据IoU和anchor对应

  • multi RPN:如果每个level上使用不同的RPN,准确度也是类似的,这说明pyramid的各个level共享相似的semantic level,这种优势类似于featurized image pyramid的优势(1个common head classifier可以应用于从任意image scale计算得到的feature map)

FPN for Fast RCNN

可以把FPN输出的feature pyramid当做是1个image pyramid生成的,因此可以使用SPPNet和Fast RCNN应用于image pyramid时的分配策略,将不同scale的RoI分配到对应pyramid level的特征图上

1个size(在input image上的size)为(w,h)的RoI应该被分配到feature pyramid上的level P_k:

img

其中224为ImageNet的预训练size,k_0是1个224×224的RoI应该被映射到的target pyramid level。

ResNet原文中的Faster RCNN使用C_4作为RPN的输入,所以本文将k_0设为4。

假如RoI的scale小于224×224(比如112×112,正好是224的一半),则它会被映射到finer-resolution level(比如3)。注:fine-resolution指像素数多,coarse-resolution指像素少。

ResNet中使用conv5作为conv4输出的feature map顶部的head,但本文已经将conv5用于构建FPN。因此本文使用RoI pooling生成7×7的feature,然后用2个1024维的FC层+ReLU,然后再输入到最终的classification layer和BBox regression layer。相比于standard conv5 head,我们的方法参数更少、速度更快

FPN for Segmentation Proposals

img

Experiments on RPN

img

  • Implementation details:详见原文
  • Comparisons with baselines:表1(a), (b)
  • How important is top-down enrichment?:表1(d)
  • How important are lateral connections?:表1(e)
  • How important are pyramid representations?:表1(f)

Experiments on Fast RCNN

img

Experiments on Faster RCNN

img

Comparing with COCO Competition Winners

img

Experiments on Segmentation Proposal

img

各种FPN:PANet、ASFF、NAS-FPN、BiFPN、Recursive-FPN…

早期的物体检测算法,无论是一步式的,还是两步式的,通常都是在Backbone的最后一个stage(特征图分辨率相同的所有卷积层归类为一个stage)最后一层的特征图,直接外接检测头做物体检测。此种物体检测算法,可以称之为单stage物体检测算法。

由于单stage物体检测算法中,Backbone的最后一个stage的stride通常是32,导致输出的特征图分辨率是输入图片分辨率的1/32,太小,不利于物体检测,因此单stage的物体检测算法,一般会将最后一个stage的MaxPooling去掉或者将stride为2的conv改为stride为1的conv,以增大最后一个分辨率。

后来研究发现,单stage物体检测算法中,无法用单一stage的特征图同时有效的表征各个尺度的物体,因此,后来物体检测算法,就逐渐发展为利用不同stage的特征图,形成特征金字塔网络(feature parymid network),表征不同scale的物体,然后再基于特征金字塔做物体检测,也就是进入了FPN时代。

物体检测各个阶段

在这里插入图片描述

如上图,我们常见的物体检测算法,其实可以分解为三个递进的阶段:

1)Backbone生成特征阶段

计算机视觉任务一般都是基于常用预训练的Backbone,生成抽象的语义特征,再进行特定任务微调。物体检测也是如此。

Backbone生成的特征,一般按stage划分,分别记作C1、C2、C3、C4、C5、C6、C7等,其中的数字与stage的编号相同,代表的是分辨率减半的次数,如C2代表stage2输出的特征图,分辨率为输入图片的1/4,C5代表,stage5输出的特征图,分辨率为输入图片的1/32。

2)特征融合阶段

这个是FPN特有的阶段,FPN一般将上一步生成的不同分辨率特征作为输入,输出经过融合后的特征。输出的特征一般以P作为编号标记。如FPN的输入是,C2、C3、C4、C5、C6,经过融合后,输出为P2、P3、P4、P5、P6。

3)检测头输出bounding box

FPN输出融合后的特征后,就可以输入到检测头做具体的物体检测。

FPN的演进

物体检测性能提升,一般主要通过数据增强、改进Backbone、改进FPN、改进检测头、改进loss、改进后处理等6个常用手段。

其中FPN自从被提出来,先后迭代了不少版本。大致迭代路径如下图:
在这里插入图片描述
1)无融合
无融合,又利用多尺度特征的典型代表就是2016年的鼎鼎有名的SSD,它直接利用不同stage的特征图分别负责不同scale大小物体的检测
在这里插入图片描述
2)自上而下单向融合
自上而下单向融合的FPN,事实上仍然是当前物体检测模型的主流融合模式。如我们常见的Faster RCNN、Mask RCNN、Yolov3、RetinaNet、Cascade RCNN等,具体各个FPN的内部细节如下图。
在这里插入图片描述
a)Faster/Master/Cascade RCNN中的FPN

Faster/Master/Cascade RCNN中的FPN,利用了C2-C6五个stage的特征,其中C6是从C5直接施加1x1/2的MaxPooling操作得到。FPN融合后得到P2-P6,其中P6直接等于C6,P5是先经过1x1Conv,再经过3x3Conv得到,P2-P4均是先经过1x1Conv,再融合上一层2xUpsample的特征,再经过3x3Conv得到。具体过程可以看上图。

b)RetinaNet中的FPN

RetinaNet中的FPN,利用了C3-C7五个stage的特征,其中C6是从C5直接施加3x3/2的Conv操作得到,C7是从C6直接施加3x3/2的Conv操作得到。FPN融合后得到P3-P7,其中P6、P7直接等于C6、C7,P5是先经过1x1Conv,再经过3x3Conv得到,P3-P4均是先经过1x1Conv,再融合上一层2xUpsample的特征,再经过3x3Conv得到。具体过程可以看上图。

可以看出,RetinaNet基本与Faster/Master/Cascade RCNN中的FPN一脉相承。只是利用的stage的特征略有差别,Faster/Master/Cascade RCNN利用了高分辨率低语义的C2,RetinaNet利用了更低分辨率更高语义的C7。其他都是细微的差别。

c)Yolov3中的FPN

Yolov3中的FPN与上述两个有比较大的区别。首先,Yolov3中的FPN只利用到了C3-C5三个stage的特征;其次,从C5征到P5特征,会先经过5层Conv,然后再经过一层3x3Conv;最后,C3-C4到P3-P4特征,上一层特征会先经过1x1Conv+2xUpsample,然后先与本层特征concatenate,再经过5层Conv,之后经过一层3x3Conv。看图最清楚。

可以看图仔细对比Yolov3与Faster/Master/Cascade RCNN以及RetinaNet细节上的区别。

3)简单双向融合

FPN自从提出来以后,均是只有从上向下的融合,PANet是第一个提出从下向上二次融合的模型,并且PANet就是在Faster/Master/Cascade RCNN中的FPN的基础上,简单增了从下而上的融合路径。看下图。
在这里插入图片描述
4)复杂的双向融合

PANet的提出证明了双向融合的有效性,而PANet的双向融合较为简单,因此不少文章在FPN的方向上更进一步,尝试了更复杂的双向融合,如ASFF、NAS-FPN和BiFPN。

ASFF
ASFF(论文:Learning Spatial Fusion for Single-Shot Object Detection)作者在YOLOV3的FPN的基础上,研究了每一个stage再次融合三个stage特征的效果。如下图。其中不同stage特征的融合,采用了注意力机制,这样就可以控制其他stage对本stage特征的贡献度。
在这里插入图片描述
NAS-FPN和BiFPN
NAS-FPN(基于搜索结构的FPN )和BiFPN,都是google出品,思路也一脉相承,都是在FPN中寻找一个有效的block,然后重复叠加,这样就可以弹性的控制FPN的大小。
在这里插入图片描述
其中BiFPN的具体细节如下图。
在这里插入图片描述

Recursive-FPN

递归FPN是此文写作之时前两周刚刚新出炉的(原论文是DetectoRS: Detecting Objects with Recursive Feature Pyramid and Switchable Atrous Convolution),效果之好令人惊讶,使用递归FPN的DetectoRS是目前物体检测(COCO mAP 54.7)、实体分割和全景分割的SOTA,太强悍了。

递归FPN理解起来很容易,就是将传统FPN的融合后的输出,再输入给Backbone,进行二次循环,如下图。
在这里插入图片描述
下图给出了FPN与Recursive-FPN的区别,并且把一个2层的递归FPN展开了,非常简单明了,不做过多介绍。
在这里插入图片描述

5)M2det中的SFAM

M2det中的SFAM,比较复杂,它是先把C3与C5两个stage的特征融合成一个与C3分辨率相同的特征图(下图中的FFM1模块),然后再在此特征图上叠加多个UNet(下图中的TUM模块),最后将每个UNet生成的多个分辨率中相同分辨率特征一起融合(下图中的SFAM模块),从而生成最终的P3、P4、P5、P6特征,以供检测头使用。具体如下图。
在这里插入图片描述
每一个模块的详细细节如下图。
在这里插入图片描述

FPT(Transformer)

源论文:FPT
源代码:FPT源码pytorch
其次还有很多FPN变体,可谓数不胜数。。。Fully-FPN,Simple-PAN,Libra R-CNN等等等等

思考

FPN的优化会显著带来物体检测的性能提升,当前最好的FPN是递归FPN,期待将来更有效的FPN出现。

最近Facebook出了一篇文章object detection by transformer,如果transformer与各种强大的FPN结合,效果如何还是值得期待。

改进AugFPN

代码:https://github.com/Gus-Guo/AugFPN

论文:https://arxiv.org/abs/1912.05384

摘要:

  • 现有的SOTA检测器都使用了构建特征金字塔(不同尺度的特征组合),来提升对不同尺度(大小)的目标的检测鲁棒性。而FPN是其中的代表性工作
  • 本文对FPN进行了分析,找到了其中的一些设计上的缺陷
  • 针对缺陷提出了3个改进点,也正是AugFPN的3个组成部分:
  1. Consistent Supervision:用于降低不同scale之间的语义Gap
  2. Residual Feature Augmentation:用于在不同尺度的特征融合(fusion, summation)中降低信息损失
  3. Soft RoI Selection:更好地从图像金字塔中取出ROI Feature用于分类

将FasterRCNN中的FPN结构改成AugFPN,在ResNet50和MobileNet-v2上都有mAP提升

另外,AugFPN中与特征金字塔相关的改进点(也就是Consistent Supervision & Residual Feature Augmentation),在一些Anchor Based/ Anchor Free的One-stage方法中,也能获得提升

原生的FPN中存在的缺陷分析

img

针对FPN中对不同尺度特征的融合&利用,Figure 1对其进行了总结。对于一个Backbone,FPN首先会引出它在不同尺度下的输出,这些输出有这样的特性:

  1. 底层特征尺度(大小)大,包含的语义信息不够丰富,往往只通过非常有限的卷积核(层),得到一些底层(如边缘,角点)等信息。很多网络的在设计上,为了兼顾算力,底层特征的通常通道数会比较小(因为在这种大小下做卷积的算力会暴增,具体结合卷积的时间复杂度去分析)
  2. 高层特征尺度小,由于经过了相对比较多的卷积层,会包含比较多的语义信息,而且通道数往往会比较大

相邻两个尺度的特征融合,FPN首先将高层特征通过1x1的卷积进行降维,从而使得它和下面一层特征有同样的通道数(维度/channel数上的适配),然后通过2倍上采样 + 3x3卷积来进行尺度上的适配,最终将维度&尺度上适配后的特征和上一层尺度进行融合(直接相加,因为两个特征的shape已经完全一样

上述的特征融合方式(两个卷积进行适配,直接相加)的问题在于:

  • 相邻尺度特征融合过程中的信息损失:在高层 -> 底层适配的过程中,那个1x1的卷积会对丢失信息(这里主要指的是语义(semantic)信息),因为channel数变少了
  • 高层特征的损失:在最高层的特征中,因为没有别的特征和它融合,而它又直接经过了一个1x1的卷积进行降维,通道数的减少显然会损失信息。文章指出这种信息可以通过Global Pooling来解决,但是Global Pooling得到的一个一维向量显然丢失了空间信息(e.g. 目标的相对位置没办法通过这样的一维向量表征)
  • ROI特征的选择上有问题:FPN认为,融合后的底层信息包含较多与小目标相关的特征,并且尺度大,信息更细腻,对小目标更敏感,因此在底层特征中输出的往往是小目标的ROI特征,反之亦然。但问题是,其他层也包含了对该物体的一些语义信息。本文提到了一个缓解性的方案:PANet通过在每个物体中取出ROI特征,然后通过全链接的方式,从而充分利用每个尺度下的ROI。但这样的问题是:
  1. 全链接之后接了一个max pooling,同样会丧失一些响应小的网络特征输出,而这些输出也有可能对分类有帮助
  2. 全连接层的参数量太大了

针对上述3个缺陷的改进

img

对应地,AugFPN 提出了3个模块来提升性能,分别对应Figure 2的3个部分:

  • Consistent Supervision:用于降低不同scale之间的语义Gap
  • Residual Feature Augmentation:用于在不同尺度的特征融合(fusion, summation)中降低信息损失
  • Soft RoI Selection:更好地从图像金字塔中取出ROI Feature用于分类

Consistent Supervision:

    • 文章中认为,通过两个卷积进行适配,相邻两个尺度的特征图直接相加的方式,从参数优化的角度来看,会使得最终的特征金字塔陷入次优(简而言之,可以认为融合的过程中缺乏语义信息,网络学不好)
    • 因此,一种间接的思路是,直接在每个融合前的特征后面接上检测器&分类器(RPN Head + RCNN),如Figure 2黄色部分。训练时,网络的损失 = lambda * 融合前检测器的Localization Loss + 融合后检测器的Localization Loss + beta * (融合前检测器的Classification Loss + 融合后检测器的Classification Loss) ,实际使用中lambda = 0.25
    • 此外,融合前各个尺度的检测器权重是共享的,这样有利于对不同尺度的监督,从而:1)进一步加强各个尺度下的特征联系; 2)反推底层信息能学到更多的语义信息(从高层信息引导过来)
    • 在预测时,融合前的共享的这些检测器&分类器都可以去掉

Residual Feature Augmentation

    • 可以看到在图2中的M5,经过1x1的卷积后channel数减少,显然丢失了信息,并且没有其余的特征与其融合
    • 文章中认为,空间上下文信息,能够减少channel数减少带来的语义信息损失,因此可以通过空间信息来补偿,并且提出了Residual Feature Augmentation这一具体举措
  • Residual Feature Augmentation的具体做法:

    • 将C5降采样成3份。这里的降采样包括2部分:一个是将C5通过adaptive pooling分别降采样成 alpha1, alpha2, alpha3 * C5的宽高;一个是将adaptive pooling后的结果通过1x1的卷积,将每份降采样的Feature Channel变成256,如图3(a)所示。实际使用中,alpha1, alpha2, alpha3分别为0.1, 0.2, 0.3
    • adaptive pooling介绍:https://discuss.pytorch.org/t/adaptive-avg-pool2d-vs-avg-pool2d/27011

img

    • 重点在于将采样后的特征如何进行融合,也就是Adaptive Spatial Fusion:

      • 本文先通过将3个不同尺度的降采样结果统一上采样到C5一样的宽高,保持channel = 256
      • 将三者concat,通过conv 1x1 -> conv 3x3的方式进行融合,最终形成3个attention map(因此Sigmoid输入的维度应该是Nx3xhxw,与代码中一致)
      • 并将这3个attention map分别应用于3个上采样后的Feature Map

Soft ROI Selection

    • 本文认为对于给定的ROI, 如果是在某层金字塔中取,会

    • 对于某个ROI,通过ROI Align取出特征金字塔中所有的ROI Feature(4个尺度会产生4个ROI Feature),默认会在4,8,16,32 4个stride取出4个 7x7x256的ROI feature

    • 同样采用ASF的方式:

      • 将4个ROI Feature Concat起来
      • 通过conv 1x1 -> conv 3x3的方式进行融合,形成N个attention map(N=金字塔层数)
      • 每个ROI Feature与对应的attention map相乘(加权)
      • 将加权后的ROI Feature相加

针对One-stage的适配:

    • 文中指出,这样的理念同样适用于One-stage算法,比如retinanet
    • AugFPN中ROIAlign后面的部分,即Soft ROI Selection在训练中没有用上
    • Consistent Supervision和Residual Feature Augmentation依然可用

总结

    • 本文分析出了FPN在特征融合时所暴露的缺陷:核心是融合的过程中产生的各种信息缺失

    • 针对信息的缺失提出了一些改进点,主要包含三个方面:

      • 补偿最顶层由于融合前降维产生的信息损失
      • 补偿相邻特征融合后产生的语义信息损失
      • 补偿从单层金字塔中取ROI Feature产生的信息损失

改进CE-FPN

CEFPN论文链接:https://arxiv.org/abs/2103.10643
CEFPN复现代码:https://github.com/RooKichenn/CEFPN

CEFPN结构

话不多说,先上图:
在这里插入图片描述
CEFPN中用了不少前辈们的思想,整体框架借鉴了LibraRCNN(https://arxiv.org/abs/1904.02701v1),我认为最大创新就是CEFPN的网络结构,其他模块都是借鉴前辈们的思想,没什么特别大的创新,但是提供了一个改进的思路:去掉F5和P5层,融合P4,P3,P2。下面就具体分析一下CEFPN的结构。

SSF模块

SSF(Sub-pixel Skip Fusion)是借鉴了CVPR2016年一篇关于超分辨率图像论文中提出的亚像素卷积思想,具体是实现细节我在这里就不赘述了,对这篇论文不了解的话可以先去读一下:https://arxiv.org/abs/1609.05158,在CEFPN中,作者采用了残差融合亚像素卷积的方法对C5和C4进行上采样到C4和C3大小,而没有采用传统的线性插值来进行上采样,同时将C4和C3进行1x1的卷积操作,并将这个结果跟亚像素卷积后的进行特征融合,就得到了F4和F3。
在这里插入图片描述

SCE模块

在这里插入图片描述

SCE(Sub-pixel Context Enhancement),这个模块的思想也比较简单:将Input Feature分别进行三种处理,最后得到一个通道数为原来的1/8,长宽为原来的2倍的特征图。在论文中,将Input Feature的维度描述为 2h x 2w x 8C,我认为这样描述的原因是第二个分支中,涉及到了长宽减半的操作,也正是在这里,有一个小问题:当Input Feature长宽为 25x25 时,在长宽减半后,长宽为13x13,作者进行了四倍的上采样,得到的特征图为52x52,与第一个分支得到的特征图50x50大小不匹配,而文中作者并没有提到这种情况,所以我在第二个分支输出特征图前又加了一个线性插值的操作,将其缩放到和第一个分支输出的特征图相同大小(如果有复现过的小伙伴可以在评论区说一下你的解决方法,我复现出来的效果并没有作者说的好)。经过SCE模块后得到的特征图和P4,P3,P2进行特征融合,得到特征图I。

CAG模块

CAG
在这里插入图片描述
CAM
在这里插入图片描述

CAG(Channel Attention Guided)模块借鉴了CBAM中通道注意力机制的思想,与CAM不同的是,在CAG中去掉了一个参数共享的全链接层,直接进行了特征融合。

使用线性插值和maxpool得到特征图I

在这里插入图片描述

在得到特征图I的这个部分,跟LibraRCNN中FPN特征特征融合是一模一样的,不了解的可以去细看LibraRCNN论文,在这里就简单说一下作者是怎么做的:将经过SCE模块得到的P5,以及P4,P3,P2进行线性插值和maxpool操作,得到特征图I(I的size跟P4是一样的),再除以4(I = I / 4),这里的4代表融合了几个特征层;之后再经过CAG模块得到一个权重α,再通过线性插值和maxpool得到R5, R4, R3, R2,最后将Ri(i=2,3,4,5)乘以权重α,就得到了最后的预测特征图。

训练策略

以ResNet50为例,作者再COCO数据集上训练了12轮,使用了4块16G显存的GPU,每块GPU上2张图片,初始学习率为0.01,并且在第8轮和第11轮下降0.1倍。这里说一下我复现的结果,我只跑了ResNet50,用学校的服务器,四块40G的A100,跟作者参数设置相同,但是map比作者低了接近两个百分点。

复现代码

代码已同步到GitHub,欢迎star:https://github.com/RooKichenn/CEFPN
块得到的P5,以及P4,P3,P2进行线性插值和maxpool操作,得到特征图I(I的size跟P4是一样的),再除以4(I = I / 4),这里的4代表融合了几个特征层;之后再经过CAG模块得到一个权重α,再通过线性插值和maxpool得到R5, R4, R3, R2,最后将Ri(i=2,3,4,5)乘以权重α,就得到了最后的预测特征图。

训练策略

以ResNet50为例,作者再COCO数据集上训练了12轮,使用了4块16G显存的GPU,每块GPU上2张图片,初始学习率为0.01,并且在第8轮和第11轮下降0.1倍。这里说一下我复现的结果,我只跑了ResNet50,用学校的服务器,四块40G的A100,跟作者参数设置相同,但是map比作者低了接近两个百分点。

复现代码

代码已同步到GitHub,欢迎star:https://github.com/RooKichenn/CEFPN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/127353.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汇编-DUP操作符

DUP操作符使用整数表达式作为计数器, 为多个数据项分配存储空间。 在为字符串或数组分配存储空间时,这个操作符尤其有用,并且可以使用初始化或非初始化数据: .data BYTE 20 DUP(0) ;20个字节,都等于0 BYTE 20 …

深度系统v15.4正式发布,惊艳眼球

导读深度操作系统是一个致力于为全球用户提供美观易用、安全可靠的Linux发行版。深度桌面操作系统V15.4专业版使用全新设计的控制中心和重构桌面,采用模糊透明整体风格,全新的热区交互及窗口管理器动效,精挑细选的桌面壁纸;采用全…

springboot+vue健美操评分系统的设计与实现【内含源码+文档+部署教程】

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

基于站点、模式、遥感多源降水数据融合实践技术应用

降水在水循环中发挥着重要作用,塑造了生态景观和生态系统。目前,有四种主要方式获取降水数据:1)雨量计观测,2)地基雷达遥感,3)卫星遥感,4)模式模拟。基于雨量…

YOLOv5检测界面-PyQt5实现

1.将detect.py运用到界面 要将 YOLOv5 的检测结果与 PyQt 界面结合,你需要进行一些额外的步骤。以下是一个简单的示例代码,展示如何使用 YOLOv5 进行目标检测并在 PyQt 界面中显示结果。 首先,确保你已经安装了必要的库: pip …

【11】使用透视投影建立一个3D空间的测试

核心操作: 1.proj view model 这三个矩阵 glm::mat4 mvp m_Proj * m_View * model; m_Shader->Bind(); m_Shader->SetUniformMat4f("u_MVP", mvp);着色器里面就: proj:投影矩阵,可以选择正交投影,或者透视投影…

【无标题】【教3妹学编程-算法题】2918. 数组的最小相等和

3妹:呜呜,烦死了, 脸上长了一个痘 2哥 : 不要在意这些细节嘛,不用管它,过两天自然不就好了。 3妹:切,你不懂,影响这两天的心情哇。 2哥 : 我看你是不急着找工作了啊, 工作…

VScode 右键没有转到定义等的菜单

问题: 右键点击该函数出现的结果只能是这样的: 解决: 通过修改 settings.json 文件,以解决问题: 这是原来有问题的配置: {"python.autoComplete.extraPaths": ["/home/robot/1-temp_mak…

uniapp+vue3+ts+vite+echarts开发图表类小程序,将echarts导入项目使用的详细步骤,耗时一天终于弄好了

想在uniapp和vue3环境中使用echarts是一件相当前卫的事情,官方适配的还不是很好,echarts的使用插件写的是有些不太清晰的,这里我花费了一天的时间,终于将这个使用步骤搞清楚了,并且建了一个仓库,大家可以直…

如何在后台执行 SwiftData 操作

文章目录 前言Core Data 私有队列上下文SwiftData 并发支持使用 ModelActor合并上下文更改的问题通过标识符访问模型总结 前言 SwiftData 是一个用于处理数据操作的框架,特别是在 Swift 语言中进行并发操作。本文介绍了如何在后台执行 SwiftData 操作以及与 Core D…

频谱分析仪 如何选择 TFN RMT系列给您答案

TFN RMT手持式频谱分析仪是TFN新推出的一款高性能、全功能版测试仪,集高性能信号分析模块、多制式解析算法软件于一体的手持式测试仪表,满足军工、高校科研、通信运营商、电力、铁路等对移动通信的测试、无线排查干扰等应用而全新推出的平台,…

Linux系统编程——文件的写入及读取

写入(write) 使用write函数需要包含以下头文件&#xff1a; #include <unistd.h> write的函数定义格式 ssize_t write(int fd, const void *buf, size_t count); 附加&#xff1a;一般将数据写入文件中后需关闭文件&#xff0c;这里需要调用关闭(close)函数&#xf…

高级运维学习(十五)Zabbix监控(二)

一 Zabbix 报警机制 1 基本概念 自定义的监控项默认不会自动报警首页也不会提示错误需要配置触发器与报警动作才可以自动报警 2 概念介绍 &#xff08;1&#xff09;触发器 (trigger) 表达式&#xff0c;如内存不足300M&#xff0c;用户超过30个等 当触发条件发生后&a…

[unity]多脚本情况下update函数的执行顺序

序 有的时候&#xff0c;执行某些脚本时会有先后顺序的要求。unity是按什么顺序来执行脚本的&#xff1f;如何设置&#xff1f; 默认的执行顺序 官方文档里面有个很长的图&#xff1a; Unity - Manual: Order of execution for event functions (unity3d.com) 根据文档&…

传输层中的TCP和UPD协议

一)应用层协议简介:根据需求明确要传输的信息&#xff0c;明确要传输的数据格式&#xff1b; 应用层协议:这个协议&#xff0c;实际上是和程序员打交道最多的协议了 1)其它四层都是操作系统&#xff0c;驱动&#xff0c;硬件实现好了的&#xff0c;咱们是不需要管 2)应用层:当我…

YOLOv8-Seg改进: 分割小目标系列篇 | SPD-Conv,提升分割小目标和弱小分割图精度

🚀🚀🚀本文改进:SPD-Conv由一个空间到深度(SPD)层和一个无卷积步长(Conv)层组成,可以应用于大多数CNN体系结构,特别是在处理低分辨率图像和分割小目标等更困难的任务时。 🚀🚀🚀SPD-Conv 分割小目标检测首选,暴力涨点 🚀🚀🚀YOLOv8-seg创新专栏:http:…

【修车案例】一波形一案例(9)

故障车型&#xff1a;捷豹X-Type 故障现象&#xff1a;发动机故障指示灯点亮&#xff0c;加速时动力不足&#xff0c;扫描工具显示EGR阀和涡轮增压器增压控制位置传感器电路故障 示波器诊断&#xff1a;检测增压控制位置传感器电路的完整性 A通道 - 增压控制执行电机电源电压B通…

docker更改存储目录原因及方案

为什么一定要将docker的存储目录挂载到其他目录 docker在安装时默认存储目录在/var/lib/docker&#xff0c;而该目录是在系统盘下的。docker安装后&#xff0c;会使用各种各样的镜像&#xff0c;动辄几个G&#xff0c;那么如此多的镜像文件&#xff0c;装着装着系统盘就撑爆了…

chrome安装Vue Devtools插件以及无法添加来自此网站的应用问题

chrome安装Vue Devtools插件以及无法添加来自此网站的应用问题 问题背景 Chrome Vue插件是一款可以帮助前端开发人员在浏览器中实时查看和编辑Vue组件和数据的工具。给前端开发人员提供了极大的便利。本文将介绍Chrome浏览器中如何安装Devtools插件。 问题分析 &#xff08…
最新文章