yolov8改进/更换mobilenetv4

写在前面

我真是服了这个网页的专栏精选,啥汤姆的都要米,看一个要米,再看一个也要米。我直接自己改,改完我分享一波。

先看运行成功的截图:

改动的文件

都可以去我的github上找到源文件。放一下地址GitHub - cfk4563/ultralytics: NEW - YOLOv8

 改动的地方在one-band分支。

去我的github复制一下文件,但是要注意的是,我使用的是yolov8n.yaml文件。mobilenetv4里面的配置需要根据你选择模型的大小修改。然后我使用的是单通道的数据集,输入通道为1,如果是正常的RGB图像需要把mobilenetv4.py第13行的1改为3。

改动细节

 看上面的图就知道,改动文件细节,git给标蓝了。

找到__init__文件(文件位置以标蓝),把下面这语句写进去。

from .mobilenetv4 import MobileNetV4ConvSmall

然后在代码最后去注册一下

然后去task.py找到这个导包的语句(实际不为空),在后面加上MobileNetV4ConvSmall。

from ultralytics.nn.modules import ()

然后找到parse_model这个模块,大概在900行,在这个模块中添加代码

注意看git改动的标记,代码放在下面

        elif m in {MobileNetV4ConvSmall, }:
            c2 = args[1]
            c1 = args[2]
        else:
            c2 = ch[f]

        if m in {MobileNetV4ConvSmall, }:
            m_ = m(args[2])  # module
            t = "ultralytics.nn.modules.mobilenetv4"
        else:
            m_ = nn.Sequential(*(m(*args) for _ in range(n))) if n > 1 else m(*args)  # module
            t = str(m)[8:-2].replace("__main__.", "")  # module type

搞完之后,改一下yaml文件,代码放在下面

backbone:
  # [from, repeats, module, args]
  - [-1, 1, MobileNetV4ConvSmall, [1, 32, 0]] # 0-P1/2
  - [-1, 1, MobileNetV4ConvSmall, [32, 32, 1]]
  - [-1, 1, MobileNetV4ConvSmall, [32, 64, 2]]
  - [-1, 1, MobileNetV4ConvSmall, [64, 128, 3]]
  - [-1, 1, MobileNetV4ConvSmall, [128, 128, 4]]
  - [-1, 1, MobileNetV4ConvSmall, [128, 256, 5]]
  - [-1, 1, SPPF, [1024, 5]] # 6

# YOLOv8.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 3], 1, Concat, [1]] # cat backbone P4
  - [-1, 3, C2f, [512]] # 12

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 2], 1, Concat, [1]] # cat backbone P3
  - [-1, 3, C2f, [256]] # 12 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 9], 1, Concat, [1]] # cat head P4
  - [-1, 3, C2f, [512]] # 15 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 5], 1, Concat, [1]] # cat head P5
  - [-1, 3, C2f, [1024]] # 18 (P5/32-large)

  - [[12, 15, 18], 1, Detect, [nc]] # Detect(P3, P4, P5)

我解释一下MobileNetV4ConvSmall后面接的参数含义。后面接了列表里面三个参数:分别是,输入通道,输出通道,运行MobileNetV4第几层(这个我在原文基础上改动过,就只有MobileNetV4这一块可以这样解释。其他模块不具有参照意义)。还是一样,如果数据集是RGB影像,输入通道改成3。

改完应该可以训练了。这个我还不知道效果怎么样,自己看着来。我的数据集是单通道输入。不能直接拿来用,需要自己改两个数字,只能用yolov8n.yaml,其他大小就还需要改。有问题可以交流。

### YOLOv8 使用 MobileNetV4 进行轻量化的改进方法 #### 1. 替换特征提取网络 为了实现 YOLOv8 的轻量化,可以将默认的骨干网络替换为更高效的 MobileNetV4 架构。这一步的关键在于重新定义 `ultralytics` 中的 backbone 部分。 通过引入 MobileNetV4 模型并将其作为新的主干网路嵌入到 YOLOv8 中,能够显著降低计算复杂度和参数数量,从而提升推理速度[^2]。 以下是具体的代码调整: ```python from ultralytics.nn.backbone.MobileNetV4 import * # 假设已存在 MobileNetV4 的实现 def build_mobilenetv4_backbone(): model = MobileNetV4() # 初始化 MobileNetV4 模型 return model.eval() ``` 在此基础上,需进一步修改 YOLOv8 的配置文件 (`yolov8.yaml`) 或源码中的 Backbone 定义部分,指定使用上述函数创建的新模型结构。 --- #### 2. 数据预处理优化 对于轻量化模型而言,输入图像分辨率的选择至关重要。通常情况下,较低分辨率的数据集有助于减少计算开销而不明显影响精度。因此,在数据加载阶段应适当缩小图片尺寸至适合 MobileNetV4 处理的最佳范围 (如 224x224)[^1]。 更新后的数据管道如下所示: ```python import albumentations as A from torch.utils.data import DataLoader, Dataset class CustomDataset(Dataset): def __init__(self, image_paths, labels, transform=None): self.image_paths = image_paths self.labels = labels self.transform = transform def __len__(self): return len(self.image_paths) def __getitem__(self, idx): img_path = self.image_paths[idx] label = self.labels[idx] image = cv2.imread(img_path) if self.transform is not None: transformed = self.transform(image=image) image = transformed['image'] return image, label transform = A.Compose([ A.Resize(224, 224), # 调整大小适配 MobileNetV4 输入需求 A.Normalize(mean=[0.485], std=[0.229]), ]) dataset = CustomDataset(image_paths=["path/to/images"], labels=[], transform=transform) dataloader = DataLoader(dataset, batch_size=32, shuffle=True) ``` 此段脚本展示了如何利用 Albumentations 库完成必要的增强操作以及标准化流程来匹配目标框架的要求。 --- #### 3. 训练过程微调 由于更换了不同的基础架构,原有的超参可能不再适用。建议从以下几个方面着手调整训练策略: - **学习率调度器**: 尝试采用 CosineAnnealingLR 或 OneCyclePolicy 来动态调节 LR。 - **权重衰减系数**: 减少正则化强度以防止过拟合现象发生。 - **冻结层设置**: 初始几轮迭代期间保持迁移自 ImageNet 的预训练权值不变,仅允许新增加的部分参与反向传播更新。 最终完整的训练逻辑可参照下面模板编写而成: ```python import torch.optim as optim from torch.optim.lr_scheduler import CosineAnnealingLR model = build_mobilenetv4_backbone() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) scheduler = CosineAnnealingLR(optimizer, T_max=len(dataloader)) for epoch in range(num_epochs): running_loss = 0.0 for i, data in enumerate(dataloader, 0): inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() scheduler.step() running_loss += loss.item() print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/(i+1)}') ``` 以上片段涵盖了整个端到端的学习机制描述。 --- #### 4. 性能评估与验证 最后一步是对改造后的系统进行全面测试,记录各项指标表现并与原版对比分析差异所在。重点关注 [email protected]、FPS 等核心数值变化情况。 ---
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值