keras实现yoloV3网络结构

目录

  • yoloV3网络
    • 1.DBL
    • 2. resblock_body
    • 3. Darknent-53
    • 4. y1、y2和y3


yoloV3网络

下面为yoloV3网络图:
keras实现yoloV3网络结构_第1张图片

为了方便理解,放了来自木盏的yoloV3的网络结构图
keras实现yoloV3网络结构_第2张图片
DBL: 即代码中的Darknetconv2d_BN_Leaky,是yolo_v3的基本组件。就是卷积+BN+Leaky relu。
resn:n代表数字,有res1,res2, … ,res8等等,表示这个res_block里含有多少个res_unit。

1.DBL

实现DBL:
keras实现yoloV3网络结构_第3张图片

@wraps(Conv2D)
# 设置DBL中卷积核参数
def DarknetConv2D(*args, **kwargs):
    """Wrapper to set Darknet parameters for Convolution2D."""
    darknet_conv_kwargs = {'kernel_regularizer': l2(5e-4)}
    darknet_conv_kwargs['padding'] = 'valid' if kwargs.get('strides')==(2,2) else 'same'
    darknet_conv_kwargs.update(kwargs)
    return Conv2D(*args, **darknet_conv_kwargs)
# 定义DBL函数
def DarknetConv2D_BN_Leaky(*args, **kwargs):
    """Darknet Convolution2D followed by BatchNormalization and LeakyReLU."""
    no_bias_kwargs = {'use_bias': False}
    no_bias_kwargs.update(kwargs)
    return compose(
        DarknetConv2D(*args, **no_bias_kwargs),
        BatchNormalization(),
        LeakyReLU(alpha=0.1))

2. resblock_body

实现resblock_body:
keras实现yoloV3网络结构_第4张图片
resblock_body中包含Res_unit:
keras实现yoloV3网络结构_第5张图片

def resblock_body(x, num_filters, num_blocks):
    '''A series of resblocks starting with a downsampling Convolution2D'''
    # Darknet uses left and top padding instead of 'same' mode
    x = ZeroPadding2D(((1,0),(1,0)))(x)
    x = DarknetConv2D_BN_Leaky(num_filters, (3,3), strides=(2,2))(x)
    # res_unit
    for i in range(num_blocks):
        y = compose(
                DarknetConv2D_BN_Leaky(num_filters//2, (1,1)),
                DarknetConv2D_BN_Leaky(num_filters, (3,3)))(x)
        x = Add()([x,y])
    return x

3. Darknent-53

实现Darknent-53(不含全连接层):
在这里插入图片描述
下图为yoloV3论文中的Darknent-53网络图(含全连接层),包含了每一层的详细的通道数,图中的:
                在这里插入图片描述
相当于resblock_body。

keras实现yoloV3网络结构_第6张图片

def darknet_body(x):
    '''Darknent body having 53 Convolution2D layers'''
    x = DarknetConv2D_BN_Leaky(32, (3,3))(x)
    # 3 Convolution2D layers
    x = resblock_body(x, 64, 1)
    # 5 Convolution2D layers
    x = resblock_body(x, 128, 2)
    # 17 Convolution2D layers
    x = resblock_body(x, 256, 8)
    # 17 Convolution2D layers
    x = resblock_body(x, 512, 8)
    # 9 Convolution2D layers
    x = resblock_body(x, 1024, 4)
    return x

4. y1、y2和y3

keras实现yoloV3网络结构_第7张图片

def make_last_layers(x, num_filters, out_filters):
    '''6 Conv2D_BN_Leaky layers followed by a Conv2D_linear layer'''
    # 5 DBL Layers
    x = compose(
            DarknetConv2D_BN_Leaky(num_filters, (1,1)),
            DarknetConv2D_BN_Leaky(num_filters*2, (3,3)),
            DarknetConv2D_BN_Leaky(num_filters, (1,1)),
            DarknetConv2D_BN_Leaky(num_filters*2, (3,3)),
            DarknetConv2D_BN_Leaky(num_filters, (1,1)))(x)
    y = compose(
            DarknetConv2D_BN_Leaky(num_filters*2, (3,3)),
            DarknetConv2D(out_filters, (1,1)))(x)
    return x, y
def yolo_body(inputs, num_anchors, num_classes):
    """Create YOLO_V3 model CNN body in Keras."""
    # darknent-53 结构
    darknet = Model(inputs, darknet_body(inputs))
    # 求 y1
    x, y1 = make_last_layers(darknet.output, 512, num_anchors*(num_classes+5))
    # 求  y2
    x = compose(
            DarknetConv2D_BN_Leaky(256, (1,1)),
            UpSampling2D(2))(x)
    x = Concatenate()([x,darknet.layers[152].output])
    x, y2 = make_last_layers(x, 256, num_anchors*(num_classes+5))
    # 求 y3
    x = compose(
            DarknetConv2D_BN_Leaky(128, (1,1)),
            UpSampling2D(2))(x)
    x = Concatenate()([x,darknet.layers[92].output])
    x, y3 = make_last_layers(x, 128, num_anchors*(num_classes+5))

    return Model(inputs, [y1,y2,y3])

你可能感兴趣的:(网络实现)