In [3]:
def make_yolov3_model():
    input_image = Input(shape=(None, None, 3))
    # Layer 0 - 4
    x = _conv_block(input_image, [{'filter': 32, 'kernel': 3, 'stride': 1, 'bnorm': True,
        'leaky': True, 'layer_idx': 0},
                {'filter': 64, 'kernel': 3, 'stride': 2, 'bnorm': True, 'leaky': True,
                    'layer_idx': 1},
                {'filter': 32, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True,
                    'layer_idx': 2},
                {'filter': 64, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True,
                    'layer_idx': 3}])
    # Layer 5 - 8
    x = _conv_block(x, [{'filter': 128, 'kernel': 3, 'stride': 2, 'bnorm': True, 'leaky':
            True, 'layer_idx': 5},
                {'filter': 64, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True,
                    'layer_idx': 6},
                {'filter': 128, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True,
                    'layer_idx': 7}])
    # Layer 9 - 11
    x = _conv_block(x, [{'filter': 64, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky':
            True, 'layer_idx': 9},
                {'filter': 128, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True,
                    'layer_idx': 10}])
    # Layer 12 - 15
    x = _conv_block(x, [{'filter': 256, 'kernel': 3, 'stride': 2, 'bnorm': True, 'leaky':
            True, 'layer_idx': 12},
                {'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True,
                    'layer_idx': 13},
                {'filter': 256, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True,
                    'layer_idx': 14}])
    # Layer 16 - 36
    for i in range(7):
        x = _conv_block(x, [{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky':
            True, 'layer_idx': 16+i*3},
                {'filter': 256, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True,
                    'layer_idx': 17+i*3}])
    skip_36 = x
    # Layer 37 - 40
    x = _conv_block(x, [{'filter': 512, 'kernel': 3, 'stride': 2, 'bnorm': True, 'leaky':
            True, 'layer_idx': 37},
                {'filter': 256, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True,
                    'layer_idx': 38},
                {'filter': 512, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True,
                    'layer_idx': 39}])
    # Layer 41 - 61
    for i in range(7):
        x = _conv_block(x, [{'filter': 256, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky':
            True, 'layer_idx': 41+i*3},
                {'filter': 512, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True,
                    'layer_idx': 42+i*3}])
    skip_61 = x
    # Layer 62 - 65
    x = _conv_block(x, [{'filter': 1024, 'kernel': 3, 'stride': 2, 'bnorm': True, 'leaky':
        True, 'layer_idx': 62},
            {'filter': 512, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True,
                'layer_idx': 63},
            {'filter': 1024, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True,
                'layer_idx': 64}])
    # Layer 66 - 74
    for i in range(3):
        x = _conv_block(x, [{'filter': 512, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky':
            True, 'layer_idx': 66+i*3},
                {'filter': 1024, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True,
                    'layer_idx': 67+i*3}])
    # Layer 75 - 79
    x = _conv_block(x, [{'filter': 512, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky':
        True, 'layer_idx': 75},
            {'filter': 1024, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True,
                'layer_idx': 76},
            {'filter': 512, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True,
                'layer_idx': 77},
            {'filter': 1024, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True,
                'layer_idx': 78},
            {'filter': 512, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True,
                'layer_idx': 79}], skip=False)
    # Layer 80 - 82
    yolo_82 = _conv_block(x, [{'filter': 1024, 'kernel': 3, 'stride': 1, 'bnorm': True,
        'leaky': True, 'layer_idx': 80},
            {'filter': 255, 'kernel': 1, 'stride': 1, 'bnorm': False, 'leaky': False,
                'layer_idx': 81}], skip=False)
    # Layer 83 - 86
    x = _conv_block(x, [{'filter': 256, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky':
        True, 'layer_idx': 84}], skip=False)
    x = UpSampling2D(2)(x)
    x = concatenate([x, skip_61])
    # Layer 87 - 91
    x = _conv_block(x, [{'filter': 256, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky':
    True, 'layer_idx': 87},
        {'filter': 512, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True,
            'layer_idx': 88},
        {'filter': 256, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True,
            'layer_idx': 89},
        {'filter': 512, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True,
            'layer_idx': 90},
        {'filter': 256, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True,
            'layer_idx': 91}], skip=False)
    # Layer 92 - 94
    yolo_94 = _conv_block(x, [{'filter': 512, 'kernel': 3, 'stride': 1, 'bnorm': True,
        'leaky': True, 'layer_idx': 92},
            {'filter': 255, 'kernel': 1, 'stride': 1, 'bnorm': False, 'leaky': False,
                'layer_idx': 93}], skip=False)
    # Layer 95 - 98
    x = _conv_block(x, [{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky':
        True, 'layer_idx': 96}], skip=False)
    x = UpSampling2D(2)(x)
    x = concatenate([x, skip_36])
    # Layer 99 - 106
    yolo_106 = _conv_block(x, [{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True,
        'leaky': True, 'layer_idx': 99},
            {'filter': 256, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True,
                'layer_idx': 100},
            {'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True,
                'layer_idx': 101},
            {'filter': 256, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True,
                'layer_idx': 102},
            {'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True,
                'layer_idx': 103},
            {'filter': 256, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True,
                'layer_idx': 104},
            {'filter': 255, 'kernel': 1, 'stride': 1, 'bnorm': False, 'leaky': False,
                'layer_idx': 105}], skip=False)
    model = Model(input_image, [yolo_82, yolo_94, yolo_106])
    return model