【论文复现】经典再现:yolov4的主干网络重构(结合Slim-neck by GSConv)

简介: 【论文复现】经典再现:yolov4的主干网络重构(结合Slim-neck by GSConv)

前言

  本文接着上一篇【论文复现】针对yoloV5-L部分的YoloBody部分重构(Slim-neck by GSConv)中叙述的论文[1]接着复现的yoloV4,这两篇文章的基础函数基本一致,没有其他函数的加入,因此本文也将省去函数拆解部分。若大家想知道的更详细,可以移步【论文复现】针对yoloV5-L部分的YoloBody部分重构(Slim-neck by GSConv),望见谅!感谢!

  本文同上篇一样:不赘述原理部分,将把精力放在复现论文中关于YoloBady主题结构上面,YoloBady取自bubbliiiing的 yoloV4 网络,所以关于yoloV4的原始部分也请大家移步yoloV4的官方讲解和bubbliiiing的讲解。

   关键词:小目标检测、边缘设备、轻量化、效率精度

参数流程

  开门见山,不多废话。我们直接在论文的第五页与第六页处可以得如图1的关于yoloV4的网络Slim-neck by GSConv部分与原版部分的比较参数流程表,左侧的为Slim-neck by GSConv版的。我们结合参数流程表与论文中的第13页的流程图(图2),一一对应各个环节的参数可以得到图三的参数流程图。

图1

image.png

图2

image.png

图3

image.png

  在图三中我们默认输入的图像shape=[640,640],相比较V4与V5,v4的结构层数较V5的要复杂,卷积层的推演以及参数的合并部分需要大家小心注意。

YoloBady

ini

复制代码

from nets import *
class YoloBody(nn.Module):
    def __init__(self, anchors_mask, num_classes, phi, pretrained=False, input_shape=[640, 640]):
        super(YoloBody, self).__init__()
        depth_dict = {'n': 0.33, 's': 0.33, 'm': 0.67, 'l': 1.00, 'x': 1.33, }
        width_dict = {'n': 0.25, 's': 0.50, 'm': 0.75, 'l': 1.00, 'x': 1.25, }
        dep_mul, wid_mul = depth_dict[phi], width_dict[phi]
        base_channels = int(wid_mul * 64)  # 64
        base_depth = max(round(dep_mul * 3), 1)  # 3
        # -----------------------------------------------#
        #   输入图片是640, 640, 3
        #   初始的基本通道是64
        # -----------------------------------------------#
        self.backbone = CSPDarknet(base_channels, base_depth, phi, pretrained)
        self.upsample = nn.Upsample(scale_factor=2, mode="nearest")
        self.concat = Concat(dimension=1)
        self.SPPF = SPPF(base_channels * 16, base_channels * 8)  # 1024 ---> 512
        self.P4Conv = Conv(base_channels * 8, base_channels * 4)  # 1,512,40,40 ---> 1,256,40,40
        self.P3Conv = Conv(base_channels * 4, base_channels * 2)  # 1,512,40,40 ---> 1,256,40,40
        self.P5GSConv = GSConv(base_channels * 8, base_channels * 4)  # 1,512,20,20 ---> 1,256,20,20
        self.P4VoV = VoVGSCSP(base_channels * 8, base_channels * 4)  # 1,512,40,40 ---> 1,256,40,40
        self.P4GSConv = GSConv(base_channels * 4, base_channels * 2)  # 1,256,40,40 ---> 1,128,40,40
        self.P3VoV = VoVGSCSP(base_channels * 4, base_channels * 2)  # 1,256,80,80 ---> 1,128,80,80
        self.P3GSConvH = GSConv(base_channels * 2, base_channels * 4)  # 1,128,80,80 ---> 1,256,80,80
        self.P3GSConv = GSConv(base_channels * 2, base_channels * 4, 3, 2)  # 1,128,80,80 ---> 1,256,40,40
        self.Head2VoV = VoVGSCSP(base_channels * 8, base_channels * 4)  # 1,512,40,40 ---> 1,256,40,40
        self.Head2GSConv = GSConv(base_channels * 4, base_channels * 8)  # 1,256,40,40 ---> 1,512,40,40
        self.Head3GSConv1 = GSConv(base_channels * 4, base_channels * 8, 3, 2)  # 1,256,20,20 ---> 1,512,20,20
        self.Head3VoV = VoVGSCSP(base_channels * 16, base_channels * 8)  # 1,1024,20,20 ---> 1,512,20,20
        self.Head3GSConv2 = GSConv(base_channels * 8, base_channels * 16)  # 1,512,20,20 ---> 1,1024,20,20
        self.yolo_head_P3 = nn.Conv2d(base_channels * 4, len(anchors_mask[2]) * (5 + num_classes), 1)
        self.yolo_head_P4 = nn.Conv2d(base_channels * 8, len(anchors_mask[1]) * (5 + num_classes), 1)
        self.yolo_head_P5 = nn.Conv2d(base_channels * 16, len(anchors_mask[0]) * (5 + num_classes), 1)
    def forward(self, x):
        P3, P4, P5 = self.backbone(x)
        P5SPPF = self.SPPF(P5)
        P5 = self.P5GSConv(P5SPPF)
        P5P5SPPF_Up = self.upsample(P5)
        P4 = self.P4Conv(P4)
        P4 = self.concat([P4, P5P5SPPF_Up])
        P4VoV = self.P4VoV(P4)
        P4 = self.P4GSConv(P4VoV)
        P4_Up = self.upsample(P4)
        P3 = self.P3Conv(P3)
        P3 = self.concat([P3, P4_Up])
        P3 = self.P3VoV(P3)
        Head1 = self.P3GSConvH(P3)
        P3G = self.P3GSConv(P3)
        P3C = self.concat([P3G, P4VoV])
        Head2VoV = self.Head2VoV(P3C)
        Head2 = self.Head2GSConv(Head2VoV)
        Head3G1 = self.Head3GSConv1(Head2VoV)
        Head3C = self.concat([Head3G1, P5SPPF])
        Head3V = self.Head3VoV(Head3C)
        Head3 = self.Head3GSConv2(Head3V)
        Out1 = self.yolo_head_P3(Head1)
        Out2 = self.yolo_head_P4(Head2)
        Out3 = self.yolo_head_P5(Head3)
        return Out3, Out2, Out1
if __name__ == "__main__":
    anchors_mask = [[6, 7, 8], [3, 4, 5], [0, 1, 2]]
    num_classes = 80
    phi = 'l'
    model = YoloBody(anchors_mask, num_classes, phi, pretrained=False)
    x = torch.ones((1, 3, 640, 640))
    Out3, Out2, Out1 = model(x)
    print(Out3.shape, Out2.shape, Out1.shape)

结果展示图:

  下图取自论文。左侧为官方源代码结果图,右侧为Slim-neck by GSConv改进后的结果图。

image.png

结尾

  由于本人能力有限若文中有纰漏还请多多指正,感谢大家的阅读,希望本文对大家有所帮助,需要代码可以进入我的仓库自取。结合bubbliiiing的代码和我重构的YoloBady即可。

[1] 《Slim-neck by GSConv: A better design paradigm of detector architectures for autonomous vehicles》 [2] github.com/alanli1997/…

[3] link.juejin.cn/?target=htt…


相关文章
|
7天前
|
机器学习/深度学习 人工智能
类人神经网络再进一步!DeepMind最新50页论文提出AligNet框架:用层次化视觉概念对齐人类
【10月更文挑战第18天】这篇论文提出了一种名为AligNet的框架,旨在通过将人类知识注入神经网络来解决其与人类认知的不匹配问题。AligNet通过训练教师模型模仿人类判断,并将人类化的结构和知识转移至预训练的视觉模型中,从而提高模型在多种任务上的泛化能力和稳健性。实验结果表明,人类对齐的模型在相似性任务和出分布情况下表现更佳。
19 3
|
4月前
|
机器学习/深度学习 自然语言处理 计算机视觉
【YOLOv8改进 - Backbone主干】VanillaNet:极简的神经网络,利用VanillaNet替换YOLOV8主干
【YOLOv8改进 - Backbone主干】VanillaNet:极简的神经网络,利用VanillaNet替换YOLOV8主干
|
18天前
|
机器学习/深度学习 Web App开发 人工智能
轻量级网络论文精度笔(一):《Micro-YOLO: Exploring Efficient Methods to Compress CNN based Object Detection Model》
《Micro-YOLO: Exploring Efficient Methods to Compress CNN based Object Detection Model》这篇论文提出了一种基于YOLOv3-Tiny的轻量级目标检测模型Micro-YOLO,通过渐进式通道剪枝和轻量级卷积层,显著减少了参数数量和计算成本,同时保持了较高的检测性能。
28 2
轻量级网络论文精度笔(一):《Micro-YOLO: Exploring Efficient Methods to Compress CNN based Object Detection Model》
|
18天前
|
机器学习/深度学习 编解码 算法
轻量级网络论文精度笔记(三):《Searching for MobileNetV3》
MobileNetV3是谷歌为移动设备优化的神经网络模型,通过神经架构搜索和新设计计算块提升效率和精度。它引入了h-swish激活函数和高效的分割解码器LR-ASPP,实现了移动端分类、检测和分割的最新SOTA成果。大模型在ImageNet分类上比MobileNetV2更准确,延迟降低20%;小模型准确度提升,延迟相当。
42 1
轻量级网络论文精度笔记(三):《Searching for MobileNetV3》
|
18天前
|
编解码 人工智能 文件存储
轻量级网络论文精度笔记(二):《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object ..》
YOLOv7是一种新的实时目标检测器,通过引入可训练的免费技术包和优化的网络架构,显著提高了检测精度,同时减少了参数和计算量。该研究还提出了新的模型重参数化和标签分配策略,有效提升了模型性能。实验结果显示,YOLOv7在速度和准确性上超越了其他目标检测器。
36 0
轻量级网络论文精度笔记(二):《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object ..》
|
26天前
|
运维 网络安全 数据安全/隐私保护
2024高校网络安全管理运维赛题目--复现+题目+wp
2024高校网络安全管理运维赛题目--复现+题目+wp
42 2
|
3月前
|
机器学习/深度学习 算法 网络架构
神经网络架构殊途同归?ICML 2024论文:模型不同,但学习内容相同
【8月更文挑战第3天】《神经语言模型的缩放定律》由OpenAI研究人员完成并在ICML 2024发表。研究揭示了模型性能与大小、数据集及计算资源间的幂律关系,表明增大任一资源均可预测地提升性能。此外,论文指出模型宽度与深度对性能影响较小,较大模型在更多数据上训练能更好泛化,且能高效利用计算资源。研究提供了训练策略建议,对于神经语言模型优化意义重大,但也存在局限性,需进一步探索。论文链接:[https://arxiv.org/abs/2001.08361]。
42 1
|
3月前
|
人工智能 算法 安全
【2023 年第十三届 MathorCup 高校数学建模挑战赛】C 题 电商物流网络包裹应急调运与结构优化问题 赛后总结之31页论文及代码
本文总结了2023年第十三届MathorCup高校数学建模挑战赛C题的解题过程,详细阐述了电商物流网络在面临突发事件时的包裹应急调运与结构优化问题,提出了基于时间序列预测、多目标优化、遗传算法和重要性评价模型的综合解决方案,并提供了相应的31页论文和代码实现。
70 0
|
3天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第23天】在数字时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将探讨网络安全漏洞、加密技术和安全意识等方面的内容,以帮助读者更好地了解如何保护自己的网络安全。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,我们将为读者提供一些实用的建议和技巧,以增强他们的网络安全防护能力。
|
1天前
|
SQL 存储 安全
网络安全与信息安全:防范漏洞、加密技术及安全意识
随着互联网的快速发展,网络安全和信息安全问题日益凸显。本文将探讨网络安全漏洞的类型及其影响、加密技术的应用以及提高个人和组织的安全意识的重要性。通过深入了解这些关键要素,我们可以更好地保护自己的数字资产免受网络攻击的威胁。