ToB企服应用市场:ToB评测及商务社交产业平台

标题: 改进yolov8|FasterNet更换主干网络,跑得飞快!! [打印本页]

作者: 大号在练葵花宝典    时间: 2024-10-19 05:25
标题: 改进yolov8|FasterNet更换主干网络,跑得飞快!!
各位哥哥姐姐弟弟妹妹各人好,我是干饭王刘姐,主业干饭,主业2.0计算机研究生在读。
和我一起来改进yolov8变身计算机大牛吧!
本文中的论文笔记都是刘姐亲身整理,原创整理哦~
  一、FasterNet简介

论文地址

   https://export.arxiv.org/pdf/2303.03667v1.pdf
  代码地址

   https://github.com/JierunChen/FasterNet
  论文内容(原创整理)


前述


贡献


具体


显著效果

时间进步巨大50%+,GFLOPs减少60%+
改进过程

FasterNet核心代码(添加到ultralytics/nn/modules/block.py):

  1. # --------------------------FasterNet----------------------------
  2. from timm.models.layers import DropPath
  3. class Partial_conv3(nn.Module):
  4.     def __init__(self, dim, n_div, forward):
  5.         super().__init__()
  6.         self.dim_conv3 = dim // n_div
  7.         self.dim_untouched = dim - self.dim_conv3
  8.         self.partial_conv3 = nn.Conv2d(self.dim_conv3, self.dim_conv3, 3, 1, 1, bias=False)
  9.         if forward == 'slicing':
  10.             self.forward = self.forward_slicing
  11.         elif forward == 'split_cat':
  12.             self.forward = self.forward_split_cat
  13.         else:
  14.             raise NotImplementedError
  15.     def forward_slicing(self, x):
  16.         # only for inference
  17.         x = x.clone()  # !!! Keep the original input intact for the residual connection later
  18.         x[:, :self.dim_conv3, :, :] = self.partial_conv3(x[:, :self.dim_conv3, :, :])
  19.         return x
  20.     def forward_split_cat(self, x):
  21.         # for training/inference
  22.         x1, x2 = torch.split(x, [self.dim_conv3, self.dim_untouched], dim=1)
  23.         x1 = self.partial_conv3(x1)
  24.         x = torch.cat((x1, x2), 1)
  25.         return x
  26. class MLPBlock(nn.Module):
  27.     def __init__(self,
  28.                  dim,
  29.                  n_div,
  30.                  mlp_ratio,
  31.                  drop_path,
  32.                  layer_scale_init_value,
  33.                  act_layer,
  34.                  norm_layer,
  35.                  pconv_fw_type
  36.                  ):
  37.         super().__init__()
  38.         self.dim = dim
  39.         self.mlp_ratio = mlp_ratio
  40.         self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity()
  41.         self.n_div = n_div
  42.         mlp_hidden_dim = int(dim * mlp_ratio)
  43.         mlp_layer = [
  44.             nn.Conv2d(dim, mlp_hidden_dim, 1, bias=False),
  45.             norm_layer(mlp_hidden_dim),
  46.             act_layer(),
  47.             nn.Conv2d(mlp_hidden_dim, dim, 1, bias=False)
  48.         ]
  49.         self.mlp = nn.Sequential(*mlp_layer)
  50.         self.spatial_mixing = Partial_conv3(
  51.             dim,
  52.             n_div,
  53.             pconv_fw_type
  54.         )
  55.         if layer_scale_init_value > 0:
  56.             self.layer_scale = nn.Parameter(layer_scale_init_value * torch.ones((dim)), requires_grad=True)
  57.             self.forward = self.forward_layer_scale
  58.         else:
  59.             self.forward = self.forward
  60.     def forward(self, x):
  61.         shortcut = x
  62.         x = self.spatial_mixing(x)
  63.         x = shortcut + self.drop_path(self.mlp(x))
  64.         return x
  65.     def forward_layer_scale(self, x):
  66.         shortcut = x
  67.         x = self.spatial_mixing(x)
  68.         x = shortcut + self.drop_path(
  69.             self.layer_scale.unsqueeze(-1).unsqueeze(-1) * self.mlp(x))
  70.         return x
  71. class BasicStage(nn.Module):
  72.     def __init__(self,
  73.                  dim,
  74.                  depth=1,
  75.                  n_div=4,
  76.                  mlp_ratio=2,
  77.                  layer_scale_init_value=0,
  78.                  norm_layer=nn.BatchNorm2d,
  79.                  act_layer=nn.ReLU,
  80.                  pconv_fw_type='split_cat'
  81.                  ):
  82.         super().__init__()
  83.         dpr = [x.item()
  84.                for x in torch.linspace(0, 0.0, sum([1, 2, 8, 2]))]
  85.         blocks_list = [
  86.             MLPBlock(
  87.                 dim=dim,
  88.                 n_div=n_div,
  89.                 mlp_ratio=mlp_ratio,
  90.                 drop_path=dpr[i],
  91.                 layer_scale_init_value=layer_scale_init_value,
  92.                 norm_layer=norm_layer,
  93.                 act_layer=act_layer,
  94.                 pconv_fw_type=pconv_fw_type
  95.             )
  96.             for i in range(depth)
  97.         ]
  98.         self.blocks = nn.Sequential(*blocks_list)
  99.     def forward(self, x):
  100.         x = self.blocks(x)
  101.         return x
  102. class PatchEmbed_FasterNet(nn.Module):
  103.     def __init__(self, in_chans, embed_dim, patch_size, patch_stride, norm_layer=nn.BatchNorm2d):
  104.         super().__init__()
  105.         self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_stride, bias=False)
  106.         if norm_layer is not None:
  107.             self.norm = norm_layer(embed_dim)
  108.         else:
  109.             self.norm = nn.Identity()
  110.     def forward(self, x):
  111.         x = self.norm(self.proj(x))
  112.         return x
  113.     def fuseforward(self, x):
  114.         x = self.proj(x)
  115.         return x
  116. class PatchMerging_FasterNet(nn.Module):
  117.     def __init__(self, dim, out_dim, k, patch_stride2, norm_layer=nn.BatchNorm2d):
  118.         super().__init__()
  119.         self.reduction = nn.Conv2d(dim, out_dim, kernel_size=k, stride=patch_stride2, bias=False)
  120.         if norm_layer is not None:
  121.             self.norm = norm_layer(out_dim)
  122.         else:
  123.             self.norm = nn.Identity()
  124.     def forward(self, x):
  125.         x = self.norm(self.reduction(x))
  126.         return x
  127.     def fuseforward(self, x):
  128.         x = self.reduction(x)
  129.         return x
复制代码
并在ultralytics/nn/modules/block.py中最上方“all”中引用‘BasicStage’, ‘PatchEmbed_FasterNet’, ‘PatchMerging_FasterNet’

在ultralytics/nn/modules/init.py中

  1. from .block import (....,BasicStage,PatchEmbed_FasterNet,PatchMerging_FasterNet)
复制代码
在 ultralytics/nn/tasks.py 上方

  1. from ultralytics.nn.modules import (....BasicStage, PatchEmbed_FasterNet, PatchMerging_FasterNet)
复制代码
在parse_model解析函数中添加如下代码:

  1. if m in (... BasicStage, PatchEmbed_FasterNet, PatchMerging_FasterNet):
复制代码

  1.         elif m in [BasicStage]:
  2.                 args.pop(1)
复制代码
在 ultralytics/nn/tasks.py 中的self.model.modules()后面添加

  1.                 if type(m) is PatchEmbed_FasterNet:
  2.                     m.proj = fuse_conv_and_bn(m.proj, m.norm)
  3.                     delattr(m, 'norm')  # remove BN
  4.                     m.forward = m.fuseforward
  5.                 if type(m) is PatchMerging_FasterNet:
  6.                     m.reduction = fuse_conv_and_bn(m.reduction, m.norm)
  7.                     delattr(m, 'norm')  # remove BN
  8.                     m.forward = m.fuseforward
复制代码
在ultralytics/cfg/models/v8文件夹下新建yolov8-FasterNet.yaml文件

[code]# Ultralytics YOLO




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4