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_model


class activation(nn.ReLU):
    def __init__(self, dim, act_num=3, deploy=False):
        super(activation, self).__init__()
        self.deploy = deploy
        self.weight = torch.nn.Parameter(torch.randn(dim, 1, act_num*2 + 1, act_num*2 + 1))
        self.bias = None
        self.bn = nn.BatchNorm2d(dim, eps=1e-6)
        self.dim = dim
        self.act_num = act_num
        weight_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 = weight
        running_mean = bn.running_mean
        running_var = bn.running_var
        gamma = bn.weight
        beta = bn.bias
        eps = bn.eps
        std = (running_var + eps).sqrt()
        t = (gamma / std).reshape(-1, 1, 1, 1)
        return kernel * t, beta + (0 - running_mean) * gamma / std
    
    def switch_to_deploy(self):
        kernel, bias = self._fuse_bn_tensor(self.weight, self.bn)
        self.weight.data = kernel
        self.bias = torch.nn.Parameter(torch.zeros(self.dim))
        self.bias.data = bias
        self.__delattr__('bn')
        self.deploy = True


class Block(nn.Module):
    def __init__(self, dim, dim_out, act_num=3, stride=2, deploy=False, ada_pool=None):
        super().__init__()
        self.act_learn = 1
        self.deploy = deploy
        if 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 x

    def _fuse_bn_tensor(self, conv, bn):
        kernel = conv.weight
        bias = conv.bias
        running_mean = bn.running_mean
        running_var = bn.running_var
        gamma = bn.weight
        beta = bn.bias
        eps = bn.eps
        std = (running_var + eps).sqrt()
        t = (gamma 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

出海企业首选的免费开源财务管理系统解决方案

计费与订阅管理 Odoo计费与订阅管理解决方案可帮助您同步从订单、计费到收入确认的复杂流程 Odoo Subscriptions将计费与订阅置于核心业务流程中,将其从普通的后端功能转化为具有决定性意义的战略性业务工具。Odoo统一计费框架支持根据事务、订阅、使用量计费以及…

大数据题目的解题技巧

目录 大数据题目的技巧总括 实例精析 实例一 实例二 实例三 大数据题目的技巧总括 (1)哈希函数可以把数据按照种类均匀分流; (2)布隆过滤器用于集合的建立与查询,并可以节省大量空间; &…

前缀和的动态维护——树状数组[C/C++]

文章目录 前言lowbitlowbit的定义lowbit的计算 树状数组的思想树状数组的操作单点修改 update前缀查询 query树状数组的建立 build 前言 树状数组巧妙了利用位运算和树形结构实现了允许单点修改的情况下,动态维护前缀和,并且实现单点修改和前缀和查询的效…

柱形图:制作图表时,有时会遇到柱形图系列没有居中显示,例如:

问题描述 制作图表时,有时会遇到柱形图系列没有居中显示,例如: 原因分析 柱形图的「分类」和「系列名」均选择了「地区」,导致分类下存在不同的系列,那么当前分类下没有的系列就会存在「空白占位」。 解决方案 此时…

多普勒流速仪的功能作用是什么?

我国地域广大,各地降雨分布不均,某些城市经常会出现连续的降雨进而导致城市排水压力过大,为了提高城市应对排水过量的极端情况的出现,亟需一种方案能够对城市排水进行有效及时的监测,从而能够及时的采取应对方案。 在污…

区域人员超限AI算法的介绍及TSINGSEE视频智能分析技术的行业应用

视频AI智能分析已经渗透到人类生活及社会发展的各个方面。从生活中的人脸识别、停车场的车牌识别、工厂园区的翻越围栏识别、入侵识别、工地的安全帽识别、车间流水线产品的品质缺陷AI检测等,AI智能分析技术无处不在。在某些场景中,重点区域的人数统计与…

详解Java的static关键字

文章目录 🎄静态方法🌺静态方法和非静态方法对比🛸静态方法实例🛸非静态方法实例 🌹static关键字⭐static变量⭐static代码块 🎄静态方法 不依赖于对象实例:静态方法不需要依赖于任何对象实例&…

香港高端人才通行证计划申请(包括条件)你需要知道的这些真相!

香港高端人才通行证计划申请(包括条件)你需要知道的这些真相! 香港高才通计划从刚推出就带着“光速获批“的光环,吸引了大批高学历和高收入人士,后续也因它申请要求简单、明确,获批率高等优势,火…

飞桨——总结PPOCRLabel中遇到的坑

操作系统:win10 python环境:python3.9 paddleocr项目版本:2.7 1.报错:ModuleNotFoundError: No module named Polygon(已解决) 已解决所以没有复现报错内容 尝试方法一:直接使用pip命令安装&…

rook-ceph部署

rook是云原生存储编排器,本身不提供存储。 下载 git clone --single-branch --branch v1.11.4 https://github.com/rook/rook.git cd rook/deploy/examples 修改镜像地址images.txt operator方式部署rook kubectl apply -f crds.yaml -f common.yaml -f operator…

java实现置顶功能

目录 一、需求描述 二、功能呈现 (一)需求分析 (二)关键设计披露 1、数据库字段 2、查询语句 一、需求描述 在查看公司列表数据时,我想最先看到我常用的公司。 也就是,我想把这个公司放在最前面&am…

【Windows 常用工具系列 13 -- Confluence 如何快速输入代码块 code block】

文章目录 Confluence 如何快速输入代码块方法二 Confluence 如何快速输入代码块 在使用使用 confluence 进行文档编辑时,有时需要贴上部分代码,但是直接贴代码在 confluence上,显示效果不是太好看,所以confluence 给我们提供了符…

DolphinDB 浙商银行 | 第二期现场培训圆满结束

自 DolphinDB 高级工程师计划开展以来,客户们纷纷响应,除了定期收看我们每周三开设的线上公开课外,也有部分客户报名参加了 “总部工程师培训计划” 。 上周,我们迎来了总部培训的第二期学员:来自浙商银行的4位策略研…

【qsort学习及改造冒泡排序能排序任何数】

qsort学习及改造冒泡排序能排序任何数 qsort的使用 qsort的使用 这个函数也不是很复杂!!! qsort(void*base,size_t num,size_t width,int(int (__cdecl *compare )(const void *elem1, const void *elem2 )))  void * base,为数组的基地…

cocos2dx ​​Animate3D (一)

3D相关的动画都是继承Grid3DAction 本质上是用GirdBase进行创建动画的小块。 Shaky3D 晃动特效 // 持续时间(时间过后不会回到原来的样子) // 整个屏幕被分成几行几列 // 晃动的范围 // z轴是否晃动 static Shaky3D* create(float initWithDuration, const Size& …

计数排序+桶排序+基数排序 详讲(思路+图解+代码详解)

文章目录 计数排序桶排序基数排序一、计数排序概念:写法一:写法二: 二、桶排序概念代码 三、基数排序概念1.LSD排序法(最低位优先法)2.MSD排序法(最高位优先法) 基数排序VS基数排序VS桶排序 计数…

Linux:进度条(小程序)以及git三板斧

Linux小程序&#xff1a;进度条 在实现小程序前我们要弄清楚&#xff1a; 1.缓冲区&#xff1b; 2.回车与换行。 缓冲区&#xff1a; 分别用gcc来编译下面两个程序&#xff1a; 程序一&#xff1a; #include <stdio.h> int main() { printf("hello Makefil…

剧情继续:马斯克曝出OpenAI前员工举报信,董事会与奥特曼谈判回归

丰色 发自 凹非寺 量子位 | 公众号QbitAI 经过4天的极限拉扯、反转再反转&#xff0c;奥特曼有可能重新回归了。 据知情人士透露&#xff0c;OpenAI董事会正与奥特曼进行一场“富有成效”的新谈判。 如果奥特曼回到OpenAI&#xff0c;他将继续担任CEO。 与此同时&#xff0c…

【MybatisPlus】简介与使用

MyBatisPlus 1.简介 MyBatisPlus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生 官网&#xff1a;https://baomidou.com/ MyBatis-Plus特性&#xff1a; 无侵入&#xff1a;只…

一文深入理解Linux进程间通信

一、进程间通信的本质 什么是进程间通信&#xff1f;为什么要有进程间通信&#xff1f; 为什么能进程间通信&#xff1f; 1.1 为什么要通信 我们先拿人来做个类比&#xff0c;人与人之间为什么要通信&#xff0c;有两个原因。首先是因为你有和对方沟通的需求&#xff0c;如…