96SEO 2026-02-20 05:21 40
。

它采用了创新的建筑模块设计#xff0c;包括三明治布局和级联…一、本文介绍
本文给大家带来的改进机制是主干网络一个名字EfficientViT的特征提取网络(和之前发布的只是同名但不是同一个)其基本原理是提升视觉变换器在高效处理高分辨率视觉任务的能力。
它采用了创新的建筑模块设计包括三明治布局和级联群组注意力模块。
其是一种高效率的特征提取网络训练速度非常快推理速度也要比基础版本的要快其效果完爆之前的MobileNetV3等轻量化网络模型。
欢迎大家订阅本专栏本专栏每周更新3-5篇最新机制更有包含我所有改进的文件和交流群提供给大家。
专栏回顾YOLOv8改进系列专栏——本专栏持续复习各种顶会内容——科研必备
EfficientViT的基本原理是提升视觉变换器在高效处理高分辨率视觉任务的能力。
它采用了创新的建筑模块设计包括三明治布局和级联群组注意力模块。
三明治布局在前馈神经网络FFN层之间使用单个受内存限制的多头自注意力机制MHSA以提高内存效率。
级联群组注意力模块通过将不同的特征分割喂给不同的注意力头减少计算冗余并提高注意力的多样性。
下面为大家展示了EfficientViT的整体架构和关键组成部分
架构概览EfficientViT的整体架构分为三个阶段每个阶段都包含了若干EfficientViT块随着阶段的进展特征图的维度会减小而通道数会增加。
三明治布局块展示了EfficientViT块的内部结构它采用了一种三明治布局其中的自注意力层绿色部分被两层前馈神经网络FFN夹在中间。
级联群组注意力这是一个创新的注意力机制通过将输入特征分割成不同的部分分别喂给
EfficientViT_M4,EfficientViT_M5]class
Conv2d_BN(torch.nn.Sequential):def
resolution-10000):super().__init__()self.add_module(c,
torch.nn.BatchNorm2d(b))torch.nn.init.constant_(self.bn.weight,
bn_weight_init)torch.nn.init.constant_(self.bn.bias,
dilationself.c.dilation,groupsself.c.groups)m.weight.data.copy_(w)m.bias.data.copy_(b)return
torch.nn.BatchNorm2d):setattr(net,
torch.nn.Identity())else:replace_batchnorm(child)class
PatchMerging(torch.nn.Module):def
input_resolution):super().__init__()hid_dim
resolutioninput_resolution)self.act
resolutioninput_resolution)self.se
self.conv3(self.se(self.act(self.conv2(self.act(self.conv1(x))))))return
drop0.):super().__init__()self.m
1,devicex.device).ge_(self.drop).div(1
resolution):super().__init__()self.pw1
self.pw2(self.act(self.pw1(x)))return
CascadedGroupAttention(torch.nn.Module):r
num_heads8,attn_ratio4,resolution14,kernels[5,
):super().__init__()self.num_heads
range(num_heads):qkvs.append(Conv2d_BN(dim
resolutionresolution))dws.append(Conv2d_BN(self.key_dim,
groupsself.key_dim,resolutionresolution))self.qkvs
torch.nn.ModuleList(qkvs)self.dws
torch.nn.ModuleList(dws)self.proj
torch.nn.Sequential(torch.nn.ReLU(),
list(itertools.product(range(resolution),
attention_offsets:attention_offsets[offset]
len(attention_offsets)idxs.append(attention_offsets[offset])self.attention_biases
torch.nn.Parameter(torch.zeros(num_heads,
len(attention_offsets)))self.register_buffer(attention_bias_idxs,torch.LongTensor(idxs).view(N,
modeTrue):super().train(mode)if
self.attention_bias_idxs]feats_in
LocalWindowAttention(torch.nn.Module):r
num_heads8,attn_ratio4,resolution14,window_resolution7,kernels[5,
num_heads,attn_ratioattn_ratio,resolutionwindow_resolution,kernelskernels,
self.window_resolution,C).transpose(2,
EfficientViTBlock(torch.nn.Module):
nh8,ar4,resolution14,window_resolution7,kernels[5,
resolutionresolution))self.ffn0
Residual(LocalWindowAttention(ed,
window_resolutionwindow_resolution,kernelskernels))self.dw1
resolutionresolution))self.ffn1
self.ffn1(self.dw1(self.mixer(self.ffn0(self.dw0(x)))))class
EfficientViT(torch.nn.Module):def
img_size400,patch_size16,frozen_stages0,in_chans3,stages[s,
[]],pretrainedNone,distillationFalse,
torch.nn.Sequential(Conv2d_BN(in_chans,
resolutionresolution),torch.nn.ReLU(),Conv2d_BN(embed_dim[0]
torch.nn.ReLU(),Conv2d_BN(embed_dim[0]
torch.nn.ReLU(),Conv2d_BN(embed_dim[0]
range(len(embed_dim))]self.blocks1
1)).append(EfficientViTBlock(stg,
1blk.append(torch.nn.Sequential(Residual(Conv2d_BN(embed_dim[i],
resolutionresolution)),Residual(FFN(embed_dim[i],
))blk.append(PatchMerging(*embed_dim[i:i
resolution_blk.append(torch.nn.Sequential(Residual(Conv2d_BN(embed_dim[i
1],resolutionresolution)),Residual(FFN(embed_dim[i
torch.nn.Sequential(*self.blocks1)self.blocks2
torch.nn.Sequential(*self.blocks2)self.blocks3
torch.nn.Sequential(*self.blocks3)self.width_list
self.patch_embed(x)outs.append(x)x
self.blocks3(x)outs.append(x)return
pretrained_cfgNone,model_cfgEfficientViT_m0):model
EfficientViT(frozen_stagesfrozen_stages,
pretrained:model.load_state_dict(update_weight(model.state_dict(),
torch.load(pretrained)[model]))if
fuse:replace_batchnorm(model)return
pretrained_cfgNone,model_cfgEfficientViT_m1):model
EfficientViT(frozen_stagesfrozen_stages,
pretrained:model.load_state_dict(update_weight(model.state_dict(),
torch.load(pretrained)[model]))if
fuse:replace_batchnorm(model)return
pretrained_cfgNone,model_cfgEfficientViT_m2):model
EfficientViT(frozen_stagesfrozen_stages,
pretrained:model.load_state_dict(update_weight(model.state_dict(),
torch.load(pretrained)[model]))if
fuse:replace_batchnorm(model)return
pretrained_cfgNone,model_cfgEfficientViT_m3):model
EfficientViT(frozen_stagesfrozen_stages,
pretrained:model.load_state_dict(update_weight(model.state_dict(),
torch.load(pretrained)[model]))if
fuse:replace_batchnorm(model)return
pretrained_cfgNone,model_cfgEfficientViT_m4):model
EfficientViT(frozen_stagesfrozen_stages,
pretrained:model.load_state_dict(update_weight(model.state_dict(),
torch.load(pretrained)[model]))if
fuse:replace_batchnorm(model)return
pretrained_cfgNone,model_cfgEfficientViT_m5):model
EfficientViT(frozen_stagesfrozen_stages,
pretrained:model.load_state_dict(update_weight(model.state_dict(),
torch.load(pretrained)[model]))if
fuse:replace_batchnorm(model)return
1model_dict.update(temp_dict)print(floading
第一步还是建立文件我们找到如下ultralytics/nn/modules文件夹下建立一个目录名字呢就是Addmodules文件夹(用群内的文件的话已经有了无需新建)然后在其内部建立一个新的py文件将核心代码复制粘贴进去即可。
此处需要注意我们之前已经修改过一个EfficientViT了所以这里需要加一个2其模型为名字重复实际不是一个。
第二步我们在该目录下创建一个新的py文件名字为__init__.py(用群内的文件的话已经有了无需新建)然后在其内部导入我们的检测头如下图所示。
第三步我门中到如下文件ultralytics/nn/tasks.py进行导入和注册我们的模块(用群内的文件的话已经有了无需重新导入直接开始第四步即可)
从今天开始以后的教程就都统一成这个样子了因为我默认大家用了我群内的文件来进行修改
找到七百多行大概把具体看图片按照图片来修改就行添加红框内的部分注意没有()只是函数名。
str(m)[8:-2].replace(__main__.,
verbose:LOGGER.info(f{i:3}{str(f):20}{n_:3}{m.np:10.0f}
可以在图片中开代码行数没有离开task.py文件都是同一个文件。
同时这个部分有好几个前向传播都很相似大家不要看错了是70多行左右的同时我后面提供了代码大家直接复制粘贴即可有时间我针对这里会出一个视频。
profile:self._profile_one_layer(m,
self.save:y.append(i)else:y.append(None)x
visualize:feature_visualization(x,
到这里就完成了修改部分但是这里面细节很多大家千万要注意不要替换多余的代码导致报错也不要拉下任何一部都会导致运行失败而且报错很难排查很难排查
关注我的其实都知道我大部分的修改都是一样的这个网络需要额外的修改一步就是s一个参数将下面的s改为640即可完美运行
我们找到如下文件ultralytics/utils/torch_utils.py按照如下的图片进行修改否则容易打印不出来计算量。
如果大家在验证的时候报错形状不匹配的错误可以固定验证集的图片尺寸方法如下
找到下面这个文件ultralytics/models/yolo/detect/train.py然后其中有一个类是DetectionTrainer
class中的build_dataset函数中的一个参数rectmode
https://docs.ultralytics.com/tasks/detect#
大家可以下载官方的与训练权重进行加载训练用字符串格式放在参数list里就行-
warnings.filterwarnings(ignore)
YOLO(替换你的yaml文件地址)model.load(yolov8n.pt)
model.train(datar你的数据集的地址,cacheFalse,imgsz640,epochs150,batch4,close_mosaic0,workers0,device0,optimizerSGDampFalse,)六、成功运行记录
下面是成功运行的截图已经完成了有1个epochs的训练图片太大截不全第2个epochs了。
到此本文的正式分享内容就结束了在这里给大家推荐我的YOLOv8改进有效涨点专栏本专栏目前为新开的平均质量分98分后期我会根据各种最新的前沿顶会进行论文复现也会对一些老的改进机制进行补充如果大家觉得本文帮助到你了订阅本专栏关注后续更多的更新~
专栏回顾YOLOv8改进系列专栏——本专栏持续复习各种顶会内容——科研必备
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback