YoloV3 Darknet53 残差网络Residual

残差网络Residual

  • 本文主要是记录在学习YoloV3时遇到的残差网络结构
  • 文本参考睿智的目标检测26——Pytorch搭建yolo3目标检测平台
  • 很久没有接触算法模型了。如果有错误,我想批评。

先总览一下Yolov3模型结构(主干网络为Darknet53,左侧虚线框内)

YoloV3 Darknet53 残差网络Residual

对应的onnx网络结构

  • 截取部分onnx网络结构说明残差网络结构,我直接训练得到的是pth的模型,转成onnx后可视化结果比较直观一些
  • 需要注意的是在下面图片中BN被融合到Conv
    YoloV3 Darknet53 残差网络Residual

对应残差结构代码

  • 基本残差码
#---------------------------------------------------------------------#
#   残差结构
#   利用一个1x1卷积下降通道数,然后利用一个3x3卷积提取特征并且上升通道数
#   最后接上一个残差边
#---------------------------------------------------------------------#
class BasicBlock(nn.Module):
    def __init__(self, inplanes, planes):
        super(BasicBlock, self).__init__()
        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
  • 配合下采样使用代码(构建R1、R2等)
    #---------------------------------------------------------------------#
    #   在每一个layer里面,首先利用一个步长为2的3x3卷积进行下采样
    #   然后进行残差结构的堆叠
    #---------------------------------------------------------------------#
    def _make_layer(self, planes, blocks):
        layers = []
        # 下采样,步长为2,卷积核大小为3
        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)))
        # 加入残差结构
        self.inplanes = planes[1]
        for i in range(0, blocks):
            layers.append(("residual_{}".format(i), BasicBlock(self.inplanes, planes)))
        return nn.Sequential(OrderedDict(layers))

版权声明:本文为博主damon93原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/damon93/article/details/123182030

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2022年3月1日 下午8:15
下一篇 2022年3月1日 下午8:39

相关推荐