yolo如何添加模块???修改parse_model()

news/2024/7/10 22:53:12 标签: YOLO

如何修改添加模块!!!
先贴代码,加模块时有些地方需要修改,只讲核心部分!!!!

def parse_model(d, ch):  # model_dict, input_channels(3)
    logger.info('\n%3s%18s%3s%10s  %-40s%-30s' % ('', 'from', 'n', 'params', 'module', 'arguments'))
    anchors, nc, gd, gw = d['anchors'], d['nc'], d['depth_multiple'], d['width_multiple']
    na = (len(anchors[0]) // 2) if isinstance(anchors, list) else anchors  # number of anchors
    no = na * (nc + 5)  # number of outputs = anchors * (classes + 5)

    layers, save, c2 = [], [], ch[-1]  # layers, savelist, ch out
    for i, (f, n, m, args) in enumerate(d['backbone'] + d['head']):  # from, number, module, args
        m = eval(m) if isinstance(m, str) else m  # eval strings
        for j, a in enumerate(args):
            try:
                args[j] = eval(a) if isinstance(a, str) else a  # eval strings
            except:
                pass

        n = max(round(n * gd), 1) if n > 1 else n  # depth gain
        if m in [nn.Conv2d, Conv, RobustConv, RobustConv2, DWConv, GhostConv, RepConv, RepConv_OREPA, DownC, 
                 SPP, SPPF, SPPCSPC, GhostSPPCSPC, MixConv2d, Focus, Stem, GhostStem, CrossConv, 
                 Bottleneck, BottleneckCSPA, BottleneckCSPB, BottleneckCSPC, 
                 RepBottleneck, RepBottleneckCSPA, RepBottleneckCSPB, RepBottleneckCSPC,  
                 Res, ResCSPA, ResCSPB, ResCSPC, 
                 RepRes, RepResCSPA, RepResCSPB, RepResCSPC, 
                 ResX, ResXCSPA, ResXCSPB, ResXCSPC, 
                 RepResX, RepResXCSPA, RepResXCSPB, RepResXCSPC, 
                 Ghost, GhostCSPA, GhostCSPB, GhostCSPC,
                 SwinTransformerBlock, STCSPA, STCSPB, STCSPC,
                 SwinTransformer2Block, ST2CSPA, ST2CSPB, ST2CSPC,SPPCSPC_ATT,SAConv2d,CoordConv,DSConv2D]:
            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 [DownC, SPPCSPC, GhostSPPCSPC, 
                     BottleneckCSPA, BottleneckCSPB, BottleneckCSPC, 
                     RepBottleneckCSPA, RepBottleneckCSPB, RepBottleneckCSPC, 
                     ResCSPA, ResCSPB, ResCSPC, 
                     RepResCSPA, RepResCSPB, RepResCSPC, 
                     ResXCSPA, ResXCSPB, ResXCSPC, 
                     RepResXCSPA, RepResXCSPB, RepResXCSPC,
                     GhostCSPA, GhostCSPB, GhostCSPC,
                     STCSPA, STCSPB, STCSPC,
                     ST2CSPA, ST2CSPB, ST2CSPC,SPPCSPC_ATT]:
                args.insert(2, n)  # number of repeats
                n = 1
        elif m is nn.BatchNorm2d:
            args = [ch[f]]
        elif m is Concat:
            c2 = sum([ch[x] for x in f])
        elif m is Chuncat:
            c2 = sum([ch[x] for x in f])
        elif m is Shortcut:
            c2 = ch[f[0]]
        elif m is Foldcut:
            c2 = ch[f] // 2
        elif m in [Detect, IDetect, IAuxDetect, IBin, IKeypoint]:
            args.append([ch[x] for x in f])
            if isinstance(args[1], int):  # number of anchors
                args[1] = [list(range(args[1] * 2))] * len(f)
        elif m is ReOrg:
            c2 = ch[f] * 4
        elif m is Contract:
            c2 = ch[f] * args[0] ** 2
        elif m is Expand:
            c2 = ch[f] // args[0] ** 2
        elif m is CARAFE:
            c2 = ch[f]
            args = [c2, *args]
        elif m is Scale_Aware_Layer:
            c2 = args[0] * 2
            args = [ch[f[0]], args[0]]
        elif m is EVCBlock:
            c2 = ch[f]
            args = [c2, c2]
        else:
            c2 = ch[f]

直接聚焦:
在这里插入图片描述
c1:上一层的输出通道数,也是这一层的输入通道数
C2:该层的输出通道数,即将成为下一层的输入通道数
args[]:每个带参数的模块,都要指定这个东西,这个包括[c1,c2,剩下的参数],然后传给该层的模块,有些模块不需要额外参数,就只传一个输出通道数给这一层就行
切记!!!C2是这一层的输出通道数,而args[]里的输入输出通道数是给模块的,这俩c2不一样!!!C2里的输出通道数可以额外指定,比如说乘2倍
该层的输出通道数就是args[0],或者说是上一层的输出通道数(上一层没有改变输入输出通道数)
最后这一层的输出通道数c2要附加在ch中,ch储层的是每一层的输出通道数。
这个concat模块的处理,是因为他的输出通道数是这几个通道数加起来之和。

我感觉,理解了这一点,然后就足以应付绝大部分的模块了,自己就可以添加模块去了!


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

相关文章

python修改unittestreport中的用例条数

背景: 自动化框架中使用yaml文件作为数据配置,使用ddt作为数据驱动来运行测试用例,由于测试用例都是基于场景去编写,目前都是一个测试类算是一条测试用例,但基于测试报告里面一个类运行的测试方法有多个,因此统计的测试…

CCF CSP认证 历年题目自练 Day22

CCF CSP认证 历年题目自练 Day22 题目一 试题编号: 201912-1 试题名称: 报数 时间限制: 1.0s 内存限制: 512.0MB 题目分析(个人理解) 每一个人都要报多少个数字,我选择字典存储&#xff0…

9.4 链表删除指定节点(静态创建链表)

①删除的是链表头 struct Test *delNode(struct Test *head,int data) {struct Test *p head;if(p->data data){ //当删除的是链表头时head head->next;//free(p); //释放内存(链表头)return head;} } ②删除的是非链表头 wh…

C++笔记之信号量、互斥量与PV操作

C笔记之信号量、互斥量与PV操作 文章目录 C笔记之信号量、互斥量与PV操作1.信号量概念2.信号量例程一3.信号量例程二4.信号量例程三5.互斥量6.PV操作概念7.PV操作详解——抄自:https://mp.weixin.qq.com/s/vvjhbzsWQNRkU7-b_dURlQ 1.信号量概念 C中的信号量是一种同…

go-fastdfs分布式文件存储集群搭建和测试

一、官方文件 https://sjqzhang.github.io/go-fastdfs/#character2、集群原理 小集群原理: 大集群原理 二、服务端集群部署 1、在集群每个节点机器上下载安装包 (建议使用最新稳定版本) wget --no-check-certificate https://github.com/sjqzhang/go…

stm32-SPI协议

SPI协议详解(图文并茂超详细) SPI通讯协议 于是我们想有没有更好一点的串行通讯方式;相比较于UART,SPI的工作方式略有不同。 SPI是一个同步的数据总线,也就是说它是用单独的数据线和一个单独的时钟信号来保证发送端和…

Java开发一些偏冷门的面试题

文章目录 1.进程间的通信,线程间的通信首先可以先回答进程、线程和协程关于线程和进程通信 2.MySQL中的缓存情况,以及缓存命中率查询 主要从别人的面经那里看来的,以及自己被问住的一些面试题。 拿出来给自己做记录,也顺便给大家做…

用Python操作PPT的办公自动化教程

PPT通过其精美的可视化技巧以及良好的演示效果,成为了职场人士的必备技能。PPT的设计是一门大学问,无论是设计技巧,还是操作方法,都衍生出了专门的课程。 主要介绍Python操作PPT的技巧,编程的优势在于处理速度&#x…