DarkNet网络结构

一、darknet53网络结构图

文字版:卷积+(下采样卷积+1残差块)+(下采样卷积+2残差块)+(下采样卷积+8残差块)+(下采样卷积+8残差块)+(下采样卷积+4*残差块)

在这里插入图片描述

     不难看出,darknet53就是重复堆叠下采样卷积+n*残差块(n为残差块的个数)这个结构而组成的。而更基本的结构就是残差块了,因此我们先构建出残差块,然后重复堆叠上述结构darknet53就完成了。

二、残差快结构

       残差块结构不止下图这一种,但我们只讨论darknet53中用到的这种。如下图所示,残差块结构由两条支路组成,一条支路将上一层输出的feature map进行卷积等操作,另一条支路将上一层输出的feature map恒等映射,并与刚才卷积操作完的feature map进行逐元素相加,因此两条支路的通道数必须相等。也就是说发生卷积等操作的那条支路(残差路)的输出不能改变feature map的通道数。

另外,darknet53在所有的卷积之后和激活(leakyrelu)之前会插入bn层(batch normalization)。 

import torch
import torch.nn as nn
# 残差模块
class ResidualBlock(nn.Module):
    def __init__(self,inplanes,planes):
        # inplanes是下采样卷积完输入到残差支路的通道数,planes是一个列表,planes[0]是残差第一个卷积操作输出通道数,也是第二个卷积操作输入通道数
        # planes[1]是残差第二个卷积操作输出通道数
        super(ResidualBlock,self).__init__()
        # 残差支路的第一个卷积操作:卷积核1*1,步长1,不填充,不加偏置
        self.conv1 = nn.Conv2d(inplanes,planes[0],kernel_size=1,stride=1,padding=0,bias=False)
        # bn层的输入参数是上一层输出的通道数
        self.bn1 = nn.BatchNorm2d(planes[0])
        # LeakyReLU的参数是负半轴的斜率,正半轴是1
        self.relu1 = nn.LeakyReLU(0.1)
        # 残差支路的第二个卷积操作:卷积核3*3,步长1,填充1(p=1),不加偏置
        # 卷积输出尺寸计算公式 (n-f+2p)/s+1 此处f=3,p=1,s=1
        self.conv2 = nn.Conv2d(planes[0],planes[1],kernel_size=3,stride=1,padding=1,bias=False)
        self.bn2 = nn.BatchNorm2d(planes[1])
        self.relu2 = nn.LeakyReLU(0.1)

        # 【注】darknet的基本操作:卷积+bn+relu

    def forward(self,x):
        # 恒等映射支路
        residual = x 
        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu1(out)
        out = self.conv2(out)
        out = self.bn2(out)
        out = self.relu2(out)
		# 将恒等映射与残差路逐元素相加	
        out = residual + out

 基本结构:下采样卷积+残差块

下图示下采样卷积+n*残差块结构:

在这里插入图片描述

       除了第一个单独的卷积+bn+激活操作,一共有5组下采样卷积+n*残差块,按顺序是:(下采+1残差)(下采+2残差)(下采+8残差)(下采+8残差)(下采+4*残差),所以待会儿会出现一个储存残差块个数的列表blocks_num=[1,2,8,8,4]

### 关于YOLOv7中CSPDarkNet53架构 对于YOLOv7中的CSPDarkNet53网络结构,虽然具体针对YOLOv7版本的官方结构图可能不易获取,但是可以基于已有的YOLO系列发展来推测其设计原则。CSPDarknet53首次出现在YOLOv4中作为一种优化骨干网的设计[^1]。 #### CSPDarkNet53的核心特点 - **跨阶段部分连接(Cross Stage Partial connections)**:这种机制减少了计算量并提高了特征提取效率。 - **残差模块(Residual Blocks)**:通过跳跃连接保留梯度路径,使得深层网络训练更加稳定有效。 #### 架构描述 CSPDarkNet53通常由多个卷积层和残差块组成,这些组件被划分为不同的阶段(stage),每个阶段内部采用部分密集连接的方式构建。相比于原始的Darknet53,在某些特定位置引入了额外的瓶颈结构(bottleneck layer)以进一步提升性能表现。 尽管具体的YOLOv7 CSPDarkNet53图形化展示未直接提及,但可以根据上述特性以及之前版本的经验来进行合理推断。以下是简化版的文字表述: 1. 输入尺寸一般设定为640×640像素; 2. 初始阶段包含若干基础卷积操作用于初步降采样; 3. 随后进入几个主要阶段,每一段都包含了多组带有跳接的残差单元; 4. 各个阶段之间存在下采样的过程,逐步降低空间分辨率的同时增加通道数; 5. 整体框架遵循自底向上的模式,最终输出用于后续的目标检测任务处理。 ```mermaid graph TB; A[Input Image 640x640]; B(Conv Layer); C{Stage 1}; D{Stage 2}; E{Stage N}; A -->|Initial Convolution| B; B --> C; C --> D; D --> E; subgraph "Each stage contains" F[Conv Layers]; G[Residual Block w/ Skip Connections]; H[Bottleneck Layer]; F -.-> G; G --> H; end style A fill:#f96,stroke:#333,stroke-width:4px; ``` 此图表仅作为概念性的示意,并不代表精确的比例关系或确切层数配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值