【YOLO改进】换遍主干网络之CVPR2024 微软新作StarNet:超强轻量级Backbone(基于MMYOLO)

StarNet

论文链接:[2403.19967] Rewrite the Stars

github仓库:GitHub - ma-xu/Rewrite-the-Stars: [CVPR 2024] Rewrite the Stars

CVPR2024 Rewrite the Stars论文揭示了star operation(元素乘法)在无需加宽网络下,将输入映射到高维非线性特征空间的能力。基于此提出了StarNet,在紧凑的网络结构和较低的能耗下展示了令人印象深刻的性能和低延迟。

优势 (Advantages)

  1. 高维和非线性特征变换 (High-Dimensional and Non-Linear Feature Transformation)

    • StarNet通过星操作(star operation)实现高维和非线性特征空间的映射,而无需增加计算复杂度。与传统的内核技巧(kernel tricks)类似,星操作能够在低维输入中隐式获得高维特征​ (ar5iv)​。
    • 对于YOLO系列网络,这意味着在保持计算效率的同时,能够获得更丰富和表达力更强的特征表示,这对于目标检测任务中的精细特征捕获尤为重要。
  2. 高效网络设计 (Efficient Network Design)

    • StarNet通过星操作实现了高效的特征表示,无需复杂的网络设计和额外的计算开销。其独特的能力在于能够在低维空间中执行计算,但隐式地考虑极高维的特征​ (ar5iv)​。
    • 这使得StarNet可以作为YOLO系列网络的主干,提供高效的计算和更好的特征表示,有助于在资源受限的环境中实现更高的检测性能。
  3. 多层次隐式特征扩展 (Multi-Layer Implicit Feature Expansion)

    • 通过多层星操作,StarNet能够递归地增加隐式特征维度,接近无限维度。对于具有较大宽度和深度的网络,这种特性可以显著增强特征的表达能力​ (ar5iv)​。
    • 对于YOLO系列网络,这意味着可以通过适当的深度和宽度设计,显著提高特征提取的质量,从而提升目标检测的准确性。

解决的问题 (Problems Addressed)

  1. 计算复杂度与性能的平衡 (Balance Between Computational Complexity and Performance)

    • StarNet通过星操作在保持计算复杂度较低的同时,实现了高维特征空间的映射。这解决了传统高效网络设计中计算复杂度与性能之间的权衡问题​ (ar5iv)​。
    • YOLO系列网络需要在实时性和检测精度之间找到平衡,StarNet的高效特性正好契合这一需求。
  2. 特征表示的丰富性 (Richness of Feature Representation)

    • 传统卷积网络在特征表示的高维非线性变换上存在一定局限性,而StarNet通过星操作实现了更丰富的特征表示​ (ar5iv)​。
    • 在目标检测任务中,特别是对于小目标和复杂场景,丰富的特征表示能够显著提升检测效果,使得YOLO系列网络在这些场景中表现更佳。
  3. 简化网络设计 (Simplified Network Design)

    • StarNet通过星操作提供了一种简化网络设计的方法,无需复杂的特征融合和多分支设计就能实现高效的特征表示​ (ar5iv)​。
    • 对于YOLO系列网络,这意味着可以更容易地设计和实现高效的主干网络,降低设计和调试的复杂度。

在MMYOLO中将StarNet替换成yolov5的主干网络

1. 在上文提到的仓库中下载imagenet/starnet.py

2. 修改starnet.py中的forward函数,并且添加out_dices参数使其能够输出不同stage的特征向量

3. 将class StarNet注册并且在__init__()函数中进行修改

4. 修改配置文件,主要是调整YOLOv5 neck和head的输入输出通道数

修改后的starnet.py

"""
Implementation of Prof-of-Concept Network: StarNet.

We make StarNet as simple as possible [to show the key contribution of element-wise multiplication]:
    - like NO layer-scale in network design,
    - and NO EMA during training,
    - which would improve the performance further.

Created by: Xu Ma (Email: [email protected])
Modified Date: Mar/29/2024
"""
import torch
import torch.nn as nn
from timm.models.layers import DropPath, trunc_normal_
from typing import List, Sequence, Union

# from timm.models.registry import register_model
from mmyolo.registry import MODELS

model_urls = {
    "starnet_s1": "https://github.com/ma-xu/Rewrite-the-Stars/releases/download/checkpoints_v1/starnet_s1.pth.tar",
    "starnet_s2": "https://github.com/ma-xu/Rewrite-the-Stars/releases/download/checkpoints_v1/starnet_s2.pth.tar",
    "starnet_s3": "https://github.com/ma-xu/Rewrite-the-Stars/releases/download/checkpoints_v1/starnet_s3.pth.tar",
    "starnet_s4": "https://github.com/ma-xu/Rewrite-the-Stars/releases/download/checkpoints_v1/starnet_s4.pth.tar",
}


class ConvBN(torch.nn.Sequential):
    def __init__(self, in_planes, out_planes, kernel_size=1, stride=1, padding=0, dilation=1, groups=1, with_bn=True):
        super().__init__()
        self.add_module('conv', torch.nn.Conv2d(in_planes, out_planes, kernel_size, stride, padding,
### Starnet 中的 Star 组件或概念介绍 #### 星操作的核心理念 星操作被证明在网络架构设计中具有显著优势,在高效网络领域展现了其实用价值。通过简化的设计思路,StarNet 实现了无需复杂结构或精细调整超参数即可达到优异性能的目标[^1]。 #### StarNet 的基本构成 StarNet 构建了一个基于星形拓扑的概念验证模型,该模型利用中心节点连接多个外围节点的方式构建卷积层之间的关系。这种独特的连接模式不仅减少了计算资源的需求,还提高了特征提取效率和准确性。 #### 特征传播机制 在 StarNet 设计中引入了一种新颖的数据流方式——星型数据传输路径。此路径允许输入信息经过一次转后直接传递给所有相邻单元格,从而加速训练过程并增强表达能力[^2]。 #### 轻量化特性 由于采用了简洁而有效的内部结构,使得 StarNet 成为了轻量级改进的理想选择之一。特别是对于像 YOLOv8 这样的目标检测框架来说,应用 StarNet 可以为其带来更优的结果表现。 ```python class StarBlock(nn.Module): def __init__(self, in_channels, out_channels): super(StarBlock, self).__init__() # 定义核心组件 self.center_conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.branch_convs = nn.ModuleList([ nn.Conv2d(out_channels, out_channels//4, kernel_size=1) for _ in range(4)]) def forward(self, x): center_out = F.relu(self.center_conv(x)) branch_outputs = [F.relu(conv(center_out)) for conv in self.branch_convs] combined_output = torch.cat(branch_outputs, dim=1) return combined_output ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值