YOLOv5改进 | 主干网络 | 用EfficientNet卷积替换backbone【教程+代码 】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡

在YOLOv5的GFLOPs计算量中,卷积占了其中大多数的比列,为了减少计算量,研究人员提出了用EfficientNet代替backbone。本文给大家带来的教程是将原来的主干网络替换为EfficientNet。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

专栏地址: YOLOv5改进+入门——持续更新各种有效涨点方法 点击即可跳转

文章目录

  • 1. 原理
    • 2.代码实现
      • 2.1 将EfficientNet添加到YOLOv5中
      • 2.2 新增yaml文件
      • 2.3 注册模块
      • 2.4 执行程序
  • 3. 完整代码分享
  • 4.GFLOPs对比
  • 5. 总结

1. 原理

在这里插入图片描述

论文地址:EfficientNet论文点击即可跳转

官方代码:https://github.com/tensorflow/tpu/tree/ master/models/official/efficientnet

EfficientNet 是一个卷积神经网络架构,旨在通过同时调整深度、宽度和分辨率来实现更好的准确性和效率。它由谷歌的Mingxing Tan和Quoc V. Le在题为《EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks》的论文中提出。

EfficientNet主要的关键组件和概念:

  1. 复合缩放:EfficientNet引入了一种新的缩放方法,该方法使用复合系数均匀地缩放网络宽度、深度和分辨率。传统上,模型是通过简单增加这些维度中的一个来进行缩放的,这可能导致性能不佳。EfficientNet使用复合系数 φ 来统一地缩放这些维度。

  2. 架构设计:EfficientNet从基线网络架构开始,然后使用复合缩放方法进行扩展。基线架构类似于移动反向瓶颈卷积(MBConv)架构,它由带有深度可分离卷积的反向残差块组成。

  3. 深度可分离卷积:EfficientNet广泛使用深度可分离卷积。它将标准卷积操作分解为深度卷积(分别在每个输入通道上操作)后跟点卷积(用于组合输出的1x1卷积)。这样做既减少了计算成本,又保留了表示能力。

  4. 高效缩放:EfficientNet通过高效地缩放网络宽度、深度和分辨率来实现最先进的性能。通过同时缩放所有这些维度,它有效地平衡了模型容量和计算成本。

  5. 模型变种:EfficientNet有几个变种,如EfficientNet-B0到B7,代表不同的缩放级别。B0是最小且计算成本最低的变种,而B7是最大且计算成本最高的变种。

  6. 迁移学习:EfficientNet模型通常在大规模图像数据集(如ImageNet)上预先训练,然后使用较小的数据集进行特定任务的微调。使用EfficientNet的迁移学习在各种计算机视觉任务上都被证明是非常有效的,尤其是在有限的计算资源下达到最先进的性能。

由于其优越的性能和效率平衡,EfficientNet已成为计算机视觉任务的热门选择。其可扩展性使其适用于从手机到云服务器的各种设备,并且仍然能够实现出色的准确性。

在这里插入图片描述

2.代码实现

2.1 将EfficientNet添加到YOLOv5中

关键步骤一: 将下面代码粘贴到/projects/yolov5-6.1/models/common.py文件中
img

class stem(nn.Module):def __init__(self, c1, c2, act='ReLU6'):super().__init__()self.conv = nn.Conv2d(c1, c2, kernel_size=3, stride=2, padding=1, bias=False)self.bn = nn.BatchNorm2d(num_features=c2)if act == 'ReLU6':self.act = nn.ReLU6(inplace=True)def forward(self, x):return self.act(self.bn(self.conv(x)))class MBConvBlock(nn.Module):def __init__(self, inp, final_oup, k, s, expand_ratio, drop_connect_rate, has_se=False):super(MBConvBlock, self).__init__()self._momentum = 0.01self._epsilon = 1e-3self.input_filters = inpself.output_filters = final_oupself.stride = sself.expand_ratio = expand_ratioself.has_se = has_seself.id_skip = True  # skip connection and drop connectse_ratio = 0.25# Expansion phaseoup = inp * expand_ratio  # number of output channelsif expand_ratio != 1:self._expand_conv = nn.Conv2d(in_channels=inp, out_channels=oup, kernel_size=1, bias=False)self._bn0 = nn.BatchNorm2d(num_features=oup, momentum=self._momentum, eps=self._epsilon)# Depthwise convolution phaseself._depthwise_conv = nn.Conv2d(in_channels=oup, out_channels=oup, groups=oup,  # groups makes it depthwisekernel_size=k, padding=(k - 1) // 2, stride=s, bias=False)self._bn1 = nn.BatchNorm2d(num_features=oup, momentum=self._momentum, eps=self._epsilon)# Squeeze and Excitation layer, if desiredif self.has_se:num_squeezed_channels = max(1, int(inp * se_ratio))self.se = SeBlock(oup, 4)# Output phaseself._project_conv = nn.Conv2d(in_channels=oup, out_channels=final_oup, kernel_size=1, bias=False)self._bn2 = nn.BatchNorm2d(num_features=final_oup, momentum=self._momentum, eps=self._epsilon)self._relu = nn.ReLU6(inplace=True)self.drop_connect = drop_connect(drop_connect_rate)def forward(self, x, drop_connect_rate=None):""":param x: input tensor:param drop_connect_rate: drop connect rate (float, between 0 and 1):return: output of block"""# Expansion and Depthwise Convolutionidentity = xif self.expand_ratio != 1:x = self._relu(self._bn0(self._expand_conv(x)))x = self._relu(self._bn1(self._depthwise_conv(x)))# Squeeze and Excitationif self.has_se:x = self.se(x)x = self._bn2(self._project_conv(x))# Skip connection and drop connectif self.id_skip and self.stride == 1  and self.input_filters == self.output_filters:if drop_connect_rate:x = self.drop_connect(x, training=self.training)x += identity  # skip connectionreturn x

EfficientNet模型的主要流程如下:

  1. 输入图像预处理

    • 输入图像首先会经过预处理步骤,包括归一化、缩放等,以使其适应网络的输入要求。
  2. 特征提取

    • 输入图像通过一系列卷积层和池化层,逐步提取特征。这些卷积层通常采用深度可分离卷积(depthwise separable convolution),这种卷积操作可以显著减少参数数量和计算量,从而提高模型的效率。
  3. 特征放缩(Feature Scaling)

    • 在EfficientNet中,为了适应不同分辨率的输入图像,引入了特征放缩模块。这个模块使用全局平均池化将提取的特征向量转换为固定长度的向量,并通过一个可学习的线性变换(通常是一个1x1卷积层)将其映射到固定维度,以确保网络对于不同分辨率的图像具有一致的性能。
  4. 特征组合

    • 将不同尺度的特征图进行组合,通常采用特征级联或者特征融合的方式,以丰富特征表示能力。
  5. 分类或回归

    • 最后一层是用于分类或回归任务的全连接层或者卷积层。对于分类任务,通常使用softmax激活函数输出类别概率分布;对于回归任务,可以输出边界框的位置或者其他相关信息。
  6. 损失计算和反向传播

    • 使用损失函数计算模型预测值与真实标签之间的差异,常见的损失函数包括交叉熵损失(对于分类任务)和均方误差损失(对于回归任务)等。然后通过反向传播算法更新网络参数,使得损失函数最小化。

    整个流程的关键点在于使用了深度可分离卷积来减少计算量,同时通过宽度/深度/分辨率缩放来平衡模型的复杂度和性能。EfficientNet在保持模型轻量级的同时,能够取得很好的性能表现,因此被广泛应用于计算资源受限的设备和场景中。

2.2 新增yaml文件

关键步骤二:在下/projects/yolov5-6.1/models下新建文件 yolov5_shuffle.yaml并将下面代码复制进去

在这里插入图片描述

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
anchors:- [10,13, 16,30, 33,23]  # P3/8- [30,61, 62,45, 59,119]  # P4/16- [116,90, 156,198, 373,326]  # P5/32#  EfficientNetLite backbone
backbone:# [from, number, module, args][[-1, 1, stem, [32, 'ReLU6']],             # 0-P1/2  ch_out, act[-1, 1, MBConvBlock, [16, 3, 1, 1, 0]],   # 1 ch_out, k_size, s, expand[-1, 1, MBConvBlock, [24, 3, 2, 6, 0.028, True]],   # 2-P2/4 ch_out, k_size, s, expand, drop_connect_rate, se[-1, 1, MBConvBlock, [24, 3, 1, 6, 0.057]],[-1, 1, MBConvBlock, [40, 5, 2, 6, 0.085]],   # 4-P3/8 ch_out, k_size, s, expand, drop_connect_rate, se[-1, 1, MBConvBlock, [40, 5, 1, 6, 0.114]],[-1, 1, MBConvBlock, [80, 3, 2, 6, 0.142]],   # 6-P4/16 ch_out, k_size, s, expand, drop_connect_rate, se[-1, 1, MBConvBlock, [80, 3, 1, 6, 0.171]],[-1, 1, MBConvBlock, [80, 3, 1, 6, 0.2]],[-1, 1, MBConvBlock, [112, 5, 1, 6, 0.228]],  # 9[-1, 1, MBConvBlock, [112, 5, 1, 6, 0.257]],[-1, 1, MBConvBlock, [112, 5, 1, 6, 0.285]],[-1, 1, MBConvBlock, [192, 5, 2, 6, 0.314]],  # 12-P5/32 ch_out, k_size, s, expand, drop_connect_rate, se[-1, 1, MBConvBlock, [192, 5, 1, 6, 0.342]],[-1, 1, MBConvBlock, [192, 5, 1, 6, 0.371]],[-1, 1, MBConvBlock, [192, 5, 1, 6, 0.4]],[-1, 1, MBConvBlock, [320, 3, 1, 6, 0.428]],  # 16[-1, 1, SPPF, [1024, 5]], # 17]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 11], 1, Concat, [1]],  # cat backbone P4[-1, 3, C3, [512, False]],  # 21[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 5], 1, Concat, [1]],  # cat backbone P3[-1, 3, C3, [256, False]],  # 25 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 22], 1, Concat, [1]], # cat head P4[-1, 3, C3, [512, False]],  # 28 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 18], 1, Concat, [1]],  # cat head P5[-1, 3, C3, [1024, False]],  # 31 (P5/32-large)[[25, 28, 31], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

温馨提示:本文只是对yolov5l基础上添加swin模块,如果要对yolov8n/l/m/x进行添加则只需要指定对应的depth_multiple 和 width_multiple。

# YOLOv5n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple# YOLOv5s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple# YOLOv5l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple# YOLOv5m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple# YOLOv5x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple

2.3 注册模块

关键步骤:在yolo.py中注册, 大概在260行左右添加 ‘MBConvBlock’和‘stem’

在这里插入图片描述

2.4 执行程序

在train.py中,将cfg的参数路径设置为yolov5_efficient.yaml的路径

建议大家写绝对路径,确保一定能找到
在这里插入图片描述

🚀运行程序,如果出现下面的内容则说明添加成功🚀

在这里插入图片描述

3. 完整代码分享

https://pan.baidu.com/s/1Y9WuMkKBmYONl0MdshEiIA?pwd=9wsd

提取码: 9wsd

4.GFLOPs对比

未改进的YOLOv5l的GFLOPs

img
在这里插入图片描述

GFLOPs减少一半以上

5. 总结

EfficientNet是一种卓越的卷积神经网络架构,通过复合缩放和深度可分离卷积等技术,以及特征放缩模块的引入,实现了在保持高准确性的同时显著提升了模型的效率和性能。其提供的多个预定义模型变种,以及在各种计算机视觉任务中广泛的应用领域,使其成为了业界的热门选择,为图像分类、目标检测和其他相关任务提供了可靠且高效的解决方案。

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

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

相关文章

获得 AI Applied Skills 凭证:微软在线评估认证的注意事项

在你踏上微软的亚洲AI奥德赛之旅,完成基础课程学习后,你可以继续进行相应的评估,在交互式实验室体验中完成一系列任务,通过线上即时评估赢得认证。通过本文的介绍,可以帮助你了解评估认证的一些细节以及注意事项&#…

一般EI论文的格式是什么样的?

论文应该符合会议的提交要求和模板,包括页面格式、字体、字号、行距等。可以在特定会议的官方网站上找到详细的提交指南和模板。 EI会议论文的格式通常遵循以下基本结构: 标题和作者信息:论文标题应该简洁明了,能够准确概括您研究…

ubuntu_概念

su(switch user) wget(Web Get) cd(change directory) dpkg(Debian Packager)为 “Debian” 专门开发的套件管理系统,方便软件的安装、更新及移除。 chmod(Change Mode)用于改变文件或目录的权限 ps(Process Status)进程状态 grep(Global Regular Expression Print)…

OpenCV与AI深度学习 | 高效开源的OCR工具:Surya-OCR介绍与使用

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。 原文链接:高效开源的OCR工具:Surya-OCR介绍与使用 1 背景 在众多企业应用中,光学字符识别 (OCR) 是一项基础技术。在本文中&…

MySQL主从复制(二):高可用

正常情况下, 只要主库执行更新生成的所有binlog, 都可以传到备库并被正确地执行, 备库就能达到跟主库一致的状态, 这就是最终一致性。 但是, MySQL要提供高可用能力, 只有最终一致性是不够的。 双M结构的…

python实现nacos服务注册和HTTP探活

如果使用nacos-sdk-python(注意适用nacos版本),需要按照下面的链接修改源码的bug https://github.com/nacos-group/nacos-sdk-python/issues/135 代码如下: import nacos import threading import socket import requests impo…

大语言模型调优SFT RLHF

模型调优 大语言模型调优是通过准备训练数据,并在已有的预训练模型上进行调优,包括 llama、千问等模型,从而可以让模型学习到私有知识或者增强模型的已有知识。因此,如果要想训练一个效果好的模型,我们就需要提供大量…

【人工智能】模型性能评估

模型性能衡量介绍 混淆矩阵 混淆矩阵(Confusion Matrix) TP(真阳性):预测为阳性,且预测正确。 TN(真阴性):预测为阴性,且预测正确。 FP(伪阳性):预测为阳性,但预测错误,又称型一误…

【NumPy】关于numpy.reshape()函数,看这一篇文章就够了

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

python文件名通常以什么结尾

python文件后缀一般有两个,分别是.py和.pyw。视窗用 python.exe 运行 .py,用 pythonw.exe 运行 .pyw 。 这纯粹是因为安装视窗版Python时,扩展名 .py 自动被登记为用 python.exe 运行的文件,而 .pyw 则被登记为用 pythonw.exe 运…

LeetCode刷题之HOT100之汉明距离

大家晚上好啊,今天几乎啥也没干,上个课就耽误了一下午,晚上来了积极性也不高,先完成今天的题目吧,请看题: 1、题目描述 2、逻辑分析 没有遇到过这种题目,想不出来有什么解法,看题解…

跟TED演讲学英文:Do schools kill creativity by Sir Ken Robinson

Do schools kill creativity? Link: https://www.ted.com/talks/sir_ken_robinson_do_schools_kill_creativity Speaker: Sir Ken Robinson Date: February 2006 文章目录 Do schools kill creativity?IntroductionVocabularySummaryTranscriptAfterword Introduction Sir…

可转债日内自动T+0交易,行情推送+策略触发+交易接口

说明 目前这个项目已编译打包,下载即可测试,直接生成多平台可执行文件,详见运行方法。行情部分与策略弱相关,拆分解耦单独作为一个项目。行情项目请移步GitHub - freevolunteer/hangqing: A股行情订阅工具,支持股票/可转债level2/level2数据&…

【stm32/CubeMX、HAL库】嵌入式实验六:定时器(3)|外部脉冲计数

参考: 【【正点原子】手把手教你学STM32CubeIDE开发】 https://www.bilibili.com/video/BV1Wp42127Cx/?p13&share_sourcecopy_web&vd_source9332b8fc5ea8d349a54c3989f6189fd3 《嵌入式系统基础与实践》刘黎明等编著,第九章定时器&#xff0c…

Generic Segmentation Offload(GSO)

Generic Segmentation Offload汉语意思是啥? Generic Segmentation Offload(GSO)的汉语意思是“通用分段卸载”。在网络通信中,GSO 是一种技术,用于在网络栈中将较大的传输单元分段为更小的单元,以提高网络…

文心智能体应用示例:职场反PUA专家的诞生

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

C#编程-.NET Framework使用工具类简化对象之间的属性复制和操作

在C#编程中,对象之间的属性复制和操作是一个常见的需求。为此,.NET Framework提供了多种实用工具库,如AutoMapper、ValueInjecter和ExpressMapper。这些库通过简化代码,提高了开发效率。本文将介绍这些工具库,比较它们…

远程桌面连接不上远程服务器,如何有效的解决远程桌面连接不上远程服务器的问题

在解决远程桌面连接不上远程服务器的问题时,我们需要采取一种专业且系统的方法来排查和修复可能存在的故障。以下是一些建议和步骤,帮助用户更有效地解决此类问题。 首先,用户需要确认远程服务器的状态和网络连接是否正常。 这包括检查服务器…

Linux入门攻坚——23、DNS和BIND基础入门2

前一篇实践了正向解析服务器的配置使用,如何配置反向解析呢? 反向区域: 区域名称:网络地址反写.in-addr.arpa. 192.168.138. --> 138.168.192.in-addr.arpa. (1)定义区域: zone "ZONE_NAME" I…

必应bing国内广告如何开户,这篇文章告诉你!

搜索引擎广告推广已成为企业提升品牌知名度、吸引潜在客户的重要渠道,微软必应Bing,作为全球领先的搜索引擎之一,其广告平台为企业提供了一个高效、精准的推广渠道。如何在必应Bing国内广告平台上开户,让你的品牌大放异彩呢&#…