yolov7简化网络yaml配置文件

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 multipleactivation: 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_ * 4self.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 channelsself.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 outputc2 = make_divisible(c2 * gw, 8)args = [c1, c2, *args[1:]]if m in [BottleneckCSP, C3, C3TR, C3Ghost, C3x]:args.insert(2, n)  # number of repeatsn = 1

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

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

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

相关文章

【操作系统】进程控制

进程控制:创建新进程,撤销已有进程,实现进程状态转换等。 原语:进程控制用的程序段。执行期间不允许中断,用"关中断"和"开中断"指令(特权指令)实…

Android性能优化之应用瘦身(APK瘦身)

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览2.1 apk组成 三、优化方向3.1 源代码3.1.1 代码混…

Dedecms最新版--0day分享分析(二)

前言 接上一篇的Tricks,既然利用远程文件下载方式成为了实现RCE的最好方法,毕竟在执行的时候没有恶意shell文件,恶意木马被存放于远端服务器,那么下文的day就是对远程恶意文件的利用。 环境 下载最新版本: https://…

Kotlin Files Paths write ByteArray writeString写多行BufferedWriter

Kotlin Files Paths write ByteArray writeString写多行BufferedWriter import java.nio.file.Files import java.nio.file.Paths import java.nio.file.StandardOpenOptionfun main(args: Array<String>) {val filePath "./myfile.txt"val path Paths.get(…

ModuleNotFoundError: No module named ‘gevent‘

1、先确定pip版本&#xff1a; pip3 list: 看到没有gevent包 如果pip版本不是最新版可以使用命令python -m pip install --upgrade pip进行更新&#xff0c; 2、安装 pip3 install gevent 安装完成

Java密码学之加解密

前篇&#xff1a;Java密码学之数字签名_东皋长歌的博客-CSDN博客 日常开发中用的比较多的功能点&#xff0c;加解密数据&#xff0c;用Java实现也是很快很实用。 下面记录一下加解密数据的过程。 1&#xff0c;创建密钥对生成器 KeyPairGenerator keyPairGen KeyPairGener…

第29章_瑞萨MCU零基础入门系列教程之改进型环形缓冲区

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

Qt应用开发(基础篇)——普通按钮类 QPushButton QCommandLinkButton

一、前言 QPushButton类继承于QAbstractButton&#xff0c;是一个命令按钮的小部件。 按钮基类 QAbstractButton 按钮或者命令按钮是所有图形界面框架最常见的部件&#xff0c;当按下按钮的时候触发命令、执行某些操作或者回答一个问题&#xff0c;典型的按钮有OK&#xff0c;A…

F. Magic Will Save the World(DP)

Problem - F - Codeforces 黑暗势力的传送门在世界边界打开了&#xff0c;现在整个世界都面临着可怕的威胁。为了关闭传送门并拯救世界&#xff0c;你需要一个接一个地击败n个从传送门中出现的怪物。 只有女巫Vika能够应对这个威胁。她有两个魔法力量——水之魔法和火之魔法。…

Java学习之--类和对象

&#x1f495;粗缯大布裹生涯&#xff0c;腹有诗书气自华&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;Java学习之--类和对象 类和对象 类的实例化&#xff1a; 1.什么叫做类的实例化 利用类创建一个具体的对象就叫做类的实例化&#xff01; 当我们创建了…

数据在内存中的存储——练习3

题目&#xff1a; 3.1 #include <stdio.h> int main() {char a -128;printf("%u\n",a);return 0; }3.2 #include <stdio.h> int main() {char a 128;printf("%u\n",a);return 0; }思路分析&#xff1a; 首先二者极其相似%u是无符号格式进行…

Qt点亮I.MX6U开发板的一个LED

本篇开始将会介绍与开发版相关的Qt项目&#xff0c;首先从点亮一个LED开始。I.MX6U和STM32MP157的相关信息都会用到&#xff0c;但是后期还是将I.MX6U的学习作为重点。当然其他开发版的开发也可以参考本博文。 文章目录 1. Qt是如何操控开发板上的一个LED2. 出厂内核设备树中注…