【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 详解 的相关文章

  • 【darknet】【yolov3】训练踩坑

    本文已解决问题概述 xff1a 测试准确率时 xff0c 没有results 文件夹的访问权限 xff1a Segmentation fault 执行darknet 相关命令是 xff0c 无法找到 libcudart so 10 0 文件
  • jetson nano 部署yoloV3,yoloV4,yoloV3-tiny,yoloV4-tiny

    转载自 xff1a jetson nano 部署yoloV3 yoloV4 yoloV3 tiny yoloV4 tiny dingding的专栏 CSDN博客 jetson nano 部署yoloV3 yoloV4 yoloV3 tiny
  • 【深度学习】Yolov3详解笔记及Pytorch代码

    Yolov3详解笔记及Pytorch代码 预测部分网络结构backbone xff1a Darknet 53output预测结果的解码 训练部分计算loss所需参数pred是什么target是什么loss的计算过程 预测部分 网络结构 DB
  • [darknet_ros-1] process has died [pid 18454, exit code 255, XTdrone进行目标检测环境搭建问题的解决方式

    在使用XTdrone进行目标检测的过程中 xff0c 当执行下面两行命令后会报错 启动YOLO roslaunch darknet ros darknet ros launch 新终端启动usb cam roslaunch usb cam
  • 多GPU训练keras-yolov3

    qqwweee keras yolo3提供的版本代码没有多GPU选项 xff0c 因为网络的输出是一个loss xff0c 使用keras提供的multi gpu model函数时会报错 xff0c 因为multi gpu model的原理
  • darknet_ros部署及测试

    一 darknet ros部署 1 创建ROS工作空间 span class token function mkdir span p catkin ws src span class token builtin class name cd
  • yolov3的训练(五)darknet的VOC测试集和训练集以及训练前准备

    VOC测试集和训练集 同学们 xff0c 这个系列的文件不要直接就跟着我操作了 xff0c 因为这个是踩坑的记录 xff0c 不是教程 xff0c 我只是将整个流程记录下来 xff0c 让后面的同学操作的时候能够避开这些坑 xff0c 希望
  • yolov3的训练(七)使用darknet_ros框架进行识别与模型导入

    同学们 xff0c 这个系列的文件不要直接就跟着我操作了 xff0c 因为这个是踩坑的记录 xff0c 不是教程 xff0c 我只是将整个流程记录下来 xff0c 让后面的同学操作的时候能够避开这些坑 xff0c 希望你能将整个系列的操作流
  • yolov3详解

    目录 1 anchor的计算机制 2 anchor对应机制 3 网络结构 4 训练过程 5 测试过程 1 anchor的计算机制 锚框anchor是真值框和预测框之间的桥梁 xff1a 预测框在锚框基础上 xff0c 预测出框的大小 xff
  • 转载:配置darknet_ros实现yolo检测

    来自第三届华南农业大学人工智能协会 xff1a 会长部 麦彦恒出品 配置darknet ros实现yolo检测 M朗拿度的博客 CSDN博客
  • yolov3、yolov5和DETR在NVIDIA Xavier测速(TensorRT)

    本人实测YoloV3 YoloV5和DETR的TensorRT版本在NVIDIA Xavier上的测速结果如下 xff0c 任何问题留言讨论
  • ROS智能车实现darknet_ros检测物体

    文章目录 一 搭建智能车环境1 下载包以及编译1 1 下载源码包1 2 编译1 3 错误解决 xff08 1 xff09 controllers相关 xff08 2 xff09 driver base相关 xff08 3 xff09 ack
  • yolov3

    YOLOv3 YOLOv3的总体网络架构图 可根据官方代码中的yolov3 cfg进行一一对应 xff0c 标号 0 0 0 是第一个 convolutional Darknet 53 和DarkNet 19一样 xff0c 同样下采样32
  • Darknet YoloV4编译+训练(避免踩坑)

    AlexAB darknet yolov4编译 43 训练 时间间隔好几天今天来更新一下yolov4的训练 训练篇 在训练之前需要对大佬的源码进行编译本本机编译 xff0c 编译过程可查看下述链接 xff1a https blog csdn
  • c++ 调用yolov3-yolov4

    ifdef WIN32 define OPENCV define GPU endif include lt iostream gt include lt windows h gt include 34 yolo v2 class hpp 3
  • 极简版pytorch实现yolov3-tiny

    参考https github com bubbliiiing yolo3 pytorchtrain py流程 xff1a 加载数据dataloader py正向传播tiny py反向传播loss pydataloader py span c
  • 【YOLOv3 decode】YOLOv3中解码理解decode_box

    文章目录 1 解码是什么意思2 代码解读3 生成网格中心 代码详解4 按照网格格式生成先验框的宽高 代码详解5 感谢链接 1 解码是什么意思 在利用YOLOv3网络结构提取到out0 out1 out2之后 xff0c 不同尺度下每个网格点
  • C++调用Yolov3模型实现目标检测

    C 43 43 调用Yolov3模型实现目标检测 使用开源权重文件 xff0c 此训练模型包含80种物体 文件下载地址 xff1a 预训练权重文件 xff1a https pjreddie com media files yolov3 we
  • 基于KITTI数据集的KERAS-YOLOV3实践

    数据整理 KERAS YOLOV3的GITHUB地址 xff1a https github com yangchengtest keras yolo3 该项目支持的数据结构 xff1a One row for one image Row f
  • 暗网 YOLO 图像大小

    我正在尝试在 Darknet YOLO v2 中训练自定义对象分类器https pjreddie com darknet yolo https pjreddie com darknet yolo 我收集了一个图像数据集 其中大多数尺寸为 6

随机推荐

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

    作为网络专栏的开篇导文 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