【Darknet-53】YOLOv3 backbone Darknet-53 详解

2023-05-16

文章目录

  • 1 模型计算量与参数量
  • 2 Darknet-53网络
  • 3 感谢链接

1 模型计算量与参数量

模型计算量与参数量的计算方式主要有两种,一种是使用thop库,一种是使用torchsummaryX。

  • 使用pip install thop安装thop库
  • 使用pip install torchsummaryX安装torchsummaryX库

2 Darknet-53网络

可直接运行下方代码,结合注释和结果理解

本例中darknet53主要用于yolov3中的主干网络
darknet-53网络框图

import math
from collections import OrderedDict
import torch.nn as nn
import torch

from torchsummaryX import summary
from thop import profile

# ---------------------------------------------------------------------#
#   残差结构
#   利用一个1x1卷积下降通道数,然后利用一个3x3卷积提取特征并且上升通道数
#   最后接上一个残差边
# ---------------------------------------------------------------------#

# ---------------基本残差块-----------------
class BasicBlock(nn.Module):
    def __init__(self, inplanes, planes):       # inplanes是一个int,planes是一个list,包括两个数字
        super(BasicBlock, self).__init__()      # 1x1卷积下降通道数,3x3卷积上升通道数,减少参数
        self.conv1 = nn.Conv2d(inplanes, planes[0], kernel_size=1, stride=1, padding=0, bias=False)
        self.bn1 = nn.BatchNorm2d(planes[0])
        self.relu1 = nn.LeakyReLU(0.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)

    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
        return out


class DarkNet(nn.Module):
    def __init__(self, layers):
        super(DarkNet, self).__init__()
        self.inplanes = 32
        # H,W,C:416,416,3 -> 416,416,32
        self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=3, stride=1, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(self.inplanes)
        self.relu1 = nn.LeakyReLU(0.1)

        # ---------------------------------------#
        #   下面利用_make_layer进行残差块堆叠
        # ---------------------------------------#
        # 416,416,32 -> 208,208,64
        self.layer1 = self._make_layer([32, 64], layers[0])     # self._make_layer(planes, blocks)
        # 208,208,64 -> 104,104,128
        self.layer2 = self._make_layer([64, 128], layers[1])
        # 104,104,128 -> 52,52,256
        self.layer3 = self._make_layer([128, 256], layers[2])
        # 52,52,256 -> 26,26,512
        self.layer4 = self._make_layer([256, 512], layers[3])
        # 26,26,512 -> 13,13,1024
        self.layer5 = self._make_layer([512, 1024], layers[4])

        self.layers_out_filters = [64, 128, 256, 512, 1024]  # 表示几个结构块的输出通道数

        # 进行权值初始化
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
                m.weight.data.normal_(0, math.sqrt(2. / n))
            elif isinstance(m, nn.BatchNorm2d):
                m.weight.data.fill_(1)
                m.bias.data.zero_()

    # ---------------------------------------------------------------------#
    #   在每一个layer里面,首先利用一个步长为2的3x3卷积进行下采样
    #   然后进行残差结构的堆叠
    # ---------------------------------------------------------------------#
    def _make_layer(self, planes, blocks):  # blocks表示堆叠该结构块次数
        layers = []
        # ---------------------------------------------#
        # 	下采样,步长为2,卷积核大小为3,
        #	特征图长和宽压缩、通道数扩张到planes[1]
        # ---------------------------------------------#
        layers.append(("ds_conv", nn.Conv2d(self.inplanes, planes[1], kernel_size=3, stride=2, padding=1, bias=False)))
        layers.append(("ds_bn", nn.BatchNorm2d(planes[1])))
        layers.append(("ds_relu", nn.LeakyReLU(0.1)))
        # ---------------------------------------------#
        # 	加入残差结构,利用一个1x1卷积下降通道数到planes[0],
        # 	然后利用一个3x3卷积提取特征并且上升通道数到planes[1]
        # ---------------------------------------------# 
        self.inplanes = planes[1]
        for i in range(0, blocks):
            layers.append(("residual_{}".format(i), BasicBlock(self.inplanes, planes)))
        return nn.Sequential(OrderedDict(layers))

    def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu1(x)

        x = self.layer1(x)
        x = self.layer2(x)
        # -----------------------------------------------------#
        # 	这样区分写,是因为在yolov3中需要使用这三个输出特征层进行后续处理
        # -----------------------------------------------------#
        out3 = self.layer3(x)           
        out4 = self.layer4(out3)
        out5 = self.layer5(out4)

        return out3, out4, out5


def darknet53():
    model = DarkNet([1, 2, 8, 8, 4])
    return model


if __name__ == '__main__':
    model = darknet53()
    print(model)

    # --------------------------------------#
    #   使用thop计算模型计算量与参数量
    # --------------------------------------#
    input = torch.randn(1, 3, 416, 416)     # batch_size, channels, height, weight, NCHW
    flops, params = profile(model, inputs=(input,))     # 计算量,参数量
    print(flops, params)

    # --------------------------------------#
    #   使用TorchsummaryX计算模型计算量与参数量
    # --------------------------------------#
    summary(model, torch.zeros(1, 3, 416, 416))

thop库输出结果:警告表示该部分计算量与参数量的对待方式(不算在内)

[INFO] Register count_convNd() for <class 'torch.nn.modules.conv.Conv2d'>.
[WARN] Cannot find rule for <class 'torch.nn.modules.batchnorm.BatchNorm2d'>. Treat it as zero Macs and zero Params.
[WARN] Cannot find rule for <class 'torch.nn.modules.activation.LeakyReLU'>. Treat it as zero Macs and zero Params.
[WARN] Cannot find rule for <class '__main__.BasicBlock'>. Treat it as zero Macs and zero Params.
[WARN] Cannot find rule for <class 'torch.nn.modules.container.Sequential'>. Treat it as zero Macs and zero Params.
[WARN] Cannot find rule for <class '__main__.DarkNet'>. Treat it as zero Macs and zero Params.
24515805184.0 40549216.0    # 计算量 参数量

torchsummaryX库输出结果:可展示每层的情况,参数量和计算量

====================================================================================================
                                            Kernel Shape        Output Shape  \
Layer                                                                          
0_conv1                                    [3, 32, 3, 3]   [1, 32, 416, 416]   
1_bn1                                               [32]   [1, 32, 416, 416]   
2_relu1                                                -   [1, 32, 416, 416]   
3_layer1.Conv2d_ds_conv                   [32, 64, 3, 3]   [1, 64, 208, 208]   
4_layer1.BatchNorm2d_ds_bn                          [64]   [1, 64, 208, 208]   
...
                                          Params    Mult-Adds  
Layer                                                          
0_conv1                                    864.0  149.520384M  
1_bn1                                       64.0         32.0  
2_relu1                                        -            -  
3_layer1.Conv2d_ds_conv                  18.432k  797.442048M  
...
153_layer5.residual_3.Conv2d_conv2     4.718592M  797.442048M  
154_layer5.residual_3.BatchNorm2d_bn2     2.048k       1.024k  
155_layer5.residual_3.LeakyReLU_relu2          -            -  
----------------------------------------------------------------------------------------------------
                            Totals
Total params            40.584928M        # 参数量
Trainable params        40.584928M
Non-trainable params           0.0
Mult-Adds             24.51582304G        # 计算量 
====================================================================================================

3 感谢链接

https://blog.csdn.net/weixin_44791964/article/details/105310627
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Darknet-53】YOLOv3 backbone Darknet-53 详解 的相关文章

随机推荐

  • 从输入一个网址到浏览器显示页面经历的全过程

    作为网络专栏的开篇导文 xff0c 本文概况介绍下经典案例 xff1a 从输入一个网址到浏览器显示页面的全过程 步骤概要介绍如下 xff1a 1 输入网址2 DNS解析获取域名对应的IP地址3 建立TCP连接4 web浏览器向web服务器发
  • 端口号是什么以及常见端口号

    端口号 具有网络功能的应用软件的标识号 注意 xff0c 端口号是不固定的 xff0c 即可以由用户手工可以分配 xff08 当然 xff0c 一般在软件编写时就已经定义 xff09 当然 xff0c 有很多应用软件有公认的默认的端口 xf
  • DNS域名解析过程

    目录 1 DNS2 域名系统DNS 的作用3 域名的层级关系4 DNS域名解析过程 递归查询迭代查询 5 高速缓存6 DNS相关面试问题 1 DNS DNS xff08 Domain Name System xff09 是域名系统的英文缩写
  • java常见面试题

    目录 基础语法 1 Java 语言的优点 xff1f 2 Java 如何实现平台无关 xff1f 3 JVM xff0c JDK 和 JRE 的区别 xff1f 4 Java 按值调用还是引用调用 xff1f 5 浅拷贝和深拷贝的区别 xf
  • 分段分页存储

    2020 4 27 在家的网课 xff0c 无聊 xff0c 记录一下分页 xff0c 分段 xff0c 段页式存储笔记 昨天刚学了分页存储 xff0c 听得我一脸懵逼 xff0c 好在课下花了很长时间才弄懂 1 分页存储管理 1 分页存储
  • 解压码

    BN00001 22kke BN00002 88cde BN00003 00ike BN00004 76cdb BN00005 09dbm BN00006 0mndc BN00007 cd78d BN00008 bdmf8 BN00009
  • 保险项目业务流程

    1 整个项目分为四分模块 xff1a 信息采集模块 信息验证 审批 生成合同 xff08 开单 xff09 信息采集模块 xff1a 包括购买保险产品 xff0c 客户个人信息 1 纸质文档给客户填写 xff0c 在回来录入系统 2 客户直
  • IDEA使用maven自定义archetype

    标题自定义archetype 在pom文件中添加archetype plugin span class token generics span class token punctuation lt span plugin span clas
  • 自定义Perperties文件内容读取

    新建properties文件放在resources目录下 properties文件内容 url span class token operator 61 span jdbc span class token operator span my
  • 如何使用Google TV设置Chromecast

    Justin Duino 贾斯汀 杜伊诺 Justin Duino Google changed up its streaming platform with the release of the Chromecast with Googl
  • 使用CSS中的Hover控制显示子元素或者兄弟元素

    lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt meta name 61 34 viewport
  • maven项目中的jdbc连接步骤

    在maven项目pom xml中到入驱动包 xff08 以下是驱动包代码 xff09 lt dependencies gt lt https mvnrepository com artifact mysql mysql connector
  • executeUpdate()与executeQuery()的使用

    增 删 改 用executeUpdate xff08 xff09 返回值为int型 xff0c 表示被影响的行数 例子 查用executeQuery 返回的是一个集合 next xff08 xff09 表示 指针先下一行 xff0c 还有f
  • Access denied for user ''@'localhost' (using password: YES)错误解决方法

    远程登录被拒绝 xff0c 要改一个表数据的属性让他可以远程登录 解决方法如下 xff0c 执行命令 xff1a mysql gt use mysql mysql gt select host user from user 查看结果是不是r
  • 基于yolov5和Tesseract-OCR车牌识别项目 Linux系统上搭建运行(大概结构)

    项目大概分为两部分 xff0c 首先使用yolov5进行目标检测并截图 xff1b 然后对图片一系列的处理后使用Tesseract OCR进行字符识别 xff08 本文为简易版框架结构 xff0c 如果看完感兴趣可以在文末跳转看细节操作 x
  • ubuntu20.04使用微软Azure Kinect DK 实现三维重建demo记录

    本文仅为在ubuntu20 04实现Azure Kinect DK 三维重建demo xff0c 此文记录实现过程仅供学习 xff0c 同时为大家避坑 xff0c 文中参考大量文章已列至末尾 1 ros安装 2 安装微软 DK的sdk 3
  • 常见一面问题

    1 智能指针 常用的c 43 43 库 Standard Template Library STL Algorithms 算法 Containers 容器 Functions 函数 Iterators 迭代器 Boost 同样是大量C 43
  • ROS datatype/md5sum错误

    I got this error today Problem ERROR 1576785283 032878520 Client rostopic 21515 1576784759002 wants topic timestamp to h
  • 快速安装Pytorch和Torchvision

    文章目录 1 Linux下激活自己的虚拟环境并查看Python版本2 查看需要安装的Pytorch和Torchvision版本3 直接命令行安装3 1 如果不报错的话3 2 ERROR Could not install packages
  • 【Darknet-53】YOLOv3 backbone Darknet-53 详解

    文章目录 1 模型计算量与参数量2 Darknet 53网络3 感谢链接 1 模型计算量与参数量 模型计算量与参数量的计算方式主要有两种 xff0c 一种是使用thop库 xff0c 一种是使用torchsummaryX 使用pip ins