YOLO3算法中特征提取网络部分(darknet53)代码讲解

特征提取网络部分(darknet53)示意图:

YOLO3算法中特征提取网络部分(darknet53)代码讲解_第1张图片

  1. Conv2D是什么?一种特殊卷积,主要是有一个L2正则化
#   单次卷积    #
#--------------------------------------------------#
@wraps(Conv2D)
def DarknetConv2D(*args, **kwargs):
    darknet_conv_kwargs = {'kernel_regularizer': l2(5e-4)}                 #L2正则化帮助提高性能#
    darknet_conv_kwargs['padding'] = 'valid' if kwargs.get('strides')==(2,2) else 'same'
    darknet_conv_kwargs.update(kwargs)
    return Conv2D(*args, **darknet_conv_kwargs)

#---------------------------------------------------#
#   卷积块
#   DarknetConv2D + BatchNormalization(标准化) + LeakyReLU(激活函数)
#---------------------------------------------------#
def DarknetConv2D_BN_Leaky(*args, **kwargs):
    no_bias_kwargs = {'use_bias': False}
    no_bias_kwargs.update(kwargs)
    return compose( 
        DarknetConv2D(*args, **no_bias_kwargs),
        BatchNormalization(),
        LeakyReLU(alpha=0.1))
#---------------------------------------------------#
#   卷积块
#   DarknetConv2D + BatchNormalization (标准化)+ LeakyReLU(激活函数)
#---------------------------------------------------#
def resblock_body(x, num_filters, num_blocks):                                          #残差结构
    x = ZeroPadding2D(((1,0),(1,0)))(x)                                                 
    x = DarknetConv2D_BN_Leaky(num_filters, (3,3), strides=(2,2))(x)                    #步长是2,所以长宽变成原来的二分之一
    for i in range(num_blocks):                                                         #重复次数
        y = DarknetConv2D_BN_Leaky(num_filters//2, (1,1))(x)                            #主干部分第一次1*1卷积,把通道数压缩二分之一
        y = DarknetConv2D_BN_Leaky(num_filters, (3,3))(y)                               #主干部分第二次3*3卷积,把通道数扩张回去
        x = Add()([x,y])                                                                #把残差线和主体相连,进行次数就是重复次数次
    return x

#---------------------------------------------------#

#   darknet53 的主体部分
#---------------------------------------------------#
def darknet_body(x):
    #416,416,3
    x = DarknetConv2D_BN_Leaky(32, (3,3))(x)           #长宽不变,通道数变成32,对应图示Step1#
    #208, 208, 64
    x = resblock_body(x, 64, 1)                         #(输入特征层,输出通道数,重复次数)     具体的r , b 解释看上面定义部分
    #104 ,104, 128
    x = resblock_body(x, 128, 2)
    #52, 52, 256
    x = resblock_body(x, 256, 8)
    feat1 = x
    #26, 26, 512
    x = resblock_body(x, 512, 8)
    feat2 = x
    #13 , 13, 1024
    x = resblock_body(x, 1024, 4)
    feat3 = x
    return feat1,feat2,feat3
#---------------------------------------------------#
  1. Residual Block :残差卷积块,和普通卷积相比,会多出来一条残差线,使前面一层的特征层可以不经过卷积直接映射到下一层特征层上面去,作用是有助于训练和特征提取。最后三个特征层可以保留进入YOLOV3特征处理网络,最终变成预测结果

你可能感兴趣的:(深度学习)