【阅读笔记】Rethinking Classification and Localization for Object Detection

本文深入比较了全连接头(fc-head)和卷积头(conv-head)在目标检测任务中的表现,发现两者在分类和定位任务上具有互补优势。fc-head擅长对象分类,而conv-head则擅长边界框回归。因此,作者提出了双头方法,结合fc-head用于分类,conv-head用于回归,实现了性能提升。在实验中,双头方法在ResNet-50和ResNet-101基础上分别提升了+3.5和+2.8的AP值。

原文链接Rethinking Classification and Localization for Object Detection

CVPR2020

目录

1. Introduction

2. Related Work

 3.Experimental Results

 4.Conclusions


1. Introduction

        大多数两阶段目标检测器共享一个分类和边界盒回归的head。然而对fc-head,conv-head这两个头部结构之间缺乏理解。在本文中,作者对全连接头(fc头)和卷积头(凸头)进行了彻底的比较。对象的分类和本地化。我们发现这两种不同的头部结构是互补的。fc-head能更好地区分一个完整的对象和一个对象的一部分更适用于分类任务.conv-head提供了更准确的bounding box regression更适用于回归任务。鉴于上述发现,作者提出了双头方法,其中包括一个完全连接的头 (fc-head)用于分类和卷积头(conv-head)用于边界框回归。

2. Related Work

首先看下几种head结构

        在得到feature map后接上一个全连接分支,在最后接上两个分支,一个输出预测的BoundingBox位置信息,一个输出对应位置的类别信息。

         在得到feature map后接上几个卷积操作,再接上一个全连接,最后接上一个分支输出预测的BoundingBox位置信息,一个分支输出对应位置的类别信息。

         该结构是将上面两种结合在一起,全连接的用于分类任务,卷积的拥有回归任务。在本文中作者称为Double-Head。

         作者发现fc-head和conv-head其实在分类上是互补的。因此,作者在训练中引入了不集中的任务监督,并提出了一种互补的融合方法,结构如上图所示。

        Network Structure
        Backbone:作者使用 FPN生成proposal,并使用 RoIAlign从多个级别提取对象特征。 每个proposal都有一个大小为256×7×7的特征图,由fc-head和conv head转换为两个维度都是1024的特征向量,分别用于分类和边界框回归。
        Fully Connected Head (fc-head ) :由两个全连接层组成,遵循 FPN中的设计。 输出维度1024,参数量为13.25M。
         Convolution Head (conv-head ) :堆叠K个残差模块。

conv-head结构的第一个残差块如图(a),将提取的RoI的通道数256增加到1024通道,参数量1.06M。

conv-head结构后续残差块如图(b),正常的resnet block操作,参数量1.06M。

在每个b块之前添加一个块c,来为conv-head引入一种变化,以增强前景对象,参数量2M。作者顺序叠加{a−c−b−c−b}构成conv-head。

         double-head Loss:


 分别表示fc-head,conv-head,FPN的损失;分别表示fc-head和conv-head部分损失的权重,实验分别取2.0和2.5。

        Double-Head-Ext Loss:

 

 

 其中超参分别取0.7和0.8最优

       Complementary Fusion of Classififiers:

 表示fc-head分类的得分,表示conv-head分类的得分。

 3.Experimental Results

 

 

 

 

 

结果显示fc-head head 比 conv-head 更适合分类 。

 4.Conclusions

         在本文中,作者发现了一个有趣的事实,两种广泛使用的fc-head和conv-head在目标检测中对分类和定位任务具有相反的偏好。具体来说,fc-head 更适合分类任务,而 conv-head 更适合定位任务。此外,作者检查输出特征两个头部的映射,发现 fc-head 比 conv-head 具有更高的空间敏感性。因此,fc-head 具有更强的区分完整对象和部分对象的能力,但对整个对象的回归并不鲁棒。基于这些发现,作者提出了一种双头方法,它有一个专注于分类的fc-head和一个用于边界框回归的conv-head。作者的方法分别从具有 ResNet-50 和 ResNet-101 主干的 FPN 基线在 MS COCO 数据集上获得 +3.5 和 +2.8 AP。

 

 

 

 

 

 

 

 

 

 

 

 

 

        

### Features-Fused-Pyramid-Neck 的设计与性能优化分析 Features-Fused-Pyramid-Neck 是一种用于目标检测的特征融合架构,其核心目标是通过改进特征金字塔的设计,解决多尺度目标检测中的特征错位问题。该架构通过重新思考特征融合的方式,提升了检测的精度和效率[^1]。 #### 特征金字塔的设计目标 在目标检测任务中,多尺度目标的检测一直是技术难点之一。传统特征金字塔(如FPN)通过自上而下和横向连接的方式,将高层语义信息和低层空间信息进行融合,以增强多尺度目标的特征表示。然而,这种方法存在特征错位的问题,即不同层级的特征在空间上难以完全对齐,导致融合效果受限。Features-Fused-Pyramid-Neck 通过改进特征融合的设计,优化了这一问题[^1]。 #### 特征融合架构的改进 Features-Fused-Pyramid-Neck 的改进主要体现在以下几个方面: 1. **特征对齐机制**:引入了更精细的特征对齐技术,确保不同层级的特征在空间维度上能够精确对齐。这种对齐机制有效减少了特征错位带来的信息损失,从而提升了多尺度目标的检测精度[^1]。 2. **动态特征融合**:通过动态调整特征融合的权重,根据输入图像的内容自适应地选择最优的特征组合。这种方法不仅提高了模型的灵活性,还增强了其对不同场景的适应能力。 3. **轻量化设计**:为了提升实时性,Features-Fused-Pyramid-Neck 在保证性能的前提下,对网络结构进行了轻量化设计。例如,通过使用深度可分离卷积(Depthwise Separable Convolution)等技术,减少了计算量,从而提高了推理速度。 #### 性能优化 在性能优化方面,Features-Fused-Pyramid-Neck 通过以下方式提升了目标检测的效率和精度: 1. **多尺度特征提取**:通过多层级特征金字塔的设计,能够有效捕捉不同尺度的目标特征,从而提升小目标和大目标的检测性能。 2. **实时性优化**:通过轻量化设计和动态特征融合策略,减少了模型的计算复杂度,使得该架构能够在实时目标检测任务中表现出色。 3. **实验验证**:在多个目标检测数据集上进行了广泛的实验验证,结果表明 Features-Fused-Pyramid-Neck 在检测精度和推理速度方面均优于传统的特征金字塔架构。 #### 代码示例 以下是一个简化的 Features-Fused-Pyramid-Neck 的实现示例,展示了其核心特征融合模块的设计: ```python import torch import torch.nn as nn class FeatureFusedPyramidNeck(nn.Module): def __init__(self, in_channels_list, out_channels): super(FeatureFusedPyramidNeck, self).__init__() self.lateral_convs = nn.ModuleList() self.top_down_convs = nn.ModuleList() self.out_convs = nn.ModuleList() # 构建横向连接和自上而下连接 for in_channels in in_channels_list: lateral_conv = nn.Conv2d(in_channels, out_channels, 1) top_down_conv = nn.Conv2d(out_channels, out_channels, 3, padding=1) self.lateral_convs.append(lateral_conv) self.top_down_convs.append(top_down_conv) # 输出层卷积 for _ in range(len(in_channels_list)): out_conv = nn.Conv2d(out_channels, out_channels, 3, padding=1) self.out_convs.append(out_conv) def forward(self, inputs): # 横向连接 laterals = [lateral_conv(x) for x, lateral_conv in zip(inputs, self.lateral_convs)] # 自上而下传播 feature_maps = [] feature_map = laterals[-1] feature_maps.append(feature_map) for i in range(len(laterals) - 2, -1, -1): feature_map = torch.nn.functional.interpolate(feature_map, scale_factor=2, mode='nearest') feature_map = feature_map + laterals[i] feature_maps.append(feature_map) # 输出层处理 outputs = [out_conv(fm) for fm, out_conv in zip(feature_maps, self.out_convs)] return outputs ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值