Pytorch----DarkNet53网络

1. DarkNet网络结构

Yolov3、Yolov4的backbone采用了CSP_DarkNet_53网络,其激活函数采用Mish。本文章复现DarkNet_53激活函数采用LeakyReLu,两者结构基本一致。

1.1 卷积单元----Convolutional

Convolutional卷积单元由Conv+BN+LeakyReLu组成

class Conv_BN_LRelu(nn.Module):
    def __init__(self, input_ch, output_ch, kernel_s, s, p=1, bias=False):
        super(Conv_BN_Mish, self).__init__()
        self.conv_bn_leaky = nn.Sequential(
            nn.Conv2d(input_ch, output_ch, kernel_s, s, p),
            nn.BatchNorm2d(output_ch),
            nn.LeakyReLU(0.01),
        )
    def forward(self, x):
        return self.conv_bn_leaky(x)

1.2 Residual

Residual由一个1x1的卷积和一个3X3的卷积组成,前者卷积将输入的通道数减半,后者卷积则恢复原来的通道数,如图黄色所示。优点:更好提取特征的同时又保留了原始信息。
在这里插入图片描述

class Residual(nn.Module):
    def __init__(self, input_ch):
        super(Residual, self).__init__()
        output_ch = input_ch//2
        self.residual = nn.Sequential(
            Conv_BN_LRelu(input_ch, output_ch, 1, 1, 0),
            Conv_BN_LRelu(output_ch, input_ch, 3, 1, 1)
        )
    def forward(self, x):
        return x + self.residual(x)

二、Pytorch实现

import torch
from torch import nn
from torch.utils.tensorboard import SummaryWriter
from torchsummary import summary
import torch.nn.functional as F

class Conv_BN_LRelu(nn.Module):
    def __init__(self, input_ch, output_ch, kernel_s, s, p=1, bias=False):
        super(Conv_BN_LRelu, self).__init__()
        self.conv_bn_leaky = nn.Sequential(
            nn.Conv2d(input_ch, output_ch, kernel_s, s, p),
            nn.BatchNorm2d(output_ch),
            nn.LeakyReLU(0.01),
        )

    def forward(self, x):
        return self.conv_bn_leaky(x)

class Residual(nn.Module):
    def __init__(self, input_ch):
        super(Residual, self).__init__()
        output_ch = input_ch//2
        self.residual = nn.Sequential(
            Conv_BN_LRelu(input_ch, output_ch, 1, 1, 0),
            Conv_BN_LRelu(output_ch, input_ch, 3, 1, 1)
        )

    def forward(self, x):
        return x + self.residual(x)

class Darknet(nn.Module):
    def __init__(self, feature, num_class=1000):
        super(Darknet, self).__init__()
        self.feature = feature
        self.classifier = nn.Sequential(
            nn.Linear(1024, num_class)
        )

    def forward(self, x):
        x = self.feature(x)
        m = nn.AdaptiveAvgPool2d((1, 1))
        x = m(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)
        x = F.softmax(x,dim=0)
        return x

def make_layers(cfg):
    i = 0
    layers = []
    input_ch = 3
    for d in cfg:
        if d == 'R':
            layers.append(Residual(input_ch))
        else:
            i = i + 1
            s = 1 if i == 1 else 2
            layers.append(Conv_BN_LRelu(input_ch, d, 3, s))
            input_ch = d
    return nn.Sequential(*layers)

cfgs = {
    'DarkNet': [32, 64, 'R', 128, 'R', 'R', 256, 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 512, 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 1024, 'R', 'R', 'R', 'R'],
}
def darknet():
    model = Darknet(make_layers(cfgs['DarkNet']))
    return model

三、Tensorboard绘制网络结构图

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用pytorch-yolo时,为了使用模型进行目标检测,我们需要下载预训练的权重文件和相关的数据集。 首先,我们需要下载YOLOv3预训练权重文件。可以通过执行以下命令来下载: ``` wget https://pjreddie.com/media/files/yolov3.weights ``` 下载完成后,我们可以使用权重文件进行目标检测。但是,请记住,这个权重文件是基于Darknet架构训练的,而pytorch-yolo是基于PyTorch框架的。因此,我们需要将Darknet权重文件转换为PyTorch的权重文件格式。可以使用pytorch-yolo提供的`darknet2pytorch.py`脚本来进行转换: ``` python darknet2pytorch.py yolov3.cfg yolov3.weights yolov3.pt ``` 请确保将`yolov3.cfg`和`yolov3.weights`替换为下载的权重文件的路径。转换后,将生成一个`yolov3.pt`文件,我们可以使用这个文件进行目标检测。 除了预训练权重文件,我们还需要下载用于训练和测试的数据集。pytorch-yolo支持许多常见的目标检测数据集,如COCO、VOC等。可以通过执行以下命令来下载相应的数据集: COCO数据集: ``` sh data/scripts/COCO/download.sh ``` VOC数据集: ``` sh data/scripts/VOC/download.sh ``` 这些命令将自动下载并提取相应的数据集。 总结起来,为了使用pytorch-yolo进行目标检测,我们需要下载预训练权重文件和相关的数据集。通过执行相应的下载命令,我们可以获取所需的文件,并开始进行目标检测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值