YOLOv5结合华为诺亚VanillaNet Block模块

在这里插入图片描述

🗝️YOLOv5实战宝典--星级指南:从入门到精通,您不可错过的技巧

  -- 聚焦于YOLO的 最新版本对颈部网络改进、添加局部注意力、增加检测头部,实测涨点

💡 深入浅出YOLOv5:我的专业笔记与技术总结

  -- YOLOv5轻松上手, 适用技术小白,文章代码齐全,仅需 一键train,解决 YOLOv5的技术突破和创新潜能

❤️ YOLOv5创新攻略:突破技术瓶颈,激发AI新潜能"

   -- 指导独特且专业的分析, 也支持对YOLOv3、YOLOv4、YOLOv8等网络的修改

🎈 改进YOLOv5📖 ,改进点包括:    替换多种骨干网络/轻量化网络, 添加多种注意力包含自注意力/上下文注意力/自顶向下注意力机制/空间通道注意力/,设计不同的网络结构,助力涨点!!!

在这里插入图片描述

YOLOv5结合华为诺亚VanillaNet Block模块

  • 介绍
  • 核心代码
  • 加入YOLOv5
  • yaml文件:
  • 运行结果

论文: VanillaNet: the Power of Minimalism in
Deep Learning
代码: https://link.zhihu.com/?target=https%3A//github.com/huawei-noah/VanillaNet
在这里插入图片描述

介绍

  基础模型的设计哲学往往遵循“更多即更好”的原则,在计算机视觉和自然语言处理领域取得的显著成就中得到了验证。尽管如此,对于Transformer模型而言,随之而来的优化挑战和固有的复杂性也促使了向更简洁设计的转变。

  本研究引入了VanillaNet,一种在设计上追求简洁性的神经网络架构。VanillaNet避免了复杂的构建如高深度网络结构、捷径连接和自注意力机制,呈现出一种令人耳目一新的简明强大。它的每一层都经过精心设计,简洁且直接,训练后的非线性激活函数被精简,以还原至最初的简洁结构。

  VanillaNet以其对复杂性的挑战克服,成为资源受限环境下的理想选择,其易于理解和简化的构架开启了高效部署的新可能。广泛的实验结果验证了VanillaNet在图像分类、目标检测和语义分割等多项任务中可与知名的深度网络和视觉Transformer相媲美的性能,彰显了极简主义在深度学习中的潜力。VanillaNet的创新之路预示着重新定义行业格局和挑战传统模型的巨大潜力,为简洁而有效的模型设计铺开了全新的道路。

在这里插入图片描述
在这里插入图片描述
  为了解决多头自注意力(MHSA)在可扩展性方面的问题,先前的研究提出了各种稀疏注意力机制,其中查询只关注有限的键值对,而非全部。通常依赖于静态的手工设计模式或在所有查询之间共享键值对的采样子集,缺乏自适应性和独立性。

  本研究提出了VanillaNet,一种简单而高效的神经网络架构,它采用了几层卷积层,去除了所有分支,甚至包括捷径连接。通过调整VanillaNets中的层数来构建一系列网络。VanillaNet-9在保持79.87%准确率的同时,将推理速度降至2.91ms,远超ResNet-50和ConvNextV2-P。

  令人惊讶的成果突显了VanillaNet在实时处理任务中的潜力。进一步扩展了通道数量和池化大小,从而得到了VanillaNet-13-1.5׆,在ImageNet上达到了83.11%的Top-1准确率。这表明,通过简单的扩展,VanillaNets可以实现与深层网络相当的性能。不同架构的深度与推理速度的对比显示,网络的深度而非参数数量与推理速度紧密相关,强调了简单和浅层网络在实时处理任务中的巨大潜力。VanillaNet在所有考察的架构中实现了最优的速度与准确度的平衡,特别是在GPU延迟较低的情况下,表明了在充分计算能力支持下VanillaNet的卓越性🍀。

核心代码

#Copyright (C) 2023. Huawei Technologies Co., Ltd. All rights reserved.#This program is free software; you can redistribute it and/or modify it under the terms of the MIT License.#This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MIT License for more details.import torch
import torch.nn as nn
import torch.nn.functional as F
from timm.models.layers import weight_init, DropPath
from timm.models.registry import register_modelclass activation(nn.ReLU):def __init__(self, dim, act_num=3, deploy=False):super(activation, self).__init__()self.deploy = deployself.weight = torch.nn.Parameter(torch.randn(dim, 1, act_num*2 + 1, act_num*2 + 1))self.bias = Noneself.bn = nn.BatchNorm2d(dim, eps=1e-6)self.dim = dimself.act_num = act_numweight_init.trunc_normal_(self.weight, std=.02)def forward(self, x):if self.deploy:return torch.nn.functional.conv2d(super(activation, self).forward(x), self.weight, self.bias, padding=(self.act_num*2 + 1)//2, groups=self.dim)else:return self.bn(torch.nn.functional.conv2d(super(activation, self).forward(x),self.weight, padding=(self.act_num*2 + 1)//2, groups=self.dim))def _fuse_bn_tensor(self, weight, bn):kernel = weightrunning_mean = bn.running_meanrunning_var = bn.running_vargamma = bn.weightbeta = bn.biaseps = bn.epsstd = (running_var + eps).sqrt()t = (gamma / std).reshape(-1, 1, 1, 1)return kernel * t, beta + (0 - running_mean) * gamma / stddef switch_to_deploy(self):kernel, bias = self._fuse_bn_tensor(self.weight, self.bn)self.weight.data = kernelself.bias = torch.nn.Parameter(torch.zeros(self.dim))self.bias.data = biasself.__delattr__('bn')self.deploy = Trueclass Block(nn.Module):def __init__(self, dim, dim_out, act_num=3, stride=2, deploy=False, ada_pool=None):super().__init__()self.act_learn = 1self.deploy = deployif self.deploy:self.conv = nn.Conv2d(dim, dim_out, kernel_size=1)else:self.conv1 = nn.Sequential(nn.Conv2d(dim, dim, kernel_size=1),nn.BatchNorm2d(dim, eps=1e-6),)self.conv2 = nn.Sequential(nn.Conv2d(dim, dim_out, kernel_size=1),nn.BatchNorm2d(dim_out, eps=1e-6))if not ada_pool:self.pool = nn.Identity() if stride == 1 else nn.MaxPool2d(stride)else:self.pool = nn.Identity() if stride == 1 else nn.AdaptiveMaxPool2d((ada_pool, ada_pool))self.act = activation(dim_out, act_num)def forward(self, x):if self.deploy:x = self.conv(x)else:x = self.conv1(x)x = torch.nn.functional.leaky_relu(x,self.act_learn)x = self.conv2(x)x = self.pool(x)x = self.act(x)return xdef _fuse_bn_tensor(self, conv, bn):kernel = conv.weightbias = conv.biasrunning_mean = bn.running_meanrunning_var = bn.running_vargamma = bn.weightbeta = bn.biaseps = bn.epsstd = (running_var + eps).sqrt()t = (gamma 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/208536.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM的课程资源管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

算法的奥秘:常见的六种算法(算法导论笔记2)

算法的奥秘:种类、特性及应用详解(算法导论笔记1) 上期总结算法的种类和大致介绍,这一期主要讲常见的六种算法详解以及演示。 排序算法: 排序算法是一类用于对一组数据元素进行排序的算法。根据不同的排序方式和时间复…

【PHP】PHP生成全年日历

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

〖大前端 - 基础入门三大核心之JS篇㊶〗- DOM事件传播和事件监听方法addEventListener()

说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

【kubernetes】k8s架构之节点

文章目录 1、集群架构示意图2、概述3、管理3.1 节点名称唯一性3.2 节点自注册3.3 手动节点管理 4、节点状态4.1 地址(Addresses)4.2 状况(Condition)4.3 容量(Capacity)与可分配(Allocatable&am…

【Linux】进程间通信——进程间通信的介绍和分类、管道、匿名管道、命名管道、匿名管道与命名管道的区别

文章目录 进程间通信1.进程间通信的介绍1.1目的和发展 2.进程间通信分类3.管道3.1匿名管道3.1.1匿名管道的原理(文件角度)3.1.2匿名管道的原理(内核角度)3.1.3管道读写规则3.1.4管道特点 3.2命名管道3.2.1创建命名管道3.2.2命名管…

redis的性能管理及集群架构(主从复制、哨兵模式)

一、redis的性能管理 1、内存指标info memory 内存指标(重要) used_memory:853736 数据占用的内存 used_memory_rss:10551296 redis向操作系统申请的内存 used_memory_peak:853736 redis使用内存的峰值 注:单位:字节 系…

如何使用ArcGIS Pro进行坐标转换

不同来源的数据坐标系可能是不同的,为了统一使用这些数据就需要进行坐标转换,ArcGIS Pro作为专业的GIS软件,坐标转换功能肯定也是包含的,这里为大家介绍一下ArcGIS Pro如何进行坐标转换,希望能对你有所帮助。 数据来源…

2023-11-22 LeetCode每日一题(网格中的最小路径代价)

2023-11-22每日一题 一、题目编号 2304. 网格中的最小路径代价二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数矩阵 grid ,矩阵大小为 m x n ,由从 0 到 m * n - 1 的不同整数组成。你可以在此矩阵中,从一个…

Python中控制台如何展示进度条——tqdm库使用

在 Python 中可以使用特定的库来创建控制台进度条,其中 tqdm 是一个常用的选择,它能够方便地显示进度条并跟踪迭代的进度。你可以通过 pip 安装 tqdm 库: pip install tqdm包装迭代器: 使用 tqdm 来包装你的迭代器,比…

Tomcat实现WebSocket即时通讯 Java实现WebSocket的两种方式

HTTP协议是“请求-响应”模式,浏览器必须先发请求给服务器,服务器才会响应该请求。即服务器不会主动发送数据给浏览器。 实时性要求高的应用,如在线游戏、股票实时报价和在线协同编辑等,浏览器需实时显示服务器的最新数据&#x…

HQL刷题 50道

HQL刷题 50道 尚硅谷HQL刷题网站 答案 1.查询累积销量排名第二的商品 select sku_id from (select sku_id, dense_rank() over (order by total desc) rnfrom (select sku_id, sum(sku_num) totalfrom order_detailgroup by sku_id) t1) t2 where rn 2;2.查询至少连续三天下…