yolov7简化yaml配置文件

news/2024/7/11 1:57:48 标签: YOLO, 计算机视觉, 目标检测

yolov7代码结构简单,效果还好,但是动辄超过70几个模块的配置文件对于想要对网络进行魔改的朋友还是不怎么友好的,使用最小的tiny也有77个模块

代码的整体结构简单,直接将ELAN结构化写成一个类就能像yolov5一样仅仅只有20几个模块,方便对网络结构进行魔改,看着也不容易头晕。

v7的网络结构可以参看:理解yolov7网络结构_yolov7的常用anchor_athrunsunny的博客-CSDN博客

这里先放一张改好的网络结构运行结果

好,上主菜,这里对tiny的结构进行修改,v7的修改类似就是在ELAN这个类中增加卷积层就行

先创建配置文件yolov7-tiny-ELAN.yaml

# parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple

activation: nn.ReLU()
# anchors
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

# yolov7-tiny backbone
backbone:
  # [from, number, module, args] c2, k=1, s=1, p=None, g=1, act=True
  [[-1, 1, Conv, [32, 3, 2, None, 1]],  # 0-P1/2

   [-1, 1, Conv, [64, 3, 2, None, 1]],  # 1-P2/4
   [-1, 1, ELAN, [64, 1, 1, None, 1]],  # 2

   [-1, 1, MP, []],  # 3-P3/8
   [-1, 1, ELAN, [128, 1, 1, None, 1]],  # 4

   [-1, 1, MP, []],  # 5-P4/16
   [-1, 1, ELAN, [256, 1, 1, None, 1]],  # 6

   [-1, 1, MP, []],  # 7-P5/32
   [-1, 1, ELAN, [512, 1, 1, None, 1]],  # 8
  ]

# yolov7-tiny head
head:
  [[-1, 1, SPPCSPCSIM, [256]], # 9

   [-1, 1, Conv, [128, 1, 1, None, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [6, 1, Conv, [128, 1, 1, None, 1]], # route backbone P4
   [[-1, -2], 1, Concat, [1]], # 13

   [-1, 1, ELAN, [128, 1, 1, None, 1]],  # 14

   [-1, 1, Conv, [64, 1, 1, None, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [4, 1, Conv, [64, 1, 1, None, 1]], # route backbone P3
   [[-1, -2], 1, Concat, [1]],

   [-1, 1, ELAN, [64, 1, 1, None, 1]],  # 19

   [-1, 1, Conv, [128, 3, 2, None, 1]],
   [[-1, 14], 1, Concat, [1]],

   [-1, 1, ELAN, [128, 1, 1, None, 1]],  # 22

   [-1, 1, Conv, [256, 3, 2, None, 1]],
   [[-1, 9], 1, Concat, [1]],

   [-1, 1, ELAN, [256, 1, 1, None, 1]],  # 25

   [19, 1, Conv, [128, 3, 1, None, 1]],
   [22, 1, Conv, [256, 3, 1, None, 1]],
   [25, 1, Conv, [512, 3, 1, None, 1]],

   [[26,27,28], 1, Detect, [nc, anchors]],   # Detect(P3, P4, P5)
  ]

在common.py中增加

class ELAN(nn.Module):
    # Yolov7 ELAN with args(ch_in, ch_out, kernel, stride, padding, groups, activation)
    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):
        super().__init__()
        c_ = int(c2 // 2)
        c_out = c_ * 4
        self.cv1 = Conv(c1, c_, k=k, s=s, p=p, g=g, act=act)
        self.cv2 = Conv(c1, c_, k=k, s=s, p=p, g=g, act=act)
        self.cv3 = Conv(c_, c_, k=3, s=s, p=p, g=g, act=act)
        self.cv4 = Conv(c_, c_, k=3, s=s, p=p, g=g, act=act)
        self.cv5 = Conv(c_out, c2, k=k, s=s, p=p, g=g, act=act)

    def forward(self, x):
        x1 = self.cv1(x)
        x2 = self.cv2(x)
        x3 = self.cv3(x2)
        x4 = self.cv4(x3)
        x5 = torch.cat((x1, x2, x3, x4), 1)
        return self.cv5(x5)


class SPPCSPCSIM(nn.Module):
    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5, k=(5, 9, 13)):
        super(SPPCSPCSIM, self).__init__()
        c_ = int(2 * c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.m = nn.ModuleList([nn.MaxPool2d(kernel_size=x, stride=1, padding=x // 2) for x in k])
        self.cv3 = Conv(4 * c_, c_, 1, 1)
        self.cv4 = Conv(2 * c_, c2, 1, 1)

    def forward(self, x):
        x1 = self.cv1(x)
        x2 = self.cv2(x)
        x3 = torch.cat([x2] + [m(x2) for m in self.m], 1)
        x4 = self.cv3(x3)
        x5 = torch.cat((x1, x4), 1)
        return self.cv4(x5)

在yolo.py中的parse_model中增加

        if m in (Conv, GhostConv, Bottleneck, GhostBottleneck, SPP, SPPF, DWConv, MixConv2d, Focus, CrossConv,
                 BottleneckCSP, C3, C3TR, C3SPP, C3Ghost, nn.ConvTranspose2d, DWConvTranspose2d, C3x, SPPCSPC, RepConv,
                 RFEM, ELAN, SPPCSPCSIM):
            c1, c2 = ch[f], args[0]
            if c2 != no:  # if not output
                c2 = make_divisible(c2 * gw, 8)

            args = [c1, c2, *args[1:]]
            if m in [BottleneckCSP, C3, C3TR, C3Ghost, C3x]:
                args.insert(2, n)  # number of repeats
                n = 1

使用 yolov7-tiny-ELAN.yaml在yolo.py中运行就能看到上面结构精简后的网络结构图。


http://www.niftyadmin.cn/n/5013755.html

相关文章

CSS 斜条纹进度条

效果&#xff1a; 代码&#xff1a; html: <div class"active-line flex"><!-- lineWidth&#xff1a;灰色背景 --><div class"bg-line"><div v-for"n in 30" class"gray"></div></div><div…

华为云云耀云服务器L实例评测|服务器实例基础使用实践

&#x1f996;我是Sam9029&#xff0c;一个前端 Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主 **&#x1f431;‍&#x1f409;&#x1f431;‍&#x1f409;恭喜你&#xff0c;若此文你认为写的不错&#xff0c;不要吝啬你的赞扬&#xff0c;求…

Spring基础及IoC容器的理解

Spring概念&#xff1a; 通常所说的Spring指的是Spring Framewprk(Spring框架)&#xff0c;它是一个开源的框架。用一句话概括就是&#xff1a;Spring是包含了众多工具方法的IoC容器。 什么是容器&#xff1f; 容器是用来容纳某种物品的装置&#xff0c;在之前的学习中&…

如何在工作中体现数据开发的业务敏感度?

chatgpt对该问题的回答&#xff1a; 数据同学的业务敏感度是指数据同学对业务需求的理解、分析和满足能力&#xff0c;以及从数据角度为业务提供洞察和建议的能力。以下是一些提高业务敏感度的方法&#xff1a; 深入了解业务&#xff1a;了解公司的业务模式、产品线、目标用户…

Spring Security OAuth2 远程命令执行漏洞

文章目录 一、搭建环境二、漏洞验证三、准备payload四、执行payload五、变形payload 一、搭建环境 cd vulhub/spring/CVE-2016-4977/ docker-compose up -d 二、漏洞验证 访问 http://192.168.10.171:8080/oauth/authorize?response_type${233*233}&client_idacme&s…

【vue2中的pdf预览】iframe/pdf.js/vue-pdf

前言 vue2中预览pdf的方法有pdf.js和vue-pdf等。下面进行简单对比&使用方法的介绍。 正文 直接使用iframe预览pdf 使用iframe预览pdf 如果后端返回的不是url&#xff0c;那么需要使用responseType blob来读取后端传来的内容。 扩展&#xff1a; 同样是使用iframe进行…

数字化赋能企业转型

优秀商业模式的判断的有四个标准&#xff1a;团队&#xff0c;用户体验&#xff0c;控制成本&#xff0c;效率提升&#xff1b;而商业模式分为面向前端的五个战略规划&#xff0c;包括&#xff1a;价值主张&#xff0c;客户关系&#xff0c;客户细分&#xff0c;渠道通路&#…

WRFDA资料同化实践技术应用

数值预报已经成为提升预报质量的重要手段&#xff0c;而模式初值质量是决定数值预报质量的重要环节。资料同化作为提高模式初值质量的有效方法&#xff0c;成为当前气象、海洋和大气环境和水文等诸多领域科研、业务预报中的关键科学方法。资料同化新方法的快速发展&#xff0c;…