爆改YOLOv8|利用MobileNetV4 的UIB改进C2f模块-yolov8改进

1,本文介绍

本文介绍了在 MobileNetV4 的 UIB 模块基础上进行的改进,即创新性地应用 C2f 模块。UIB 模块最早出现在 2024 年 5 月发布的 MobileNetV4 网络中,这是一种为移动设备高度优化的神经网络架构。其主要改进包括:引入了通用反向瓶颈(UIB)结构,以及针对移动加速器优化的全新 Mobile MQA 注意力模块。

关于UIB 的详细介绍可以看论文:[2404.10518] MobileNetV4 - Universal Models for the Mobile Ecosystem

本文将讲解如何将UIB 融合进yolov8

话不多说,上代码!

2, 将UIB融合进yolov8


2.1 步骤一

找到如下的目录'ultralytics/nn/modules',然后在这个目录下创建一个UIB.py文件,文件名字可以根据你自己的习惯起,然后将UIB的核心代码复制进去

import torch.nn as nn
from typing import Optional
import torch
 
__all__ = ['C2f_UIB']
 
 
def make_divisible(
        value: float,
        divisor: int,
        min_value: Optional[float] = None,
        round_down_protect: bool = True,
) -> int:
    """
    This function is copied from here
    "https://github.com/tensorflow/models/blob/master/official/vision/modeling/layers/nn_layers.py"
    This is to ensure that all layers have channels that are divisible by 8.
    Args:
        value: A `float` of original value.
        divisor: An `int` of the divisor that need to be checked upon.
        min_value: A `float` of  minimum value threshold.
        round_down_protect: A `bool` indicating whether round down more than 10%
        will be allowed.
    Returns:
        The adjusted value in `int` that is divisible against divisor.
    """
    if min_value is None:
        min_value = divisor
    new_value = max(min_value, int(value + divisor / 2) // divisor * divisor)
    # Make sure that round down does not go down by more than 10%.
    if round_down_protect and new_value < 0.9 * value:
        new_value += divisor
    return int(new_value)
 
def conv_2d(inp, oup, kernel_size=3
### 使用MobileNetV4YOLOv7进行轻量化改进 #### 轻量化背景介绍 为了提升YOLOv7在移动设备上的效率和性能,可以借鉴MobileNetV4的设计理念和技术特性。MobileNetV4通过引入UIB(Universal Inverted Bottleneck)模块以及优化后的NAS配方,在保持高精度的同时显著降低了计算复杂度[^1]。 #### 修方案概述 具体来说,可以通过替换YOLOv7中的原有backbone部分为基于MobileNetV4的新架构来达到轻量化的目的。这不仅能够减少模型大小,还能提高推理速度而不明显牺牲检测效果。 #### 实现细节说明 ##### Backbone 替换 首先需要创建一个新的`MobileNetV4.py`文件,该文件定义了整个MobileNetV4网络结构及其特有的组件如UIB层等。接着将此文件集成到YOLOv7项目中作为新的基础特征提取器替代原有的Darknet53或其他backbone结构[^2]。 ```python from models.common import Conv, SPPF import torch.nn as nn class MobileNetV4(nn.Module): def __init__(self, num_classes=80): super(MobileNetV4, self).__init__() # 定义MobileNetV4的具体层次... def forward(self, x): pass # 前向传播逻辑... def get_mobilenet_v4(): model = MobileNetV4() return model ``` ##### C2f 模块调整 对于YOLOv7中的C2f模块,则可以直接采用MobileNetV4里的UIB单元来进行重构。这样做可以在不增加太多额外开销的情况下增强表达能力,从而有助于善最终的目标检测表现[^3]。 ```python # 在models/yolo.py 中找到对应的C2f类定义位置,并做如下更: class C2f(UIB): # 继承自MobileNetV4UIB基类 ... def _make_layer(self, block, planes, blocks, stride=1): layers = [] downsample = None if isinstance(block, UIB): # 如果当前block是指定类型的UIB,则按照特定规则构建layer列表 ... else: raise ValueError('Unsupported Block Type') return nn.Sequential(*layers) ``` ##### 注意力机制融入 除了上述变外,还可以考虑加入MobileNetV4所独有的Mobile MQA注意力模块YOLOv7的不同阶段之中。这种做法能有效捕捉图像内的全局上下文信息,进而促进更精准的对象定位与分类任务完成[^4]。 ```python # 同样是在适当的位置添加下面这段代码片段: class MobileMQAAttention(nn.Module): ... def apply_attention_module(module_list, position=-1): """ 将指定位置处插入一个Mobile MQA Attention Module """ module_list.insert(position, MobileMQAAttention()) ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值