Filecoin Nodepad Netty Jetbains全家桶 webpack optimization boost shiny safari EaselJS vue自定义组件 后台模板下载 基于bootstrap的框架 python入门 python集合操作 python的open函数 python中的map函数 python的文件操作 python字符串匹配 python基础代码 javaswitch语句 java中的数据类型 java文档 java语言入门 linux目录 linuxls命令 主板芯片组天梯图 dep php购物车 tableau下载 2700U 正当防卫4存档 r330不能识别墨盒 虚拟声卡驱动 狮子狗打野天赋 追评可以删除吗 vue响应式原理 ps二寸照片制作教程 优酷网打不开 上网监控系统
当前位置: 首页 > 学习教程  > 编程语言

YOLOV3详解

2020/10/16 18:26:06 文章标签:

YOLOV3 是集成了 SSD(多尺度预测), FCN(全卷机),FPN(特征金字塔),DenseNet(特征通道concat) 网络的大成之作! YOLOV3 的主干网络backbone 称为 DarkNet, 主要有DarkNet-21 , DarkNet-53, 区别在…

YOLOV3 是集成了 SSD(多尺度预测), FCN(全卷机),FPN(特征金字塔),DenseNet(特征通道concat) 网络的大成之作!

YOLOV3 的主干网络backbone 称为 DarkNet, 主要有DarkNet-21 , DarkNet-53, 区别在于每层的 ResidualBlock 个数不同.

yolo-v3 网络结构:

在这里插入图片描述

1、DarkNet-53 搭建:

darknet-53 由一个初始卷积层 + 5个Layer 层构成,进入layer层后进行下采样,大小减半,通道增倍。每个Layer 由若干个 ResidualBlock组成。

ResidualBlock 构建:

out = in + (1x1conv + 3x3conv)[ in ]

    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  # Residual Block
        return out
生成layer:

先进行下采样,然后多个residuablock 组合。例如 plane = [32, 64 ]表示整个layer输入通道=32 ,输出通道=64。在layer 中进行 blocks 次 ResidualBlock。

    def _make_layer(self, planes, blocks):
        layers = []
        #  downsample
        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)))
        #  blocks
        self.inplanes = planes[1]
        for i in range(0, blocks):
            layers.append(("residual_{}".format(i), BasicBlock(self.inplanes, planes)))
        return nn.Sequential(OrderedDict(layers))
layer 组合生成 DarkNet:
 def __init__(self, layers):
        super(DarkNet, self).__init__()
        self.inplanes = 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)
        self.layer1 = self._make_layer([32, 64], layers[0])
        self.layer2 = self._make_layer([64, 128], layers[1])
        self.layer3 = self._make_layer([128, 256], layers[2])
        self.layer4 = self._make_layer([256, 512], layers[3])
        self.layer5 = self._make_layer([512, 1024], layers[4])
        
        self.layers_out_filters = [64, 128, 256, 512, 1024]

    def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu1(x)
        x = self.layer1(x)
        x = self.layer2(x)
        out3 = self.layer3(x)
        out4 = self.layer4(out3)
        out5 = self.layer5(out4)

        return out3, out4, out5

DarkNet-53 网络输出3个不同尺寸的 featureMap

2、上采样特征融合输出:

本层特征经过 DBL(5层卷积)后分两个分支:
branch1:输出本层特征
branch2:上采样与次深层特征融合,生成此层融合特征。

  #  backbone
        x2, x1, x0 = self.backbone(x)
        #  yolo branch 0
        out0, out0_branch = _branch(self.embedding0, x0)
        #  yolo branch 1
        x1_in = self.embedding1_cbl(out0_branch)
        x1_in = self.embedding1_upsample(x1_in)
        x1_in = torch.cat([x1_in, x1], 1)
        out1, out1_branch = _branch(self.embedding1, x1_in)
        #  yolo branch 2
        x2_in = self.embedding2_cbl(out1_branch)
        x2_in = self.embedding2_upsample(x2_in)
        x2_in = torch.cat([x2_in, x2], 1)
        out2, out2_branch = _branch(self.embedding2, x2_in)
        return out0, out1, out2

输出3层预测结果 out0, out1, out2

大小分别为 13,26,52 通道数为 255 = 3 ×(5 + 80),即每个featuremap 上的点有3个预设anchor , 每个anchor 预测: 80类别 + 置信度 + 位置(x,y,h,w)


本文链接: http://www.dtmao.cc/news_show_300424.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?