def mobilenetv2_yolo_body(inputs, num_anchors, num_classes):
    #net, endpoint = inception_v2.inception_v2(inputs)
    mobilenet = MobileNetV2(input_tensor=inputs, weights='imagenet')

    # input: 416 x 416 x 3
    # conv_pw_13_relu :13 x 13 x 1024
    # conv_pw_11_relu :26 x 26 x 512
    # conv_pw_5_relu : 52 x 52 x 256

    f1 = mobilenet.get_layer('out_relu').output
    # f1 :13 x 13 x 1024
    x, y1 = make_last_layers(f1, 512, num_anchors * (num_classes + 5))

    x = compose(DarknetConv2D_BN_Leaky(256, (1, 1)), UpSampling2D(2))(x)

    f2 = mobilenet.get_layer('block_13_expand_relu').output
    # f2: 26 x 26 x 512
    x = Concatenate()([x, f2])

    x, y2 = make_last_layers(x, 256, num_anchors * (num_classes + 5))

    x = compose(DarknetConv2D_BN_Leaky(128, (1, 1)), UpSampling2D(2))(x)

    f3 = mobilenet.get_layer('block_6_expand_relu').output
    # f3 : 52 x 52 x 256
    x = Concatenate()([x, f3])
    x, y3 = make_last_layers(x, 128, num_anchors * (num_classes + 5))

    return Model(inputs=inputs, outputs=[y1, y2, y3])
def yolo_body(inputs, num_anchors, num_classes):
    #net, endpoint = inception_v2.inception_v2(inputs)
    darknet = Model(inputs, darknet_ref_body(inputs))

    # input: 416 x 416 x 3
    # leaky_re_lu_7 :13 x 13 x 1024
    # leaky_re_lu_5 :26 x 26 x 512
    # leaky_re_lu_4 : 52 x 52 x 256

    f1 = darknet.get_layer('leaky_re_lu_7').output
    # f1 :13 x 13 x 1024
    x, y1 = make_last_layers(f1, 256, num_anchors * (num_classes + 5))

    x = compose(DarknetConv2D_BN_Leaky(128, (1, 1)), UpSampling2D(2))(x)

    f2 = darknet.get_layer('leaky_re_lu_5').output
    # f2: 26 x 26 x 512
    x = Concatenate()([x, f2])

    x, y2 = make_last_layers(x, 128, num_anchors * (num_classes + 5))

    x = compose(DarknetConv2D_BN_Leaky(64, (1, 1)), UpSampling2D(2))(x)

    f3 = darknet.get_layer('leaky_re_lu_4').output
    # f3 : 52 x 52 x 256
    x = Concatenate()([x, f3])
    x, y3 = make_last_layers(x, 64, num_anchors * (num_classes + 5))

    return Model(inputs=inputs, outputs=[y1, y2, y3])
def yolo_body(inputs, num_anchors, num_classes):
    #net, endpoint = inception_v2.inception_v2(inputs)
    squeezenet = squeezenet_body(input_tensor=inputs)

    # input: 416 x 416 x 3
    # contatenate_10 :12 x 12 x 640
    # contatenate_6 :25 x 25 x 384
    # contatenate_4 : 51 x 51 x 256

    f1 = squeezenet.get_layer('concatenate_10').output
    # f1 :13 x 13 x 1024
    x, y1 = make_last_layers(f1, 512, num_anchors * (num_classes + 5))

    x = compose(DarknetConv2D_BN_Leaky(256, (1, 1)), UpSampling2D(2))(x)

    f2 = squeezenet.get_layer('concatenate_6').output
    # f2: 26 x 26 x 512
    x = Concatenate()([x, f2])

    x, y2 = make_last_layers(x, 256, num_anchors * (num_classes + 5))

    x = compose(DarknetConv2D_BN_Leaky(128, (1, 1)), UpSampling2D(2))(x)

    f3 = squeezenet.get_layer('concatenate_4').output
    # f3 : 52 x 52 x 256
    x = Concatenate()([x, f3])
    x, y3 = make_last_layers(x, 128, num_anchors * (num_classes + 5))

    return Model(inputs=inputs, outputs=[y1, y2, y3])
def darknet_ref_body(x):  #tiny yolo with three output
    '''Darknent body having 52 Convolution2D layers'''
    x = DarknetConv2D_BN_Leaky(16, (3, 3))(x)
    x = darknet_resblock_body(x, 32)
    x = darknet_resblock_body(x, 64)
    x = darknet_resblock_body(x, 128)
    x = darknet_resblock_body(x, 256)
    x = darknet_resblock_body(x, 512)
    x = MaxPooling2D(pool_size=(2, 2), strides=(1, 1), padding='same')(x)
    x = DarknetConv2D_BN_Leaky(1024, (3, 3))(x)
    return x
def darknet_resblock_body(x, num_filters):
    '''A series of resblocks starting with a downsampling Convolution2D'''
    # Darknet uses left and top padding instead of 'same' mode
    x = MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='same')(x)
    x = DarknetConv2D_BN_Leaky(num_filters, (3, 3))(x)
    return x