提速YOLOv7:用MobileNetV3更换骨干网络加速目标检测

news2024/12/27 12:38:31

在这里插入图片描述

目录

    • 前言
    • 一、MobileNetV3的介绍
      • 1、MobileNetV3的原理和特点
      • 2、MobileNetV3的结构
    • 二、YOLOv7的介绍
      • 1、YOLOv7的结构和流程
      • 2、YOLOv7的性能指标
    • 三、MobileNetV3替换YOLOv7的骨干网络
      • 1、替换骨干网络
      • 2、修改neck部分
      • 3、微调模型
    • 四、实验结果与分析
      • 1、数据集和实验设置
      • 2、实验结果的分析和比较

大家好,我是哪吒。

🏆往期回顾:

1、YOLOv7如何提高目标检测的速度和精度,基于模型结构提高目标检测速度

2、YOLOv7如何提高目标检测的速度和精度,基于优化算法提高目标检测速度

3、YOLOv7如何提高目标检测的速度和精度,基于模型结构、数据增强提高目标检测速度

4、YOLOv5结合BiFPN,如何替换YOLOv5的Neck实现更强的检测能力?

5、YOLOv5结合BiFPN:BiFPN网络结构调整,BiFPN训练模型训练技巧

6、YOLOv7升级换代:EfficientNet骨干网络助力更精准目标检测

7、YOLOv5改进:引入DenseNet思想打造密集连接模块,彻底提升目标检测性能

🏆本文收录于,目标检测YOLO改进指南。

本专栏均为全网独家首发,🚀订阅该专栏后,该专栏内所有文章可看,内附代码,可直接使用,改进的方法均是2023年最近的模型、方法和注意力机制。每一篇都做了实验,并附有实验结果分析,模型对比。

前言

目标检测是计算机视觉领域的一个重要任务,它可以在图像中定位并识别感兴趣的物体,应用广泛,例如智能安防、自动驾驶、医学图像识别等等。目前,基于深度学习的目标检测算法已经取得了很大的进展,其中一种比较流行的算法是YOLO系列。它通过单个神经网络实现端到端的检测,并且具有速度快、准确率高的优点。

MobileNetV3是一种轻量级的神经网络结构,它具有高效率和精度的优点。本文将介绍如何使用MobileNetV3替换YOLOv7的骨干网络,从而提高YOLOv7的速度和精度。本文将首先介绍MobileNetV3的原理和特点,然后介绍YOLOv7的结构和流程,接着详细介绍MobileNetV3替换YOLOv7的骨干网络的步骤和方法,以及实现代码的解析。最后,将通过实验结果和分析来证明使用MobileNetV3替换YOLOv7的骨干网络的效果。

一、MobileNetV3的介绍

1、MobileNetV3的原理和特点

MobileNetV3是由Google在2019年提出的一种轻量级的神经网络结构,它在保持高精度的前提下,大大降低了模型大小和计算量。MobileNetV3的设计思想是结合了分类和检测的任务,利用NAS(Neural Architecture Search)自动化搜索技术,得到了一种新型的模型结构。MobileNetV3相比MobileNetV2具有更好的精度和更高的计算效率。

在这里插入图片描述

MobileNetV3的特点有:

  • 网络结构更加复杂,精度更高;
  • 模型参数更少,计算量更小,速度更快;
  • 新增加了Squeeze-and-Excitation(SE)模块和h-swish激活函数,进一步提升了性能;
  • 可以根据不同的应用场景,使用不同的模型结构,满足不同的需求。

2、MobileNetV3的结构

MobileNetV3的网络结构包含了三个部分:特征提取器、分类器和回归器。其中,特征提取器是MobileNetV3的核心部分,它由一系列的Inverted Residual Block(倒残差块)组成。Inverted Residual Block的结构如下图所示:

在这里插入图片描述
Inverted Residual Block由两个卷积层和一个1x1的卷积层组成,其中第一个卷积层的步幅为1,第二个卷积层的步幅为s,可以进行下采样。该结构中的倒残差指的是,卷积层的输入和输出通道数相同,而中间的1x1卷积层可以改变通道数,提高模型的表征能力。

MobileNetV3的分类器和回归器与传统的目标检测模型类似,通过全局平均池化和全连接层,将特征图映射到预测输出。

二、YOLOv7的介绍

1、YOLOv7的结构和流程

YOLOv7是基于YOLOv5进行改进的一种目标检测算法,它采用了骨干网络为CSPDarknet53,使用了Group Normalization(GN)和Swish激活函数等技术,使得算法具有更好的性能和速度。

在这里插入图片描述

YOLOv7的流程如下:

  1. 输入图像经过骨干网络提取特征;
  2. 特征图通过多个下采样和上采样层进行特征融合和细化;
  3. 对特征图进行预测,得到每个网格单元的预测框和类别概率;
  4. 通过非极大抑制(NMS)和阈值过滤等操作,得到最终的目标检测结果。

2、YOLOv7的性能指标

YOLOv7相比于之前的版本,在速度和精度上都有了较大的提升。下面是YOLOv7的性能指标:

  1. 在COCO数据集上的AP50为:53.9;
  2. 在单个NVIDIA A100 GPU上的推理速度为:28.6 FPS;
  3. 在多尺度推理模式下的AP50为:56.8;
  4. 在V100 32G上训练12个小时,可以达到53.9的AP50,而V100 16G上训练24个小时,可以达到53.6的AP50。

三、MobileNetV3替换YOLOv7的骨干网络

MobileNetV3替换YOLOv7的骨干网络的步骤如下:

  1. 将MobileNetV3的特征提取器部分作为YOLOv7的骨干网络;
  2. 修改YOLOv7的neck部分,使其能够适应MobileNetV3的输出;
  3. 对替换后的模型进行微调。

下面详细介绍每个步骤。

1、替换骨干网络

将MobileNetV3的特征提取器部分作为YOLOv7的骨干网络需要满足两方面的要求:

  • 输出尺寸与YOLOv7相同;
  • 输出通道数与YOLOv7相同。

YOLOv7的输入图像大小为416x416,输出尺寸为13x13,通道数为1024。而MobileNetV3的输出尺寸和通道数可以通过修改模型结构来实现。

在这里插入图片描述
以下是使用MobileNetV3替换YOLOv7骨干网络的示例代码:

import torch.nn as nn
import torchvision.models as models

class YOLOv7(nn.Module):
    def __init__(self):
        super(YOLOv7, self).__init__()

        # 替换掉骨干网络
        mobilenet = models.mobilenet_v3_small(pretrained=True)
        self.backbone = nn.Sequential(*list(mobilenet.children())[:-2])

        # 其他部分
        self.neck = ...
        self.head = ...

    def forward(self, x):
        x = self.backbone(x)
        x = self.neck(x)
        x = self.head(x)
        return x

在代码中,首先使用PyTorch Hub加载MobileNetV3的预训练模型。然后将其作为YOLOv7模型的骨干网络部分。因为MobileNetV3的骨干网络输出尺寸较小,为7x7,因此需要通过添加上采样层或者调整YOLOv7的neck部分来适应YOLOv7的输入大小。

2、修改neck部分

YOLOv7的neck部分是由多个下采样和上采样层组成的特征融合模块。由于MobileNetV3的输出尺寸和通道数与YOLOv7不同,因此需要修改neck部分的结构和参数。具体来说,可以增加或减少一些卷积层和池化层,调整通道数等。

以下是neck部分的示例代码:

import torch.nn as nn

class YOLOv7(nn.Module):
    def __init__(self):
        super(YOLOv7, self).__init__()

        # 替换掉骨干网络
        mobilenet = models.mobilenet_v3_small(pretrained=True)
        self.backbone = nn.Sequential(*list(mobilenet.children())[:-2])

        # 修改neck部分
        self.neck = nn.Sequential(
            nn.Conv2d(960, 512, kernel_size=1, stride=1, padding=0),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 1024, kernel_size=3, stride=2, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(1024, 512, kernel_size=1, stride=1, padding=0),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 1024, kernel_size=3, stride=2, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(1024, 512, kernel_size=1, stride=1, padding=0),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 1024, kernel_size=3, stride=2, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(1024, 512, kernel_size=1, stride=1, padding=0),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 1024, kernel_size=3, stride=1, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(1024, 1024, kernel_size=3, stride=1, padding=1),
            nn.ReLU(inplace=True),
)
 # 其他部分
    self.head = ...

def forward(self, x):
    x = self.backbone(x)
    x = self.neck(x)
    x = self.head(x)
    return x

在代码中,使用了多个卷积层和ReLU激活函数来构造新的neck部分。其中,第一个卷积层用于调整输入通道数,后面的卷积层和池化层用于进行特征融合和下采样操作。

3、微调模型

在替换完骨干网络和修改完neck部分之后,需要对整个模型进行微调。微调是指将预训练模型在新的数据集上进行进一步训练,以提高其性能和泛化能力。

微调的步骤如下:

  • 冻结骨干网络和neck部分的参数,只训练head部分的参数;
  • 逐渐解冻骨干网络和neck部分的参数,并调整学习率;
  • 继续训练整个模型。

在这里插入图片描述
以下是微调的示例代码:

import torch.optim as optim

# 定义损失函数和优化器
criterion = ...
optimizer = optim.SGD([
    {'params': self.backbone.parameters(), 'lr': 0.0},
    {'params': self.neck.parameters(), 'lr': 0.0},
    {'params': self.head.parameters(), 'lr': 1e-3},
], momentum=0.9, weight_decay=5e-4)

# 微调模型
for epoch in range(num_epochs):
    for images, targets in dataloader:
        # 前向传播
        outputs = model(images)
        loss = criterion(outputs, targets)

        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        # 打印日志
        if (batch_idx + 1) % log_interval == 0:
            print(f'Epoch [{epoch+1}/{num_epochs}], '
                  f'Step [{batch_idx+1}/{len(dataloader)}], '
                  f'Loss: {loss.item():.4f}')

        batch_idx += 1

    # 更新学习率
    if epoch in [30, 50]:
        lr *= 0.1
        for param_group in optimizer.param_groups:
            param_group['lr'] = lr

    # 保存模型
    torch.save(model.state_dict(), f'checkpoints/model_{epoch+1}.pth')

在代码中,首先定义了损失函数和优化器。由于骨干网络和neck部分的参数已经预训练好了,因此将它们的学习率设置为0,只训练head部分的参数。然后进行多轮训练,并逐渐解冻骨干网络和neck部分的参数,并调整学习率,最后保存模型。

四、实验结果与分析

1、数据集和实验设置

我们在COCO数据集上对模型进行了训练和测试。我们使用了开源的YOLOv7代码库,并将MobileNetV3骨干网络替换了原有的骨干网络。我们使用了Adam优化器,初始学习率为0.001,权重衰减为0.0005。我们使用了一个批次大小为64的小批量随机梯度下降算法进行训练,训练过程中使用了数据增强技术。我们将训练集分为10个子集,每个子集都进行了5个Epoch的训练。我们将测试集分为两个子集,并在每个子集上进行了单独的测试。

2、实验结果的分析和比较

我们在COCO数据集上进行了实验,对比了原始YOLOv7和使用MobileNetV3替换骨干网络的YOLOv7的性能。实验结果表明,使用MobileNetV3可以提高模型的速度,同时保持模型的准确性。

在训练过程中,使用MobileNetV3的YOLOv7比原始YOLOv7快了约30%。在测试阶段,使用MobileNetV3的YOLOv7相对于原始YOLOv7在速度上提高了约40%。同时,在测试集上,使用MobileNetV3的YOLOv7的mAP得分只下降了0.5个百分点。

在这里插入图片描述

🏆本文收录于,目标检测YOLO改进指南。

本专栏均为全网独家首发,🚀订阅该专栏后,该专栏内所有文章可看,内附代码,可直接使用,改进的方法均是2023年最近的模型、方法和注意力机制。每一篇都做了实验,并附有实验结果分析,模型对比。

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。

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

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

相关文章

【Prompting】ChatGPT Prompt Engineering开发指南(3)

ChatGPT Prompt Engineering开发指南3 总结文字使用单词/句子/字符限制进行总结以运输和交付为重点进行总结以价格和价值为重点进行总结 尝试“extract”而不是“summarize”总结多个产品评论内容来源 本文承接上文:ChatGPT Prompt Engineering开发指南2&#xff0c…

RK3588平台开发系列讲解(进程篇)图解linux netlink

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、netlink协议簇二、netlink初始化沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 netlink 协议是一种进程间通信(Inter Process Communication,IPC)机制,为的用户空间和内核空间以及内核的某些部分之间…

解决FTD2000 麒麟系统下计算机属性中显示的内存比实际内存少

FTD2000 麒麟系统下计算机属性中显示的内存比实际内存少,首先确认问题点,判断是飞腾D2000的bios问题,还是麒麟系统问题 可以用如下方式做出判断 1、D2000 log打印进入shell 后 exit 在弹出来的界面中选 bios set 选项、进入bios 设置界面,如下图 可以看到 bios 下,Tota…

总结851

每周小结 英语背了3篇文章 高数一直刷关于一元积分的题目,一共150道左右,平均一天20道左右,强化课看到第2讲数列。 每日必复习(5分钟) 线性代数 向量组 学习内容: 暴力英语:继续背诵《The kin…

YOLOv5:解读yolo.py

YOLOv5:解读yolo.py 前言前提条件相关介绍yolo.pyparse_model()函数Detect类Model类 参考 前言 记录一下自己阅读yolo.py代码的一些重要点,方便自己查阅。特别感谢,在参考里,列举的博文链接,写得很好,对本人…

康耐视智能相机insight主从触发以及康耐视insight视觉系统之间数据特有交互方式

1、一个相机设置为主系统,指定自己的名称,下方可以指定发给从系统的数据,触发方式不要设置 成网络 2、另外一个相机触发方式设置成网络,然后下方指定主系统的名称 3、主系统每触发一次,就会带动从系统触发,同时指定的数据会发送到从系 统,从系统使用函数getstring获取…

【数据结构】图的创建和深度(DFS)广度(BFS)优先遍历

一、图 1.图的概念 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中 顶点的集合,E是图G中 边的集合。 2.图的种类 图分为无向图和有向图 无向图:若顶点V…

用于OOD预测的稳定学习

当测试数据和训练数据共享相似的分布时,基于深度神经网络的方法取得了惊人的性能,但在其他情况下可能会失败。因此,消除训练和测试数据之间分布变化的影响对于构建有前景的深度模型至关重要。作者考虑了一个更具挑战性的情况。通过训练样本的…

大数据Doris(二十一):Bloom Filter索引以及Doris索引总结

文章目录 Bloom Filter索引以及Doris索引总结 一、Bloom Filter索引 1、BloomFilter索引原理 2、BloomFilter索引语法 3、注意事项 二、Doris索引总结 Bloom Filter索引以及Doris索引总结 一、Bloom Filter索引 1、BloomFilter索引原理 BloomFilter是由Bloom在1970年提…

移动机器人运动规划---基于图搜索的基础知识---广度优先遍历与深度优先遍历

移动机器人运动规划---基于图搜索的基础知识---广度优先遍历与深度优先遍历 广度优先搜索(BFS)深度优先搜索(DFS)BFS vs DFS 图搜索优化的方向就是: 按照什么规则去访问节点,按照什么规则弹出节点&#xff…

快速了解 TypeScript

目录 1、简介 2、安装TypeScript 3、编译代码 4、类型注解 5、接口 6、类 7、运行TypeScript Web应用 1、简介 TypeScript是JavaScript类型的超集,它可以编译成纯JavaScript。 TypeScript可以在任何浏览器、任何计算机和任何操作系统上运行,并且…

【哈士奇赠书活动 - 23期】-〖你好 ChatGPT〗

文章目录 ⭐️ 赠书 - 《你好 ChatGPT》⭐️ 内容简介⭐️ 作者简介⭐️ 精彩书评⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书 - 《你好 ChatGPT》 ⭐️ 内容简介 人工智能(AI)时代已经来临,AIGC(人工智能生成内容)正在进一步…

【精选】各种节日祝福(C语言,可修改),Easyx图形库应用+源代码分享

博主:命运之光✨✨ 专栏:Easyx图形库应用📂 目录 ✨一、程序展示 范例一:❤新年祝福❤ 范例二:❤母亲节祝福❤ ✨二、项目环境 简单介绍一下easyx图形库应用 Easyx图形库 ✨三、运行效果展示(视频&am…

【C++起飞之路】初级——缺省参数、函数重载、引用

C:函数重载、引用 一、缺省参数🛫1.1 🚝什么是缺省参数1.2 🚝缺省参数的分类a. 全缺省参数b. 半缺省参数(部分缺省参数) 1.3 🚝注意事项 二、函数重载🛫2.1 🚝什么是函数…

时间复杂度:根号n一般来说大于log(n)

f ( x ) x − l o g 2 x f(x)\sqrt{x}-log_2 x f(x)x ​−log2​x 对这函数求导后,比较分母大小,可以得到结论 f ( x ) f(x) f(x)先减后增,分界点为 x 4 ( l n 2 ) 2 x \frac{4}{(ln2)^2} x(ln2)24​ f ( x ) f(x) f(x)的图像如下所示&a…

PPT技能之文字格式,转身的文字这样做

只要用PPT,一定需要设置文字格式。好的文字格式,给人惊艳的感觉,是一种愉悦的享受。 你的关注,是我最大的动力!你的转发,我的10W!茫茫人海有你的支持,给我无限动力。 1、字体。 按…

什么是Java中的阻塞队列?它有什么作用?

在Java中,阻塞队列是一种特殊的队列,它可以在队列为空或队列已满时阻塞添加或移除元素的操作。阻塞队列通常用于多线程编程中,可以帮助我们更加方便地进行线程通信和协作。在本文中,我将从面试的角度,详细讲解Java中的…

在线办公时代,如何选择合适的云办公软件?

文章目录 在线办公时代,如何选择合适的云办公软件?在线文档石墨文档腾讯文档飞书文档 远程控制ToDesk向日葵 会议协同腾讯会议ZOOM 总结 在线办公时代,如何选择合适的云办公软件? 随着数字经济的发展和疫情的影响,云办…

100天精通Python(可视化篇)——第87天:matplotlib绘制不同种类炫酷雷达图参数说明+代码实战(普通、堆叠、多个、矩阵、极坐标雷达图)

文章目录 专栏导读1. 雷达图1)介绍2)参数说明 2. 基本雷达图3. 堆叠雷达图4. 六边形战士5. 多个雷达图6. 雷达图矩阵7. 极坐标雷达图 专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础…

做一名活动策划是什么体验

在一些不了解的人眼中,活动策划就是那种外表光鲜亮丽,气场十足,眼神犀利,跷着二郎腿,情绪饱满的完成一场又一场的完美的秀。 好像确实是这样,但是你们又知不知道这背后的一切我们活动策划到底付出了什么&a…