论文阅读和代码实现EfficientDet(BiFPN)
创作时间:
作者:
@小白创作中心
论文阅读和代码实现EfficientDet(BiFPN)
引用
CSDN
1.
https://blog.csdn.net/qq_40938217/article/details/146024965
EfficientDet是近年来在计算机视觉领域提出的重要目标检测模型,其核心创新之一是引入了BiFPN(双向特征金字塔网络)。本文将详细介绍BiFPN的原理和实现,帮助读者理解这一技术是如何优化传统FPN的不足,从而提升模型的检测性能。
多尺度特征表示
对象检测的主要困难之一是有效地表示和处理多尺度特征。作为开创性的作品之一,特征金字塔网络(FPN)[23]提出了一种自上而下的途径,以结合多尺度功能。遵循此想法,PANet [26]在FPN顶部添加了一个额外的自下而上路径聚合网络。STDL [43]提出了一个比例转移模块来利用跨尺度功能。 M2DET [42]为融合多尺度功能提出了一个U形模块,而G-FRNET [2]引入了用于控制跨特征信息流的门单元。NAS-FPN [10]利用神经体系结构搜索自动设计特征网络拓扑。 尽管NAS-FPN在搜索过程中需要成千上万的GPU小时,尽管它可以实现更好的性能,并且由此产生的功能网络是不规则的,因此很难解释。 在本文中,我们旨在以更直观和原则性的方式优化多尺度功能融合。
BiFPN
传统 FPN 存在的问题
FPN(Feature Pyramid Network)在目标检测任务中广泛用于多尺度特征融合,但存在如下缺陷:
- 单向信息流限制:传统 FPN 采用自上而下(top-down)的信息传递方式,这意味着低层的高分辨率特征不能直接影响高层的低分辨率特征,而高层特征的信息也不能直接向底层回流。
- 特征加权不均衡:FPN 直接对不同层次的特征进行相加,但不同分辨率的特征信息贡献程度不同,直接相加可能导致某些层次的特征被过度强化或削弱。
- 计算效率低:NAS-FPN(Neural Architecture Search-based FPN)虽然可以自动搜索最优的 FPN 结构,但搜索过程计算开销巨大,并且最终生成的架构复杂难以解释。
BiFPN 的优化策略
BiFPN(加权双向特征金字塔网络)通过以下方式改进 FPN:
- 引入双向信息流(Bidirectional Fusion):不仅采用传统的自上而下(top-down)信息流,还增加了自下而上(bottom-up)的路径,增强不同层级特征的交互。
- 删除单输入节点(Removing Nodes with One Input):对于仅有一个输入的特征节点,直接删除,以减少计算冗余。
- 增加跨尺度残差连接(Extra Cross-scale Residual Connections):如果某个特征层的输入和输出在相同尺度上,增加额外的连接,以增强信息流动。
- 加权特征融合(Weighted Feature Fusion):为每个融合的特征分配一个可学习的权重参数,让网络自动学习每个层级特征的重要性,而不是简单求和。
- 传统FPN计算方式:
分别表示l层的输出特征、输入特征和l+1层采样使保持尺度不变,这样简单相加没有考虑不同尺度特征的重要性。
跨尺度连接
- 首先,我们删除只有一个输入边缘的节点。 我们的直觉很简单:如果一个节点只有一个没有特征融合的输入边缘,那么它将对旨在融合不同功能的特征网络的贡献更少。(如果一个节点只是负责处理上一层特征不进行任何融合就直接去掉)
- 其次,如果它们处于同一级别,则从原始输入节点中添加了一个额外的优势,以便在不增加成本的情况下融合更多功能;(类似于残差连接)
- 第三,与PANet [26]不同,只有一个自上而下和一个自下而上的路径,我们将每个双向(自上而下和自下而上)路径视为一个特征网络层,并多次重复相同的层以启用更多的高级特征融合。
- BiFPN的加强特征融合
EfficientDet 的复合缩放策略
主要是在网络深度、分辨率、网络宽度等方面的一些策略,不过多介绍。
BiFPN的代码实现
class BiFPN_Concat(nn.Module):
def __init__(self, dimension=1):
super(BiFPN_Concat, self).__init__()
self.d = dimension
self.w = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True)
self.epsilon = 0.0001
def forward(self, x):
w = self.w
weight = w / (torch.sum(w, dim=0) + self.epsilon) # 将权重进行归一化
# Fast normalized fusion
x = [weight[0] * x[0], weight[1] * x[1]]
return torch.cat(x, self.d)
热门推荐
准噶尔灭国战:康熙、雍正、乾隆三朝七十年的疆域扩张
单颗荔枝拍出488元 厚街荔枝何以成顶流
自制沙拉酱(无油)
Excel表格去除重复号码的四种方法
拍照技巧:五种姿势让你的腿看起来更长
思密达啥意思?思密达是哪个国家的语言?思密达的应用场景分享
全国去胎记比较权威的医院排名揭晓!如何选择实力医院?
多动症儿童最有效的治疗方法
保姆级申诉教程:你心爱的PUBG账号被盗遭封后该如何申诉?
金发科技两连板后澄清:仅间接持有宇树科技0.42%股权
探索影音新境界:功放与电视机的完美连接
逆卡巴拉邪恶之树
辽宁航空产业的飞速发展:过去、现在与未来
如何查询投资顾问资质
任督二脉~任脉
避坑指南:联合会员省钱攻略详解
春天赏花季,武汉酒店接连“满房”的秘密
佩雷拉实战碾压韩国拳击冠军!
多措并举促消费 让居民能消费、敢消费、愿消费
揭秘海洋美食:海米的起源、制作与健康益处
来洛阳赏国色天香!今年牡丹文化节亮点纷呈先睹为快!
加盟模式有哪几种分类,都是如何运营操作的?
全攻略!黑眼圈成因、分类、预防与治疗
三面牙刷好还是一面牙刷好?牙刷怎么选合适?
国自然函评现状:大同行评审比例明显提升,能否保证结果公平公正?
小学生网络安全教育指南:从基础认知到实践应用
乡村炒猪肝:烟火气息中的质朴美味,探寻乡村饮食文化的独特篇章
如何决定使用哪些社交渠道进行招聘工作
无法拒绝的漂亮南法小村埃兹 Eze,地中海边缘的璀璨珍珠
为何古代女子15岁前一定要嫁人?原来皇帝还有另一层“心思”