分享免费的编程资源和教程

网站首页 > 技术教程 正文

YOLO算法改进Backbone系列之:EffificientFormer

goqiw 2024-10-20 07:28:22 技术教程 10 ℃ 0 评论

摘要:视觉Transformer在计算机视觉任务领域发展循序,取得了令人深刻的优异表现。但是由于模型中注意力机制的设计和海量的参数使得基于ViT的模型往往比轻量级的卷积模型慢好几倍。因此使得VT的实时性部署就十分具有挑战性,尤其想在移动端这种资源受限的硬件上。近期有的研究尝试通过NAS或混合设计化简ViT的计算复杂度,但是推理速度仍然不尽如人意。从而衍生一个重要的问题:Transformer真的能在保持高性能的前提下达到和MobileNet一样的速度吗?

为了回答这一问题本文首先回顾了ViT的网络结构额其中使用的运算操作,找到其中低效的部分。然后本文引入一个维度一致的Transformer模型作为设计范式。最后本文进行延迟驱动的裁剪惹怒来获得一系列EfficientFormer。实验结果显示获得的模型在移动端上性能和推理速度都十分有益,最优秀的模型在ImageNet-1K上达到了79.2%的分类精度同时在iPhone12上的推理速度进位1.6ms,比MobineNet的速度还快。本文最大的模型L7则达到了7.0ms推理速度下83.3%的分类精度,本文的工作证明了对Transformer进行设计后可以在移动端同时保证高精度和快速推理

transformer 运行速度慢的原因分析:

  • l参数量大
  • 随着 token 长度增加计算复杂度呈二次增加
  • norm layer 不可融合
  • 缺乏编译器级别优化 (比如 CNN 中的 Winograd)

本文提出了一种dimension-consistent的纯transformer网络,另外通过 latency-driven slimming来得到一系列最终模型 (面向运行时间优化,而不是 MAC 或参数量)

  • 大 kernel 和 stride 的 patch embedding 是在移动设备上的速度瓶颈:由 DeiT-S、PoolFormer 与 LeViTate-256 的对比可以看出,慢的原因主要是 large-kernel 卷积在编译器级别没有类似 Winograd 之类的优化,这里替换成几个 3x3 卷积代替直连能加速
  • 一致的特征维数对于 token mixer 的选择很重要:token mixer 的可选方案有传统的拥有去哪聚感受野的 MHSA mixer、更复杂的 shifted window attention、类似 pooling 的非参数化算子。其中 shifted window 算子目前大部分移动设备编译器都不支持,主要关心运算高效的 pooling token mixer 和精度更优的 MHSA。本文设计在 4D 特征和 3D MHSA 中尽量不用 reshape
  • conv-bn 的延迟比 LN(GN)-Linear 更优,掉点可接受:因为 BN 在测试阶段吸到 conv 中能降低测试延迟,本文中在 4D 特征中尽量使用 conv-bn 结构,3D 特征中使用 LN 为了获取更高精度
  • 非线性层的延迟取决于硬件和编译器:GeLU 在 iphone12 上几乎不比 relu 慢,但是 HardSwish 很慢(LeViT-256 在使用 HardSwish 时延迟为 44.5 ms,使用 GeLU 是 11.9 ms),本文使用 GeLU 作为非线性层
  • 整个网络由一个 patch embeding 和一系列 meta transformer blocks (MB) 构成,其中 MB 是 tokenmixer 后接 MLP 构成
  • 在 EfficientFormer中,使用了 3x3 卷积来构建 patch embedding layer
  • 为了保持每个block内的特征维度的一致性,同时有效地利用 attention 机制来提升模型性能,论文先用基于 4D Tensor 的卷积操作(标记为 MB4D)构建了前3个stage,再使用基于3D Tensor的注意力机制模块(标记为 MB3D)完善和构建了后2个stage
  • 在MB4D中,作者使用了Pooling 操作来作为token mixer,同时使用了 CONV-BN来构建 MLP。
  • 在MB3D中,作者使用了MHSA(multi-head self-attention)作为token mixer,使用 LN-Linear的方式构建 MLP
  • 激活函数统一使用了GeLU形式
  • Patch Embedding:2个3x3卷积,步长为2

EfficientFormer变体结构配置信息如下

在YOLOv5项目中添加模型作为Backbone使用的教程:

(1)将YOLOv5项目的models/yolo.py修改parse_model函数以及BaseModel的_forward_once函数



(2)在models/backbone(新建)文件下新建Efficientformer.py,添加如下的代码:

(3)在models/yolo.py导入模型并在parse_model函数中修改如下(先导入文件):

(4)在model下面新建配置文件:yolov5_effcientformer.yaml

(5)运行验证:在models/yolo.py文件指定--cfg参数为新建的

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表