예제 #1
0
    def __build_nework(self, input_data):
        """
        It is better look at this function with the Yolo_v3_Structure diagram made by Levio
        One link is here: https://github.com/wizyoung/YOLOv3_TensorFlow
        """
        
        # by YZ, these are the three feature extractions from darknet53, with difference dimension reductions (by 8, 16, 32)
        route_1, route_2, input_data = backbone.darknet53(input_data, self.trainable)
        
        # input_data is -1*13*13*1024
        input_data = common.convolutional(input_data, (1, 1, 1024,  512), self.trainable, 'conv52')
        input_data = common.convolutional(input_data, (3, 3,  512, 1024), self.trainable, 'conv53')
        input_data = common.convolutional(input_data, (1, 1, 1024,  512), self.trainable, 'conv54')
        input_data = common.convolutional(input_data, (3, 3,  512, 1024), self.trainable, 'conv55')
        input_data = common.convolutional(input_data, (1, 1, 1024,  512), self.trainable, 'conv56')

        conv_lobj_branch = common.convolutional(input_data, (3, 3, 512, 1024), self.trainable, name='conv_lobj_branch')
        conv_lbbox = common.convolutional(conv_lobj_branch, (1, 1, 1024, 3*(self.num_class + 5)),
                                          trainable=self.trainable, name='conv_lbbox', activate=False, bn=False)

        input_data = common.convolutional(input_data, (1, 1,  512,  256), self.trainable, 'conv57')
        
        # upsampling input data (1/32) to match route_2 (1/16), -1*26*16*512
        input_data = common.upsample(input_data, name='upsample0', method=self.upsample_method)

        with tf.variable_scope('route_1'):
            # route_2 is -1*26*26*256, so input_data is -1*26*26*768
            input_data = tf.concat([input_data, route_2], axis=-1)

        input_data = common.convolutional(input_data, (1, 1, 768, 256), self.trainable, 'conv58')
        input_data = common.convolutional(input_data, (3, 3, 256, 512), self.trainable, 'conv59')
        input_data = common.convolutional(input_data, (1, 1, 512, 256), self.trainable, 'conv60')
        input_data = common.convolutional(input_data, (3, 3, 256, 512), self.trainable, 'conv61')
        input_data = common.convolutional(input_data, (1, 1, 512, 256), self.trainable, 'conv62')

        conv_mobj_branch = common.convolutional(input_data, (3, 3, 256, 512),  self.trainable, name='conv_mobj_branch' )
        conv_mbbox = common.convolutional(conv_mobj_branch, (1, 1, 512, 3*(self.num_class + 5)),
                                          trainable=self.trainable, name='conv_mbbox', activate=False, bn=False)

        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.trainable, 'conv63')
        input_data = common.upsample(input_data, name='upsample1', method=self.upsample_method)

        with tf.variable_scope('route_2'):
            input_data = tf.concat([input_data, route_1], axis=-1)

        input_data = common.convolutional(input_data, (1, 1, 384, 128), self.trainable, 'conv64')
        input_data = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, 'conv65')
        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.trainable, 'conv66')
        input_data = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, 'conv67')
        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.trainable, 'conv68')

        conv_sobj_branch = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, name='conv_sobj_branch')
        conv_sbbox = common.convolutional(conv_sobj_branch, (1, 1, 256, 3*(self.num_class + 5)),
                                          trainable=self.trainable, name='conv_sbbox', activate=False, bn=False)
        
        # dimensions are: -1*13*13*255, -1*26*26*255, -1*52*52*255
        return conv_lbbox, conv_mbbox, conv_sbbox
예제 #2
0
    def __build_nework(self, input_layer, training):

        route_1, route_2, conv = backbone.darknet53(input_layer, training)

        conv = common.convolutional(conv, (1, 1, 1024, 512), training)
        conv = common.convolutional(conv, (3, 3, 512, 1024), training)
        conv = common.convolutional(conv, (1, 1, 1024, 512), training)
        conv = common.convolutional(conv, (3, 3, 512, 1024), training)
        conv = common.convolutional(conv, (1, 1, 1024, 512), training)

        conv_lobj_branch = common.convolutional(conv, (3, 3, 512, 1024),
                                                training)
        conv_lbbox = common.convolutional(conv_lobj_branch,
                                          (1, 1, 1024, 3 * (80 + 5)),
                                          training,
                                          activate=False,
                                          bn=False)

        conv = common.convolutional(conv, (1, 1, 512, 256), training)
        conv = common.upsample(conv)

        conv = tf.concat([conv, route_2], axis=-1)

        conv = common.convolutional(conv, (1, 1, 768, 256), training)
        conv = common.convolutional(conv, (3, 3, 256, 512), training)
        conv = common.convolutional(conv, (1, 1, 512, 256), training)
        conv = common.convolutional(conv, (3, 3, 256, 512), training)
        conv = common.convolutional(conv, (1, 1, 512, 256), training)

        conv_mobj_branch = common.convolutional(conv, (3, 3, 256, 512),
                                                training)
        conv_mbbox = common.convolutional(conv_mobj_branch,
                                          (1, 1, 512, 3 * (80 + 5)),
                                          training,
                                          activate=False,
                                          bn=False)

        conv = common.convolutional(conv, (1, 1, 256, 128), training)
        conv = common.upsample(conv)

        conv = tf.concat([conv, route_1], axis=-1)

        conv = common.convolutional(conv, (1, 1, 384, 128), training)
        conv = common.convolutional(conv, (3, 3, 128, 256), training)
        conv = common.convolutional(conv, (1, 1, 256, 128), training)
        conv = common.convolutional(conv, (3, 3, 128, 256), training)
        conv = common.convolutional(conv, (1, 1, 256, 128), training)

        conv_sobj_branch = common.convolutional(conv, (3, 3, 128, 256),
                                                training)
        conv_sbbox = common.convolutional(conv_sobj_branch,
                                          (1, 1, 256, 3 * (80 + 5)),
                                          training,
                                          activate=False,
                                          bn=False)

        return conv_lbbox, conv_mbbox, conv_sbbox
예제 #3
0
def YOLOv3(for_annother_use=False):
    input_layer = tf.keras.layers.Input(shape=[416,416,3])
    route_1, route_2, conv = backbone.darknet53(input_layer)

    conv = common.convolutional(conv, (1, 1, 1024, 512))
    sconv1 = conv = common.convolutional(conv, (3, 3, 512, 1024))
    conv = common.convolutional(conv, (1, 1, 1024, 512))
    sconv2 = conv = common.convolutional(conv, (3, 3, 512, 1024))
    conv = common.convolutional(conv, (1, 1, 1024, 512))

    sconv3 = conv_lobj_branch = common.convolutional(conv, (3, 3, 512, 1024))
    conv_lbbox = common.convolutional(conv_lobj_branch, (1, 1, 1024, 3 * (NUM_CLASS + 5)), activate=False, bn=False)

    conv = common.convolutional(conv, (1, 1, 512, 256))
    conv = common.upsample(conv)

    conv = tf.concat([conv, route_2], axis=-1)

    conv = common.convolutional(conv, (1, 1, 768, 256))
    mconv1 = conv = common.convolutional(conv, (3, 3, 256, 512))
    conv = common.convolutional(conv, (1, 1, 512, 256))
    mconv2 = conv = common.convolutional(conv, (3, 3, 256, 512))
    conv = common.convolutional(conv, (1, 1, 512, 256))

    mconv3 = conv_mobj_branch = common.convolutional(conv, (3, 3, 256, 512))
    conv_mbbox = common.convolutional(conv_mobj_branch, (1, 1, 512, 3 * (NUM_CLASS + 5)), activate=False, bn=False)

    conv = common.convolutional(conv, (1, 1, 256, 128))
    conv = common.upsample(conv)

    conv = tf.concat([conv, route_1], axis=-1)

    conv = common.convolutional(conv, (1, 1, 384, 128))
    lconv1 = conv = common.convolutional(conv, (3, 3, 128, 256))
    conv = common.convolutional(conv, (1, 1, 256, 128))
    lconv2 = conv = common.convolutional(conv, (3, 3, 128, 256))
    conv = common.convolutional(conv, (1, 1, 256, 128))

    lconv3 = conv_sobj_branch = common.convolutional(conv, (3, 3, 128, 256))
    conv_sbbox = common.convolutional(conv_sobj_branch, (1, 1, 256, 3 * (NUM_CLASS + 5)), activate=False, bn=False)

    if for_annother_use:
        convs_sbbox = tf.concat([lconv1, lconv2, lconv3], axis=-1, name="lfeature")
        convs_mbbox = tf.concat([mconv1, mconv2, mconv3], axis=-1, name="mfeature")
        convs_lbbox = tf.concat([sconv1, sconv2, sconv3], axis=-1, name="sfeature")
        yolo = Model(input_layer,[conv_sbbox, conv_mbbox, conv_lbbox, convs_sbbox,convs_mbbox,convs_lbbox])
    #                              52,26,13                         52,26,13
        yolo.load_weights(filepath=tf.keras.utils.get_file('yolo3.h5',''))
        yolo.trainable = False
    else:
        # classic YOLOV3 model trained for coco datasets
        yolo = Model(input_layer, [conv_sbbox, conv_mbbox, conv_lbbox])
        yolo.load_weights(filepath=tf.keras.utils.get_file('yolo3.h5',''))
        yolo.trainable =False
    return yolo
    def __build_nework(self, input_data):


        route_1, route_2, input_data = backbone.darknet53(input_data, self.trainable)
        
        # input_data is -1*13*13*1024
        input_data = common.convolutional(input_data, (1, 1, 1024,  512), self.trainable, 'conv52')
        input_data = common.convolutional(input_data, (3, 3,  512, 1024), self.trainable, 'conv53')
        input_data = common.convolutional(input_data, (1, 1, 1024,  512), self.trainable, 'conv54')
        input_data = common.convolutional(input_data, (3, 3,  512, 1024), self.trainable, 'conv55')
        input_data = common.convolutional(input_data, (1, 1, 1024,  512), self.trainable, 'conv56')

        conv_lobj_branch = common.convolutional(input_data, (3, 3, 512, 1024), self.trainable, name='conv_lobj_branch')
        conv_lbbox = common.convolutional(conv_lobj_branch, (1, 1, 1024, 3*(self.num_class + 5)),
                                          trainable=self.trainable, name='conv_lbbox', activate=False, bn=False)

        input_data = common.convolutional(input_data, (1, 1,  512,  256), self.trainable, 'conv57')
        
        # upsampling input data (1/32) to match route_2 (1/16), -1*26*16*512
        input_data = common.upsample(input_data, name='upsample0', method=self.upsample_method)

        with tf.variable_scope('route_1'):
            # route_2 is -1*26*26*256, so input_data is -1*26*26*768
            input_data = tf.concat([input_data, route_2], axis=-1)

        input_data = common.convolutional(input_data, (1, 1, 768, 256), self.trainable, 'conv58')
        input_data = common.convolutional(input_data, (3, 3, 256, 512), self.trainable, 'conv59')
        input_data = common.convolutional(input_data, (1, 1, 512, 256), self.trainable, 'conv60')
        input_data = common.convolutional(input_data, (3, 3, 256, 512), self.trainable, 'conv61')
        input_data = common.convolutional(input_data, (1, 1, 512, 256), self.trainable, 'conv62')

        conv_mobj_branch = common.convolutional(input_data, (3, 3, 256, 512),  self.trainable, name='conv_mobj_branch' )
        conv_mbbox = common.convolutional(conv_mobj_branch, (1, 1, 512, 3*(self.num_class + 5)),
                                          trainable=self.trainable, name='conv_mbbox', activate=False, bn=False)

        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.trainable, 'conv63')
        input_data = common.upsample(input_data, name='upsample1', method=self.upsample_method)

        with tf.variable_scope('route_2'):
            input_data = tf.concat([input_data, route_1], axis=-1)

        input_data = common.convolutional(input_data, (1, 1, 384, 128), self.trainable, 'conv64')
        input_data = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, 'conv65')
        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.trainable, 'conv66')
        input_data = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, 'conv67')
        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.trainable, 'conv68')

        conv_sobj_branch = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, name='conv_sobj_branch')
        conv_sbbox = common.convolutional(conv_sobj_branch, (1, 1, 256, 3*(self.num_class + 5)),
                                          trainable=self.trainable, name='conv_sbbox', activate=False, bn=False)
        
        # dimensions are: -1*13*13*255, -1*26*26*255, -1*52*52*255
        return conv_lbbox, conv_mbbox, conv_sbbox
예제 #5
0
def YOLOv3(input_layer):
    route_1, route_2, conv = backbone.darknet53(input_layer)
    original_conv = conv

    conv = common.convolutional(conv, (1, 1, 1024, 512))
    conv = common.convolutional(conv, (3, 3, 512, 1024))
    conv = common.convolutional(conv, (1, 1, 1024, 512))
    conv = common.convolutional(conv, (3, 3, 512, 1024))
    conv = common.convolutional(conv, (1, 1, 1024, 512))

    conv_lobj_branch = common.convolutional(conv, (3, 3, 512, 1024))
    conv_lbbox = common.convolutional(conv_lobj_branch,
                                      (1, 1, 1024, 3 * (NUM_CLASS + 5)),
                                      activate=False,
                                      bn=False)

    conv = common.convolutional(conv, (1, 1, 512, 256))
    conv = common.upsample(conv)

    conv = tf.concat([conv, route_2], axis=-1)

    conv = common.convolutional(conv, (1, 1, 768, 256))
    conv = common.convolutional(conv, (3, 3, 256, 512))
    conv = common.convolutional(conv, (1, 1, 512, 256))
    conv = common.convolutional(conv, (3, 3, 256, 512))
    conv = common.convolutional(conv, (1, 1, 512, 256))

    conv_mobj_branch = common.convolutional(conv, (3, 3, 256, 512))
    conv_mbbox = common.convolutional(conv_mobj_branch,
                                      (1, 1, 512, 3 * (NUM_CLASS + 5)),
                                      activate=False,
                                      bn=False)

    conv = common.convolutional(conv, (1, 1, 256, 128))
    conv = common.upsample(conv)

    conv = tf.concat([conv, route_1], axis=-1)

    conv = common.convolutional(conv, (1, 1, 384, 128))
    conv = common.convolutional(conv, (3, 3, 128, 256))
    conv = common.convolutional(conv, (1, 1, 256, 128))
    conv = common.convolutional(conv, (3, 3, 128, 256))
    conv = common.convolutional(conv, (1, 1, 256, 128))

    conv_sobj_branch = common.convolutional(conv, (3, 3, 128, 256))
    conv_sbbox = common.convolutional(conv_sobj_branch,
                                      (1, 1, 256, 3 * (NUM_CLASS + 5)),
                                      activate=False,
                                      bn=False)

    return [conv_sbbox, conv_mbbox,
            conv_lbbox], (route_1, route_2, original_conv)
예제 #6
0
def YOLOv3(input_layer):
    """
    build the whole network of YOLOv3
    :param input_layer: [batch, 416, 416, 3]
    :return: 3 scale predictions [[b, 52, 52, anchors*(5+classes)], [b, 26, 26, anchors*(5+classes)], [b, 13, 13, anchors*(5+classes)]]
    """
    route_1, route_2, conv = backbone.darknet53(
        input_layer
    )  # call darknet to get the basic network, [52,52,256], [26,26,512], [13,13,1024]
    """large scale output [batch, 13, 13, 3*(5+c)]"""
    conv = common.convolutional(conv, (1, 1, 1024, 512), conv_trainable=False)
    conv = common.convolutional(conv, (3, 3, 512, 1024), conv_trainable=False)
    conv = common.convolutional(conv, (1, 1, 1024, 512), conv_trainable=False)
    conv = common.convolutional(conv, (3, 3, 512, 1024))
    conv = common.convolutional(conv, (1, 1, 1024, 512))
    conv_lobj_branch = common.convolutional(conv, (3, 3, 512, 1024))
    conv_lbbox = common.convolutional(conv_lobj_branch,
                                      (1, 1, 1024, 3 * (NUM_CLASS + 5)),
                                      activate=False,
                                      bn=False)
    """the medium scale output, [batch, 26, 26, 3*(NUM_CLASS+5)]"""
    conv = common.convolutional(conv, (1, 1, 512, 256), conv_trainable=False)
    conv = common.upsample(conv)
    conv = tf.concat([conv, route_2], axis=-1)  # concat in channel dimension

    conv = common.convolutional(conv, (1, 1, 768, 256), conv_trainable=False)
    conv = common.convolutional(conv, (3, 3, 256, 512), conv_trainable=False)
    conv = common.convolutional(conv, (1, 1, 512, 256), conv_trainable=False)
    conv = common.convolutional(conv, (3, 3, 256, 512))
    conv = common.convolutional(conv, (1, 1, 512, 256))
    conv_mobj_branch = common.convolutional(conv, (3, 3, 256, 512))
    conv_mbbox = common.convolutional(conv_mobj_branch,
                                      (1, 1, 512, 3 * (NUM_CLASS + 5)),
                                      activate=False,
                                      bn=False)
    """the small scale output, [batch, 52, 52, 3*(NUM_CLASS+5)]"""
    conv = common.convolutional(conv, (1, 1, 256, 128), conv_trainable=False)
    conv = common.upsample(conv)
    conv = tf.concat([conv, route_1], axis=-1)  # concat in channel dimension

    conv = common.convolutional(conv, (1, 1, 384, 128), conv_trainable=False)
    conv = common.convolutional(conv, (3, 3, 128, 256), conv_trainable=False)
    conv = common.convolutional(conv, (1, 1, 256, 128), conv_trainable=False)
    conv = common.convolutional(conv, (3, 3, 128, 256))
    conv = common.convolutional(conv, (1, 1, 256, 128))
    conv_sobj_branch = common.convolutional(conv, (3, 3, 128, 256))
    conv_sbbox = common.convolutional(conv_sobj_branch,
                                      (1, 1, 256, 3 * (NUM_CLASS + 5)),
                                      activate=False,
                                      bn=False)

    return [conv_sbbox, conv_mbbox, conv_lbbox]
예제 #7
0
    def __build_nework(self, input_data):

        route_1, route_2, input_data = backbone.darknet53(input_data)

        input_data = common.convolutional(input_data, (1, 1, 1024, 512))
        input_data = common.convolutional(input_data, (3, 3, 512, 1024))
        input_data = common.convolutional(input_data, (1, 1, 1024, 512))
        input_data = common.convolutional(input_data, (3, 3, 512, 1024))
        input_data = common.convolutional(input_data, (1, 1, 1024, 512))

        conv_lobj_branch = common.convolutional(input_data, (3, 3, 512, 1024))
        conv_lbbox = common.convolutional(conv_lobj_branch,
                                          (1, 1, 1024, 3 * (80 + 5)),
                                          activate=False,
                                          bn=False)

        input_data = common.convolutional(input_data, (1, 1, 512, 256))
        input_data = common.upsample(input_data)

        input_data = tf.concat([input_data, route_2], axis=-1)

        input_data = common.convolutional(input_data, (1, 1, 768, 256))
        input_data = common.convolutional(input_data, (3, 3, 256, 512))
        input_data = common.convolutional(input_data, (1, 1, 512, 256))
        input_data = common.convolutional(input_data, (3, 3, 256, 512))
        input_data = common.convolutional(input_data, (1, 1, 512, 256))

        conv_mobj_branch = common.convolutional(input_data, (3, 3, 256, 512))
        conv_mbbox = common.convolutional(conv_mobj_branch,
                                          (1, 1, 512, 3 * (80 + 5)),
                                          activate=False,
                                          bn=False)

        input_data = common.convolutional(input_data, (1, 1, 256, 128))
        input_data = common.upsample(input_data)

        input_data = tf.concat([input_data, route_1], axis=-1)

        input_data = common.convolutional(input_data, (1, 1, 384, 128))
        input_data = common.convolutional(input_data, (3, 3, 128, 256))
        input_data = common.convolutional(input_data, (1, 1, 256, 128))
        input_data = common.convolutional(input_data, (3, 3, 128, 256))
        input_data = common.convolutional(input_data, (1, 1, 256, 128))

        conv_sobj_branch = common.convolutional(input_data, (3, 3, 128, 256))
        conv_sbbox = common.convolutional(conv_sobj_branch,
                                          (1, 1, 256, 3 * (80 + 5)),
                                          activate=False,
                                          bn=False)

        return conv_lbbox, conv_mbbox, conv_sbbox
예제 #8
0
    def __build_nework(self, input_data):

        route_1, route_2, input_data = backbone.darknet53(input_data, self.trainable)

        input_data = common.convolutional(input_data, (1, 1, 1024,  512), self.trainable, 'conv52')
        input_data = common.convolutional(input_data, (3, 3,  512, 1024), self.trainable, 'conv53')
        input_data = common.convolutional(input_data, (1, 1, 1024,  512), self.trainable, 'conv54')
        input_data = common.convolutional(input_data, (3, 3,  512, 1024), self.trainable, 'conv55')
        input_data = common.convolutional(input_data, (1, 1, 1024,  512), self.trainable, 'conv56')

        conv_lobj_branch = common.convolutional(input_data, (3, 3, 512, 1024), self.trainable, name='conv_lobj_branch')
        conv_lbbox = common.convolutional(conv_lobj_branch, (1, 1, 1024, 3*(self.num_class + 5)),
                                          trainable=self.trainable, name='conv_lbbox', activate=False, bn=False)

        input_data = common.convolutional(input_data, (1, 1,  512,  256), self.trainable, 'conv57')
        input_data = common.upsample(input_data, name='upsample0', method=self.upsample_method)

        with tf.variable_scope('route_1'):
            input_data = tf.concat([input_data, route_2], axis=-1)

        input_data = common.convolutional(input_data, (1, 1, 768, 256), self.trainable, 'conv58')
        input_data = common.convolutional(input_data, (3, 3, 256, 512), self.trainable, 'conv59')
        input_data = common.convolutional(input_data, (1, 1, 512, 256), self.trainable, 'conv60')
        input_data = common.convolutional(input_data, (3, 3, 256, 512), self.trainable, 'conv61')
        input_data = common.convolutional(input_data, (1, 1, 512, 256), self.trainable, 'conv62')

        conv_mobj_branch = common.convolutional(input_data, (3, 3, 256, 512),  self.trainable, name='conv_mobj_branch' )
        conv_mbbox = common.convolutional(conv_mobj_branch, (1, 1, 512, 3*(self.num_class + 5)),
                                          trainable=self.trainable, name='conv_mbbox', activate=False, bn=False)

        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.trainable, 'conv63')
        input_data = common.upsample(input_data, name='upsample1', method=self.upsample_method)

        with tf.variable_scope('route_2'):
            input_data = tf.concat([input_data, route_1], axis=-1)

        input_data = common.convolutional(input_data, (1, 1, 384, 128), self.trainable, 'conv64')
        input_data = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, 'conv65')
        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.trainable, 'conv66')
        input_data = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, 'conv67')
        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.trainable, 'conv68')

        conv_sobj_branch = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, name='conv_sobj_branch')
        conv_sbbox = common.convolutional(conv_sobj_branch, (1, 1, 256, 3*(self.num_class + 5)),
                                          trainable=self.trainable, name='conv_sbbox', activate=False, bn=False)

        return conv_lbbox, conv_mbbox, conv_sbbox
예제 #9
0
    def structure_network(self, input_data):
        # 调取 darknet53 网络,获取 3 个尺度的返回值
        route_1, route_2, input_data = backbone.darknet53(input_data, self.training_flag)

        # conv set 操作 conv: 1 x 1 -> 3 x 3 -> 1 x 1 -> 3 x 3 -> 1 x 1
        input_data = common.convolutional(input_data, (1, 1, 1024, 512), self.training_flag, 'conv52')
        input_data = common.convolutional(input_data, (3, 3, 512, 1024), self.training_flag, 'conv53')
        input_data = common.convolutional(input_data, (1, 1, 1024, 512), self.training_flag, 'conv54')
        input_data = common.convolutional(input_data, (3, 3, 512, 1024), self.training_flag, 'conv55')
        input_data = common.convolutional(input_data, (1, 1, 1024, 512), self.training_flag, 'conv56')

        # scale one 小尺度的 feature maps: conv set -> conv 3 x 3 -> 1 x 1
        conv_lobj_branch = common.convolutional(input_data, (3, 3, 512, 1024),
                                                self.training_flag, name='conv_lobj_branch')
        # 3 * (self.num_class + 5) 表示为: 每个尺度有 3 个 anchors,每个 anchor 有 5 + num_class 个值
        # 5 = 4 + 1, 4个 坐标值,1 个置信度,num_class 表示分类的数量
        conv_lbbox = common.convolutional(conv_lobj_branch, (1, 1, 1024, 3 * (self.num_class + 5)),
                                          training_flag=self.training_flag, name='conv_lbbox',
                                          activate=False, bn=False)

        # 进入另一个分支点: conv set -> 1 x 1 -> up_sampling -> concatenate
        input_data = common.convolutional(input_data, (1, 1, 512, 256), self.training_flag, 'conv57')
        input_data = common.up_sample(input_data, name='up_sample0', method=self.up_sample_method)

        with tf.variable_scope('route_1'):
            input_data = tf.concat([input_data, route_2], axis=-1)

        # conv set 操作 conv: 1 x 1 -> 3 x 3 -> 1 x 1 -> 3 x 3 -> 1 x 1
        input_data = common.convolutional(input_data, (1, 1, 768, 256), self.training_flag, 'conv58')
        input_data = common.convolutional(input_data, (3, 3, 256, 512), self.training_flag, 'conv59')
        input_data = common.convolutional(input_data, (1, 1, 512, 256), self.training_flag, 'conv60')
        input_data = common.convolutional(input_data, (3, 3, 256, 512), self.training_flag, 'conv61')
        input_data = common.convolutional(input_data, (1, 1, 512, 256), self.training_flag, 'conv62')

        # scale two 中尺度的 feature maps: conv set -> conv 3 x 3 -> 1 x 1
        conv_mobj_branch = common.convolutional(input_data, (3, 3, 256, 512),
                                                self.training_flag, name='conv_mobj_branch')
        conv_mbbox = common.convolutional(conv_mobj_branch, (1, 1, 512, 3 * (self.num_class + 5)),
                                          training_flag=self.training_flag, name='conv_mbbox',
                                          activate=False, bn=False)

        # 进入另一个分支点: conv set -> 1 x 1 -> up_sampling -> concatenate
        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.training_flag, 'conv63')
        input_data = common.up_sample(input_data, name='up_sample1', method=self.up_sample_method)

        with tf.variable_scope('route_2'):
            input_data = tf.concat([input_data, route_1], axis=-1)

        # conv set 操作 conv: 1 x 1 -> 3 x 3 -> 1 x 1 -> 3 x 3 -> 1 x 1
        input_data = common.convolutional(input_data, (1, 1, 384, 128), self.training_flag, 'conv64')
        input_data = common.convolutional(input_data, (3, 3, 128, 256), self.training_flag, 'conv65')
        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.training_flag, 'conv66')
        input_data = common.convolutional(input_data, (3, 3, 128, 256), self.training_flag, 'conv67')
        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.training_flag, 'conv68')

        # scale three 大尺度的 feature maps: conv set -> conv 3 x 3 -> 1 x 1
        conv_sobj_branch = common.convolutional(input_data, (3, 3, 128, 256),
                                                self.training_flag, name='conv_sobj_branch')
        conv_sbbox = common.convolutional(conv_sobj_branch, (1, 1, 256, 3 * (self.num_class + 5)),
                                          training_flag=self.training_flag, name='conv_sbbox',
                                          activate=False, bn=False)

        # 将 3 个尺度 小、中、大 的 feature maps 类似于 13 x 13 大小的那种 feature maps
        return conv_lbbox, conv_mbbox, conv_sbbox
        pass
예제 #10
0
    def __build_nework(self, input_data):
        print('__build_nework self.net_type=', self.net_type)
        assert self.net_type in [
            'darknet53', 'mobilenetv2', 'mobilenetv3', 'mobilenetv3_small'
        ]

        if self.net_type == 'darknet53':
            route_1, route_2, input_data = backbone.darknet53(
                input_data, self.trainable)

            input_data = common.convolutional(input_data, (1, 1, 1024, 512),
                                              self.trainable, 'conv52')
            input_data = common.convolutional(input_data, (3, 3, 512, 1024),
                                              self.trainable, 'conv53')
            input_data = common.convolutional(input_data, (1, 1, 1024, 512),
                                              self.trainable, 'conv54')
            input_data = common.convolutional(input_data, (3, 3, 512, 1024),
                                              self.trainable, 'conv55')
            input_data = common.convolutional(input_data, (1, 1, 1024, 512),
                                              self.trainable, 'conv56')

            conv_lobj_branch = common.convolutional(input_data,
                                                    (3, 3, 512, 1024),
                                                    self.trainable,
                                                    name='conv_lobj_branch')
            conv_lbbox = common.convolutional(
                conv_lobj_branch, (1, 1, 1024, 3 * (self.num_class + 5)),
                trainable=self.trainable,
                name='conv_lbbox',
                activate=False,
                bn=False)

            input_data = common.convolutional(input_data, (1, 1, 512, 256),
                                              self.trainable, 'conv57')
            input_data = common.upsample(input_data,
                                         name='upsample0',
                                         method=self.upsample_method)

            with tf.variable_scope('route_1'):
                input_data = tf.concat([input_data, route_2], axis=-1)

            input_data = common.convolutional(input_data, (1, 1, 768, 256),
                                              self.trainable, 'conv58')
            input_data = common.convolutional(input_data, (3, 3, 256, 512),
                                              self.trainable, 'conv59')
            input_data = common.convolutional(input_data, (1, 1, 512, 256),
                                              self.trainable, 'conv60')
            input_data = common.convolutional(input_data, (3, 3, 256, 512),
                                              self.trainable, 'conv61')
            input_data = common.convolutional(input_data, (1, 1, 512, 256),
                                              self.trainable, 'conv62')

            conv_mobj_branch = common.convolutional(input_data,
                                                    (3, 3, 256, 512),
                                                    self.trainable,
                                                    name='conv_mobj_branch')
            conv_mbbox = common.convolutional(
                conv_mobj_branch, (1, 1, 512, 3 * (self.num_class + 5)),
                trainable=self.trainable,
                name='conv_mbbox',
                activate=False,
                bn=False)

            input_data = common.convolutional(input_data, (1, 1, 256, 128),
                                              self.trainable, 'conv63')
            input_data = common.upsample(input_data,
                                         name='upsample1',
                                         method=self.upsample_method)

            with tf.variable_scope('route_2'):
                input_data = tf.concat([input_data, route_1], axis=-1)

            input_data = common.convolutional(input_data, (1, 1, 384, 128),
                                              self.trainable, 'conv64')
            input_data = common.convolutional(input_data, (3, 3, 128, 256),
                                              self.trainable, 'conv65')
            input_data = common.convolutional(input_data, (1, 1, 256, 128),
                                              self.trainable, 'conv66')
            input_data = common.convolutional(input_data, (3, 3, 128, 256),
                                              self.trainable, 'conv67')
            input_data = common.convolutional(input_data, (1, 1, 256, 128),
                                              self.trainable, 'conv68')

            conv_sobj_branch = common.convolutional(input_data,
                                                    (3, 3, 128, 256),
                                                    self.trainable,
                                                    name='conv_sobj_branch')
            conv_sbbox = common.convolutional(
                conv_sobj_branch, (1, 1, 256, 3 * (self.num_class + 5)),
                trainable=self.trainable,
                name='conv_sbbox',
                activate=False,
                bn=False)
            return conv_lbbox, conv_mbbox, conv_sbbox

        elif self.net_type == 'mobilenetv2':
            route_1, route_2, input_data = backbone.mobilenetv2(
                input_data, self.trainable)

            input_data = common.convolutional(input_data, (1, 1, 320, 160),
                                              self.trainable, 'conv18')
            input_data = common.convolutional(input_data, (3, 3, 160, 320),
                                              self.trainable, 'conv19')
            input_data = common.convolutional(input_data, (1, 1, 320, 160),
                                              self.trainable, 'conv20')

            conv_lobj_branch = common.convolutional(input_data,
                                                    (3, 3, 160, 320),
                                                    self.trainable,
                                                    name='conv_lobj_branch')
            conv_lbbox = common.convolutional(
                conv_lobj_branch, (1, 1, 320, 3 * (self.num_class + 5)),
                trainable=self.trainable,
                name='conv_lbbox',
                activate=False,
                bn=False)

            input_data = common.convolutional(input_data, (1, 1, 160, 80),
                                              self.trainable, 'conv21')
            input_data = common.upsample(input_data,
                                         name='upsample0',
                                         method=self.upsample_method)

            with tf.variable_scope('route_1'):
                input_data = tf.concat([input_data, route_2], axis=-1)

            input_data = common.convolutional(input_data, (1, 1, 176, 80),
                                              self.trainable, 'conv22')
            input_data = common.convolutional(input_data, (3, 3, 80, 160),
                                              self.trainable, 'conv23')
            input_data = common.convolutional(input_data, (1, 1, 160, 80),
                                              self.trainable, 'conv24')

            conv_mobj_branch = common.convolutional(input_data,
                                                    (3, 3, 80, 160),
                                                    self.trainable,
                                                    name='conv_mobj_branch')
            conv_mbbox = common.convolutional(
                conv_mobj_branch, (1, 1, 160, 3 * (self.num_class + 5)),
                trainable=self.trainable,
                name='conv_mbbox',
                activate=False,
                bn=False)

            input_data = common.convolutional(input_data, (1, 1, 80, 40),
                                              self.trainable, 'conv25')
            input_data = common.upsample(input_data,
                                         name='upsample1',
                                         method=self.upsample_method)

            with tf.variable_scope('route_2'):
                input_data = tf.concat([input_data, route_1], axis=-1)

            input_data = common.convolutional(input_data, (1, 1, 72, 40),
                                              self.trainable, 'conv26')
            input_data = common.convolutional(input_data, (3, 3, 40, 80),
                                              self.trainable, 'conv27')
            input_data = common.convolutional(input_data, (1, 1, 80, 40),
                                              self.trainable, 'conv28')

            conv_sobj_branch = common.convolutional(input_data, (3, 3, 40, 80),
                                                    self.trainable,
                                                    name='conv_sobj_branch')
            conv_sbbox = common.convolutional(
                conv_sobj_branch, (1, 1, 80, 3 * (self.num_class + 5)),
                trainable=self.trainable,
                name='conv_sbbox',
                activate=False,
                bn=False)
            return conv_lbbox, conv_mbbox, conv_sbbox

        elif self.net_type == 'mobilenetv3':
            route_1, route_2, input_data = backbone.mobilenetv3(
                input_data, self.trainable)

            input_data = common.convolutional(input_data, (1, 1, 160, 80),
                                              self.trainable, 'conv8')
            input_data = common.convolutional(input_data, (3, 3, 80, 160),
                                              self.trainable, 'conv9')
            input_data = common.convolutional(input_data, (1, 1, 160, 80),
                                              self.trainable, 'conv10')

            conv_lobj_branch = common.convolutional(input_data,
                                                    (3, 3, 80, 160),
                                                    self.trainable,
                                                    name='conv_lobj_branch')
            conv_lbbox = common.convolutional(
                conv_lobj_branch, (1, 1, 160, 3 * (self.num_class + 5)),
                trainable=self.trainable,
                name='conv_lbbox',
                activate=False,
                bn=False)

            input_data = common.convolutional(input_data, (1, 1, 80, 40),
                                              self.trainable, 'conv11')
            input_data = common.upsample(input_data,
                                         name='upsample0',
                                         method=self.upsample_method)

            with tf.variable_scope('route_1'):
                input_data = tf.concat([input_data, route_2], axis=-1)

            input_data = common.convolutional(input_data, (1, 1, 152, 40),
                                              self.trainable, 'conv12')
            input_data = common.convolutional(input_data, (3, 3, 40, 80),
                                              self.trainable, 'conv13')
            input_data = common.convolutional(input_data, (1, 1, 80, 40),
                                              self.trainable, 'conv14')

            conv_mobj_branch = common.convolutional(input_data, (3, 3, 40, 80),
                                                    self.trainable,
                                                    name='conv_mobj_branch')
            conv_mbbox = common.convolutional(
                conv_mobj_branch, (1, 1, 80, 3 * (self.num_class + 5)),
                trainable=self.trainable,
                name='conv_mbbox',
                activate=False,
                bn=False)

            input_data = common.convolutional(input_data, (1, 1, 40, 20),
                                              self.trainable, 'conv15')
            input_data = common.upsample(input_data,
                                         name='upsample1',
                                         method=self.upsample_method)

            with tf.variable_scope('route_2'):
                input_data = tf.concat([input_data, route_1], axis=-1)

            input_data = common.convolutional(input_data, (1, 1, 60, 20),
                                              self.trainable, 'conv16')
            input_data = common.convolutional(input_data, (3, 3, 20, 40),
                                              self.trainable, 'conv17')
            input_data = common.convolutional(input_data, (1, 1, 40, 20),
                                              self.trainable, 'conv18')

            conv_sobj_branch = common.convolutional(input_data, (3, 3, 20, 40),
                                                    self.trainable,
                                                    name='conv_sobj_branch')
            conv_sbbox = common.convolutional(
                conv_sobj_branch, (1, 1, 40, 3 * (self.num_class + 5)),
                trainable=self.trainable,
                name='conv_sbbox',
                activate=False,
                bn=False)
            return conv_lbbox, conv_mbbox, conv_sbbox

        elif self.net_type == 'mobilenetv3_small':
            route_1, route_2, input_data = backbone.mobilenetv3_small(
                input_data, self.trainable)

            input_data = common.convolutional(input_data, (1, 1, 96, 80),
                                              self.trainable, 'conv7')
            input_data = common.convolutional(input_data, (3, 3, 80, 160),
                                              self.trainable, 'conv8')
            input_data = common.convolutional(input_data, (1, 1, 160, 80),
                                              self.trainable, 'conv9')

            conv_lobj_branch = common.convolutional(input_data,
                                                    (3, 3, 80, 160),
                                                    self.trainable,
                                                    name='conv_lobj_branch')
            conv_lbbox = common.convolutional(
                conv_lobj_branch, (1, 1, 160, 3 * (self.num_class + 5)),
                trainable=self.trainable,
                name='conv_lbbox',
                activate=False,
                bn=False)

            input_data = common.convolutional(input_data, (1, 1, 80, 40),
                                              self.trainable, 'conv10')
            input_data = common.upsample(input_data,
                                         name='upsample0',
                                         method=self.upsample_method)

            with tf.variable_scope('route_1'):
                input_data = tf.concat([input_data, route_2], axis=-1)

            input_data = common.convolutional(input_data, (1, 1, 88, 40),
                                              self.trainable, 'conv11')
            input_data = common.convolutional(input_data, (3, 3, 40, 80),
                                              self.trainable, 'conv12')
            input_data = common.convolutional(input_data, (1, 1, 80, 40),
                                              self.trainable, 'conv13')

            conv_mobj_branch = common.convolutional(input_data, (3, 3, 40, 80),
                                                    self.trainable,
                                                    name='conv_mobj_branch')
            conv_mbbox = common.convolutional(
                conv_mobj_branch, (1, 1, 80, 3 * (self.num_class + 5)),
                trainable=self.trainable,
                name='conv_mbbox',
                activate=False,
                bn=False)

            input_data = common.convolutional(input_data, (1, 1, 40, 20),
                                              self.trainable, 'conv14')
            input_data = common.upsample(input_data,
                                         name='upsample1',
                                         method=self.upsample_method)

            with tf.variable_scope('route_2'):
                input_data = tf.concat([input_data, route_1], axis=-1)

            input_data = common.convolutional(input_data, (1, 1, 44, 20),
                                              self.trainable, 'conv15')
            input_data = common.convolutional(input_data, (3, 3, 20, 40),
                                              self.trainable, 'conv16')
            input_data = common.convolutional(input_data, (1, 1, 40, 20),
                                              self.trainable, 'conv17')

            conv_sobj_branch = common.convolutional(input_data, (3, 3, 20, 40),
                                                    self.trainable,
                                                    name='conv_sobj_branch')
            conv_sbbox = common.convolutional(
                conv_sobj_branch, (1, 1, 40, 3 * (self.num_class + 5)),
                trainable=self.trainable,
                name='conv_sbbox',
                activate=False,
                bn=False)
            return conv_lbbox, conv_mbbox, conv_sbbox

        else:
            print('self.net_type=%s error' % self.net_type)
예제 #11
0
    def __build_network(self, input_data):
        '''

        :param self:
        :param input_data:
        :return:
        '''

        # 输入层进入 Darknet-53 网络后,得到了三个分支
        route_1, route_2, input_data = backbone.darknet53(input_data, self.trainable)  # 输出的尺度为52,26,13
        # route_1.shape=(?,52,52,256),一个特征点代表8*8的图像  检测小目标,最小检测8*8的图像
        # route_2.shape=(?,26,26,512),一个特征点代表16*16的图像,检测中目标,最小检测16*16的图像
        # route_3.shape=(?,13,13,1024), 一个特征点代表32*32像素的图像范围,可以用来检测大目标,最小检测32*32的图像。
        # ?具体大小与该批次输入的图片数量有关

        # ====predict one=======#
        # Convolutional Set 模块,1X1-->3X3-->1X1-->3X3-->1X1
        input_data = common.convolutional(input_data, (1, 1, 1024, 512), self.trainable, 'conv52')
        input_data = common.convolutional(input_data, (3, 3, 512, 1024), self.trainable, 'conv53')
        input_data = common.convolutional(input_data, (1, 1, 1024, 512), self.trainable, 'conv54')
        input_data = common.convolutional(input_data, (3, 3, 512, 1024), self.trainable, 'conv55')
        input_data = common.convolutional(input_data, (1, 1, 1024, 512), self.trainable, 'conv56')

        # conv_lbbox 用于预测大尺寸物体,shape = [None, 13, 13, 255],255=3*(80+5)
        conv_lobj_branch = common.convolutional(input_data, (3, 3, 512, 1024), self.trainable, name='conv_lobj_branch')
        conv_lbbox = common.convolutional(conv_lobj_branch, (1, 1, 1024, 3 * (self.num_class + 5)),
                                          trainable=self.trainable, name='conv_lbbox', activate=False, bn=False)

        # 上采样
        # 这里的 upsample 使用的是最近邻插值方法,这样的好处在于上采样过程不需要学习,从而减少了网络参数
        input_data = common.convolutional(input_data, (1, 1, 512, 256), self.trainable, 'conv57')
        input_data = common.upsample(input_data, name='upsample0', method=self.upsample_method)

        # 连接
        with tf.variable_scope('route_1'):
            input_data = tf.concat([input_data, route_2], axis=-1)#input_data.shape(?,26,26,768),768=256(input_data)+512(route_2),第4维的拼接

        # ====predict two=======#
        # Convolutional Set 模块,1X1-->3X3-->1X1-->3X3-->1X1
        input_data = common.convolutional(input_data, (1, 1, 768, 256), self.trainable, 'conv58')
        input_data = common.convolutional(input_data, (3, 3, 256, 512), self.trainable, 'conv59')
        input_data = common.convolutional(input_data, (1, 1, 512, 256), self.trainable, 'conv60')
        input_data = common.convolutional(input_data, (3, 3, 256, 512), self.trainable, 'conv61')
        input_data = common.convolutional(input_data, (1, 1, 512, 256), self.trainable, 'conv62')

        # conv_mbbox 用于预测中等尺寸物体,shape = [None, 26, 26, 255]
        conv_mobj_branch = common.convolutional(input_data, (3, 3, 256, 512), self.trainable, name='conv_mobj_branch')
        conv_mbbox = common.convolutional(conv_mobj_branch, (1, 1, 512, 3 * (self.num_class + 5)),
                                          trainable=self.trainable, name='conv_mbbox', activate=False, bn=False)

        input_data = common.convolutional(input_data, (1, 1,256, 128), self.trainable, 'conv63')
        input_data = common.upsample(input_data, name='upsample1', method=self.upsample_method)

        with tf.variable_scope('route_2'):
            input_data = tf.concat([input_data, route_1], axis=-1)#input_data.shape(?,52,52,384),384=128(input_data)+256(route_1),第4维的拼接

        # ====predict three=======#
        # Convolutional Set 模块,1X1-->3X3-->1X1-->3X3-->1X1
        input_data = common.convolutional(input_data, (1, 1, 384, 128), self.trainable, 'conv64')
        input_data = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, 'conv65')
        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.trainable, 'conv66')
        input_data = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, 'conv67')
        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.trainable, 'conv68')

        # conv_sbbox 用于预测小尺寸物体,shape = [None, 52, 52, 255]
        conv_sobj_branch = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, name='conv_sobj_branch')
        conv_sbbox = common.convolutional(conv_sobj_branch, (1, 1, 256, 3 * (self.num_class + 5)),
                                          trainable=self.trainable, name='conv_sbbox', activate=False, bn=False)

        return conv_lbbox, conv_mbbox, conv_sbbox
예제 #12
0
    def __build_nework(self, input_data):

        route_1, route_2, input_data = backbone.darknet53(
            input_data, self.trainable)

        conv_lobj_branch = common.EP(input_data,
                                     189,
                                     462,
                                     name='EP5',
                                     stride=1)
        conv_lbbox = common.convolutional(
            conv_lobj_branch, (1, 1, 462, 3 * (self.num_class + 5)),
            trainable=self.trainable,
            name='conv_lbbox',
            activate=False,
            bn=False)

        input_data = common.convolutional(input_data, (1, 1, 189, 105),
                                          self.trainable, 'conv5')
        input_data = common.upsample(input_data,
                                     name='upsample0',
                                     method=self.upsample_method)
        input_data = tf.concat([input_data, route_2], axis=-1)
        input_data = common.PEP(input_data,
                                430,
                                325,
                                113,
                                name='PEP17',
                                stride=1)
        input_data = common.PEP(input_data,
                                325,
                                207,
                                99,
                                name='PEP18',
                                stride=1)
        input_data = common.convolutional(input_data, (1, 1, 207, 98),
                                          self.trainable, 'conv6')

        conv_mobj_branch = common.EP(input_data, 98, 183, name='EP6', stride=1)
        conv_mbbox = common.convolutional(
            conv_mobj_branch, (1, 1, 183, 3 * (self.num_class + 5)),
            trainable=self.trainable,
            name='conv_mbbox',
            activate=False,
            bn=False)

        input_data = common.convolutional(input_data, (1, 1, 98, 47),
                                          self.trainable, 'conv7')
        input_data = common.upsample(input_data,
                                     name='upsample1',
                                     method=self.upsample_method)
        input_data = tf.concat([input_data, route_1], axis=-1)
        input_data = common.PEP(input_data,
                                197,
                                122,
                                58,
                                name='PEP19',
                                stride=1)
        input_data = common.PEP(input_data,
                                122,
                                87,
                                52,
                                name='PEP20',
                                stride=1)
        conv_sobj_branch = common.PEP(input_data,
                                      87,
                                      93,
                                      47,
                                      name='PEP21',
                                      stride=1)
        conv_sbbox = common.convolutional(conv_sobj_branch,
                                          (1, 1, 93, 3 * (self.num_class + 5)),
                                          trainable=self.trainable,
                                          name='conv_sbbox',
                                          activate=False,
                                          bn=False)
        return conv_lbbox, conv_mbbox, conv_sbbox
예제 #13
0
    def __build_nework(self, input_data):
        #backbone.darknet53函数返回3个输出值,分贝时4倍、8倍、以及16倍下采样的输出
        route_1, route_2, route_3, input_data = backbone.darknet53(input_data, self.trainable)

        input_data = common.convolutional(input_data, (1, 1, 1024,  512), self.trainable, 'conv52')
        input_data = common.convolutional(input_data, (3, 3,  512, 1024), self.trainable, 'conv53')
        input_data = common.convolutional(input_data, (1, 1, 1024,  512), self.trainable, 'conv54')
        input_data = common.convolutional(input_data, (3, 3,  512, 1024), self.trainable, 'conv55')
        input_data = common.convolutional(input_data, (1, 1, 1024,  512), self.trainable, 'conv56')
        #conv56 得到输出13*13*512
        conv_lobj_branch = common.convolutional(input_data, (3, 3, 512, 1024), self.trainable, name='conv_lobj_branch')
        conv_lbbox = common.convolutional(conv_lobj_branch, (1, 1, 1024, 3*(self.num_class + 5)),
                                          trainable=self.trainable, name='conv_lbbox', activate=False, bn=False)

        input_data = common.convolutional(input_data, (1, 1,  512,  256), self.trainable, 'conv57')
        input_data = common.upsample(input_data, name='upsample0', method=self.upsample_method)
        #上采样以后得到26*26*256
        with tf.variable_scope('route_1'):
            input_data = tf.concat([input_data, route_3], axis=-1)
        #将上采样得到的输出与16倍的下采样输出26*26*512进行concat操作,得到26*26*(256+512)=26*26*768
        input_data = common.convolutional(input_data, (1, 1, 768, 256), self.trainable, 'conv58')
        input_data = common.convolutional(input_data, (3, 3, 256, 512), self.trainable, 'conv59')
        input_data = common.convolutional(input_data, (1, 1, 512, 256), self.trainable, 'conv60')
        input_data = common.convolutional(input_data, (3, 3, 256, 512), self.trainable, 'conv61')
        input_data = common.convolutional(input_data, (1, 1, 512, 256), self.trainable, 'conv62')
        #得到输出26*26*256
        conv_mobj_branch = common.convolutional(input_data, (3, 3, 256, 512),  self.trainable, name='conv_mobj_branch' )
        conv_mbbox = common.convolutional(conv_mobj_branch, (1, 1, 512, 3*(self.num_class + 5)),
                                          trainable=self.trainable, name='conv_mbbox', activate=False, bn=False)

        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.trainable, 'conv63')
        input_data = common.upsample(input_data, name='upsample1', method=self.upsample_method)
        #上采样输出为52*52*128
        with tf.variable_scope('route_2'):
            input_data = tf.concat([input_data, route_2], axis=-1)
        #8倍下采样输出52*52*256,concat以后为52*52*384
        input_data = common.convolutional(input_data, (1, 1, 384, 128), self.trainable, 'conv64')
        input_data = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, 'conv65')
        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.trainable, 'conv66')
        input_data = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, 'conv67')
        input_data = common.convolutional(input_data, (1, 1, 256, 128), self.trainable, 'conv68')
        #得到输出52*52*128
        conv_sobj_branch = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, name='conv_sobj_branch')
        conv_sbbox = common.convolutional(conv_sobj_branch, (1, 1, 256, 3*(self.num_class + 5)),
                                          trainable=self.trainable, name='conv_sbbox', activate=False, bn=False)

        input_data = common.convolutional(input_data, (1, 1, 128, 64), self.trainable, 'conv63')
        input_data = common.upsample(input_data, name='upsample1', method=self.upsample_method)
        #上采样以后得到输出104*104*64

        with tf.variable_scope('route_3'):
            input_data = tf.concat([input_data, route_1], axis=-1)
        #4倍下采样输出104*104*128,concat以后为104*104*128
        input_data = common.convolutional(input_data, (1, 1, 192, 64), self.trainable, 'conv64')
        input_data = common.convolutional(input_data, (3, 3, 64, 128), self.trainable, 'conv65')
        input_data = common.convolutional(input_data, (1, 1, 128, 64), self.trainable, 'conv66')
        input_data = common.convolutional(input_data, (3, 3, 64, 128), self.trainable, 'conv67')
        input_data = common.convolutional(input_data, (1, 1, 128, 64), self.trainable, 'conv68')
        #得到输出104*104*64
        conv_sobj_branch_1 = common.convolutional(input_data, (3, 3, 64, 128), self.trainable, name='conv_sobj_branch')
        conv_sbbox_1 = common.convolutional(conv_sobj_branch_1, (1, 1, 128, 3*(self.num_class + 5)),
                                          trainable=self.trainable, name='conv_sbbox', activate=False, bn=False)

        return conv_lbbox, conv_mbbox, conv_sbbox, conv_sbbox_1
예제 #14
0
 def build_backbone(self):
     return backbone.darknet53(self.trainable, self.darknet_gn,
                               self.precision)
예제 #15
0
    def __build_nework(self, input_data):
        # route1 2 3 input data 分别为用于后面concat的值 即 128残差后用于最大特征图concat的 route1 以此类推
        route_1, route_2, input_data = backbone.darknet53(
            input_data, self.trainable)
        # 经过全部残差的 output 先经过五次DBL操作
        input_data = common.convolutional(input_data, (1, 1, 1024, 512),
                                          self.trainable, 'conv52')
        input_data = common.convolutional(input_data, (3, 3, 512, 1024),
                                          self.trainable, 'conv53')
        input_data = common.convolutional(input_data, (1, 1, 1024, 512),
                                          self.trainable, 'conv54')
        input_data = common.convolutional(input_data, (3, 3, 512, 1024),
                                          self.trainable, 'conv55')
        input_data = common.convolutional(input_data, (1, 1, 1024, 512),
                                          self.trainable, 'conv56')

        conv_lobj_branch = common.convolutional(input_data, (3, 3, 512, 1024),
                                                self.trainable,
                                                name='conv_lobj_branch')
        conv_lbbox = common.convolutional(
            conv_lobj_branch, (1, 1, 1024, 3 * (self.num_class + 5)),
            trainable=self.trainable,
            name='conv_lbbox',
            activate=False,
            bn=False)

        input_data = common.convolutional(input_data, (1, 1, 512, 256),
                                          self.trainable, 'conv57')
        input_data = common.upsample(input_data,
                                     name='upsample0',
                                     method=self.upsample_method)

        with tf.variable_scope('route_1'):
            input_data = tf.concat([input_data, route_2], axis=-1)

        input_data = common.convolutional(input_data, (1, 1, 768, 256),
                                          self.trainable, 'conv58')
        input_data = common.convolutional(input_data, (3, 3, 256, 512),
                                          self.trainable, 'conv59')
        input_data = common.convolutional(input_data, (1, 1, 512, 256),
                                          self.trainable, 'conv60')
        input_data = common.convolutional(input_data, (3, 3, 256, 512),
                                          self.trainable, 'conv61')
        input_data = common.convolutional(input_data, (1, 1, 512, 256),
                                          self.trainable, 'conv62')

        conv_mobj_branch = common.convolutional(input_data, (3, 3, 256, 512),
                                                self.trainable,
                                                name='conv_mobj_branch')
        conv_mbbox = common.convolutional(
            conv_mobj_branch, (1, 1, 512, 3 * (self.num_class + 5)),
            trainable=self.trainable,
            name='conv_mbbox',
            activate=False,
            bn=False)

        input_data = common.convolutional(input_data, (1, 1, 256, 128),
                                          self.trainable, 'conv63')
        input_data = common.upsample(input_data,
                                     name='upsample1',
                                     method=self.upsample_method)

        with tf.variable_scope('route_2'):
            input_data = tf.concat([input_data, route_1], axis=-1)

        input_data = common.convolutional(input_data, (1, 1, 384, 128),
                                          self.trainable, 'conv64')
        input_data = common.convolutional(input_data, (3, 3, 128, 256),
                                          self.trainable, 'conv65')
        input_data = common.convolutional(input_data, (1, 1, 256, 128),
                                          self.trainable, 'conv66')
        input_data = common.convolutional(input_data, (3, 3, 128, 256),
                                          self.trainable, 'conv67')
        input_data = common.convolutional(input_data, (1, 1, 256, 128),
                                          self.trainable, 'conv68')

        conv_sobj_branch = common.convolutional(input_data, (3, 3, 128, 256),
                                                self.trainable,
                                                name='conv_sobj_branch')
        conv_sbbox = common.convolutional(
            conv_sobj_branch, (1, 1, 256, 3 * (self.num_class + 5)),
            trainable=self.trainable,
            name='conv_sbbox',
            activate=False,
            bn=False)
        # 返回三种大小的检测框  13*13*255 26*26 52*52
        return conv_lbbox, conv_mbbox, conv_sbbox
예제 #16
0
    def __build_nework(self, input_data):
        """经过Darknet-53后,分出三个分支y1,y2,y3"""
        route_1, route_2, input_data = backbone.darknet53(
            input_data, self.trainable)
        #(Conv + BN + leaky_relu)×5
        input_data = common.convolutional(input_data, (1, 1, 1024, 512),
                                          self.trainable, 'conv52')
        input_data = common.convolutional(input_data, (3, 3, 512, 1024),
                                          self.trainable, 'conv53')
        input_data = common.convolutional(input_data, (1, 1, 1024, 512),
                                          self.trainable, 'conv54')
        input_data = common.convolutional(input_data, (3, 3, 512, 1024),
                                          self.trainable, 'conv55')
        input_data = common.convolutional(input_data, (1, 1, 1024, 512),
                                          self.trainable, 'conv56')

        conv_lobj_branch = common.convolutional(input_data, (3, 3, 512, 1024),
                                                self.trainable,
                                                name='conv_lobj_branch')
        #y1的输出[None,13,13,3*(80+5)=255],用于检测大物体
        conv_lbbox = common.convolutional(
            conv_lobj_branch, (1, 1, 1024, 3 * (self.num_class + 5)),
            trainable=self.trainable,
            name='conv_lbbox',
            activate=False,
            bn=False)

        input_data = common.convolutional(input_data, (1, 1, 512, 256),
                                          self.trainable, 'conv57')
        input_data = common.upsample(input_data,
                                     name='upsample0',
                                     method=self.upsample_method)

        #第一个concat操作
        with tf.variable_scope('route_1'):
            input_data = tf.concat([input_data, route_2], axis=-1)

        input_data = common.convolutional(input_data, (1, 1, 768, 256),
                                          self.trainable, 'conv58')
        input_data = common.convolutional(input_data, (3, 3, 256, 512),
                                          self.trainable, 'conv59')
        input_data = common.convolutional(input_data, (1, 1, 512, 256),
                                          self.trainable, 'conv60')
        input_data = common.convolutional(input_data, (3, 3, 256, 512),
                                          self.trainable, 'conv61')
        input_data = common.convolutional(input_data, (1, 1, 512, 256),
                                          self.trainable, 'conv62')

        conv_mobj_branch = common.convolutional(input_data, (3, 3, 256, 512),
                                                self.trainable,
                                                name='conv_mobj_branch')
        #y2的输出[None,26,26,3*(80+5)=255],用于检测中等物体
        conv_mbbox = common.convolutional(
            conv_mobj_branch, (1, 1, 512, 3 * (self.num_class + 5)),
            trainable=self.trainable,
            name='conv_mbbox',
            activate=False,
            bn=False)

        input_data = common.convolutional(input_data, (1, 1, 256, 128),
                                          self.trainable, 'conv63')
        input_data = common.upsample(input_data,
                                     name='upsample1',
                                     method=self.upsample_method)
        # input_data = common.upsample(input_data, name='upsample2', method=self.upsample_method)
        # route_1 = common.upsample(route_1, name = 'upsample3',method=self.upsample_method)

        #第二个concat操作
        with tf.variable_scope('route_2'):
            input_data = tf.concat([input_data, route_1], axis=-1)

        input_data = common.convolutional(input_data, (1, 1, 384, 128),
                                          self.trainable, 'conv64')
        input_data = common.convolutional(input_data, (3, 3, 128, 256),
                                          self.trainable, 'conv65')
        input_data = common.convolutional(input_data, (1, 1, 256, 128),
                                          self.trainable, 'conv66')
        input_data = common.convolutional(input_data, (3, 3, 128, 256),
                                          self.trainable, 'conv67')
        input_data = common.convolutional(input_data, (1, 1, 256, 128),
                                          self.trainable, 'conv68')

        conv_sobj_branch = common.convolutional(input_data, (3, 3, 128, 256),
                                                self.trainable,
                                                name='conv_sobj_branch')
        #y3的输出[None,52,52,3*(80+5)=255],用于检测小物体
        conv_sbbox = common.convolutional(
            conv_sobj_branch, (1, 1, 256, 3 * (self.num_class + 5)),
            trainable=self.trainable,
            name='conv_sbbox',
            activate=False,
            bn=False)

        return conv_lbbox, conv_mbbox, conv_sbbox
    def __build_nework(self, input_data):
        """
        基于输入的数据构建YOLO v3模型
        :param input_data:
        :return:
        """
        # 1. 构建darknet53网络结构,得到输出值(第一个分支、第二个分支以及最后输出数据)
        route_1, route_2, input_data = backbone.darknet53(
            input_data, self.trainable)  # 骨干网络(Encoder网络)

        # 2. 对最终输出数据连续5次卷积操作([3,3,1024] -> [1,1,512] -> [3,3,1024] -> [1,1,512]-> [3,3,1024] -> [1,1,512])
        input_data = common.convolutional(input_data, (1, 1, 1024, 512),
                                          self.trainable, 'conv52')
        input_data = common.convolutional(input_data, (3, 3, 512, 1024),
                                          self.trainable, 'conv53')
        input_data = common.convolutional(input_data, (1, 1, 1024, 512),
                                          self.trainable, 'conv54')
        input_data = common.convolutional(input_data, (3, 3, 512, 1024),
                                          self.trainable, 'conv55')
        input_data = common.convolutional(input_data, (1, 1, 1024, 512),
                                          self.trainable, 'conv56')

        # 3. 最后一个分支对应的预测值输出
        conv_lobj_branch = common.convolutional(input_data, (3, 3, 512, 1024),
                                                self.trainable,
                                                name='conv_lobj_branch')
        conv_lbbox = common.convolutional(conv_lobj_branch,
                                          (1, 1, 1024, self.anchor_per_scale *
                                           (self.num_class + 5)),
                                          trainable=self.trainable,
                                          name='conv_lbbox',
                                          activate=False,
                                          bn=False)

        # 4. 将最后一个分支进行卷积转换+上采样
        input_data = common.convolutional(input_data, (1, 1, 512, 256),
                                          self.trainable, 'conv57')
        input_data = common.upsample(input_data,
                                     name='upsample0',
                                     method=self.upsample_method)

        # 5. 将最后一个分支的数据和第二个分支的数据合并
        with tf.variable_scope('route_1'):
            input_data = tf.concat([input_data, route_2], axis=-1)

        # 6. 对第二个分支数据连续5次卷积操作
        input_data = common.convolutional(input_data, (1, 1, 768, 256),
                                          self.trainable, 'conv58')
        input_data = common.convolutional(input_data, (3, 3, 256, 512),
                                          self.trainable, 'conv59')
        input_data = common.convolutional(input_data, (1, 1, 512, 256),
                                          self.trainable, 'conv60')
        input_data = common.convolutional(input_data, (3, 3, 256, 512),
                                          self.trainable, 'conv61')
        input_data = common.convolutional(input_data, (1, 1, 512, 256),
                                          self.trainable, 'conv62')

        # 7. 第二个分支对应的预测值输出
        conv_mobj_branch = common.convolutional(input_data, (3, 3, 256, 512),
                                                self.trainable,
                                                name='conv_mobj_branch')
        conv_mbbox = common.convolutional(
            conv_mobj_branch, (1, 1, 512, 3 * (self.num_class + 5)),
            trainable=self.trainable,
            name='conv_mbbox',
            activate=False,
            bn=False)

        # 8. 将第二个分支的数据进行卷积转换 + 上采样
        input_data = common.convolutional(input_data, (1, 1, 256, 128),
                                          self.trainable, 'conv63')
        input_data = common.upsample(input_data,
                                     name='upsample1',
                                     method=self.upsample_method)

        # 9. 将第二个分支的数据和第三个分支的数据合并
        with tf.variable_scope('route_2'):
            input_data = tf.concat([input_data, route_1], axis=-1)

        # 10. 对第三个分支的数据连续5次卷积操作
        input_data = common.convolutional(input_data, (1, 1, 384, 128),
                                          self.trainable, 'conv64')
        input_data = common.convolutional(input_data, (3, 3, 128, 256),
                                          self.trainable, 'conv65')
        input_data = common.convolutional(input_data, (1, 1, 256, 128),
                                          self.trainable, 'conv66')
        input_data = common.convolutional(input_data, (3, 3, 128, 256),
                                          self.trainable, 'conv67')
        input_data = common.convolutional(input_data, (1, 1, 256, 128),
                                          self.trainable, 'conv68')

        # 11. 第三个分支对应的预测值输出
        conv_sobj_branch = common.convolutional(input_data, (3, 3, 128, 256),
                                                self.trainable,
                                                name='conv_sobj_branch')
        conv_sbbox = common.convolutional(
            conv_sobj_branch, (1, 1, 256, 3 * (self.num_class + 5)),
            trainable=self.trainable,
            name='conv_sbbox',
            activate=False,
            bn=False)

        # 12. 返回三个分支的数据输出,也就是大目标、中等目标、小目标的检测
        return conv_lbbox, conv_mbbox, conv_sbbox
예제 #18
0
    def __build_nework(self, input_data):

        input_data = backbone.darknet53(input_data, self.trainable)

        # input_data = common.convolutional(input_data, (1, 1, 1024,  512), self.trainable, 'conv52')
        # input_data = common.convolutional(input_data, (3, 3,  512, 1024), self.trainable, 'conv53')
        # input_data = common.convolutional(input_data, (1, 1, 1024,  512), self.trainable, 'conv54')
        # input_data = common.convolutional(input_data, (3, 3,  512, 1024), self.trainable, 'conv55')
        # input_data = common.convolutional(input_data, (1, 1, 1024,  512), self.trainable, 'conv56')
        #
        # conv_lobj_branch = common.convolutional(input_data, (3, 3, 512, 1024), self.trainable, name='conv_lobj_branch')
        # conv_l = common.convolutional(input_data, (1, 1, 1024, self.num_class),
        #                                   trainable=self.trainable, name='conv_l', activate=False, bn=False)

        conv_l = tf.layers.flatten(input_data)
        conv_l = tf.reshape(conv_l, (-1, 8 * 8 * 128))
        conv_l = tf.layers.dense(
            conv_l,
            units=1024,
            activation=tf.nn.leaky_relu,
            kernel_regularizer=tf.contrib.layers.l2_regularizer(0.1))
        conv_l = tf.layers.dropout(conv_l, rate=0.4)
        conv_l = tf.layers.dense(
            conv_l,
            units=512,
            activation=tf.nn.leaky_relu,
            kernel_regularizer=tf.contrib.layers.l2_regularizer(0.1))
        conv_l = tf.layers.dropout(conv_l, rate=0.4)
        conv_l = tf.layers.dense(conv_l,
                                 units=self.num_class,
                                 name='conv_l',
                                 activation=tf.nn.softmax)

        # input_data = common.convolutional(input_data, (1, 1,  1024,  256), self.trainable, 'conv57')
        # input_data = common.upsample(input_data, name='upsample0', method=self.upsample_method)
        #
        # with tf.variable_scope('route_1'):
        #     input_data = tf.concat([input_data, route_2], axis=-1)

        # input_data = common.convolutional(input_data, (1, 1, 768, 256), self.trainable, 'conv58')
        # input_data = common.convolutional(input_data, (3, 3, 256, 512), self.trainable, 'conv59')
        # input_data = common.convolutional(input_data, (1, 1, 512, 256), self.trainable, 'conv60')
        # input_data = common.convolutional(input_data, (3, 3, 256, 512), self.trainable, 'conv61')
        # input_data = common.convolutional(input_data, (1, 1, 512, 256), self.trainable, 'conv62')
        #
        # conv_mobj_branch = common.convolutional(input_data, (3, 3, 256, 512),  self.trainable, name='conv_mobj_branch')
        # conv_m = common.convolutional(input_data, (1, 1, 768, self.num_class),
        #                                   trainable=self.trainable, name='conv_m', activate=False, bn=False)

        # conv_m = tf.layers.flatten(input_data)
        # conv_m = tf.reshape(conv_m, (-1, 26 * 26 * 768))
        # conv_m = tf.layers.dense(conv_m, units=self.num_class, name='conv_m', activation=tf.nn.relu)
        #
        # input_data = common.convolutional(input_data, (1, 1, 768, 128), self.trainable, 'conv63')
        # input_data = common.upsample(input_data, name='upsample1', method=self.upsample_method)
        #
        # with tf.variable_scope('route_2'):
        #     input_data = tf.concat([input_data, route_1], axis=-1)

        # input_data = common.convolutional(input_data, (1, 1, 384, 128), self.trainable, 'conv64')
        # input_data = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, 'conv65')
        # input_data = common.convolutional(input_data, (1, 1, 256, 128), self.trainable, 'conv66')
        # input_data = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, 'conv67')
        # input_data = common.convolutional(input_data, (1, 1, 384, 128), self.trainable, 'conv68')
        #
        # conv_sobj_branch = common.convolutional(input_data, (3, 3, 128, 256), self.trainable, name='conv_sobj_branch')
        # conv_s = common.convolutional(input_data, (1, 1, 384, self.num_class),
        #                                   trainable=self.trainable, name='conv_s', activate=False, bn=False)

        # conv_s = tf.layers.flatten(input_data)
        # conv_s = tf.reshape(conv_s, (-1, 52 * 52 * 384))
        # conv_s = tf.layers.dense(conv_s, units=self.num_class, name='conv_s', activation=tf.nn.relu)

        return conv_l
예제 #19
0
def YOLOv3(input_layer):
    if BACK_BONE == 'resnet18':
        route_1, route_2, conv = backbone.resnet(input_layer, 18)
    if BACK_BONE == 'resnet34':
        route_1, route_2, conv = backbone.resnet(input_layer, 34)
    if BACK_BONE == 'resnet50':
        route_1, route_2, conv = backbone.resnet(input_layer, 50)
    if BACK_BONE == 'resnet101':
        route_1, route_2, conv = backbone.resnet(input_layer, 101)
    if BACK_BONE == 'resnet152':
        route_1, route_2, conv = backbone.resnet(input_layer, 152)
    if BACK_BONE == 'darknet53':
        route_1, route_2, conv = backbone.darknet53(input_layer)

    conv = common.convolutional(conv, (1, 1, 1024, 512))
    conv = common.convolutional(conv, (3, 3, 512, 1024))
    conv = common.convolutional(conv, (1, 1, 1024, 512))
    conv = common.convolutional(conv, (3, 3, 512, 1024))
    conv = common.convolutional(conv, (1, 1, 1024, 512))

    conv_lobj_branch = common.convolutional(conv, (3, 3, 512, 1024))
    conv_lbbox = common.convolutional(conv_lobj_branch,
                                      (1, 1, 1024, 3 * (NUM_CLASS + 5)),
                                      activate=False,
                                      bn=False)

    conv = common.convolutional(conv, (1, 1, 512, 256))
    conv = common.upsample(conv)

    conv = tf.concat([conv, route_2], axis=-1)

    conv = common.convolutional(conv, (1, 1, 768, 256))
    conv = common.convolutional(conv, (3, 3, 256, 512))
    conv = common.convolutional(conv, (1, 1, 512, 256))
    conv = common.convolutional(conv, (3, 3, 256, 512))
    conv = common.convolutional(conv, (1, 1, 512, 256))

    conv_mobj_branch = common.convolutional(conv, (3, 3, 256, 512))
    conv_mbbox = common.convolutional(conv_mobj_branch,
                                      (1, 1, 512, 3 * (NUM_CLASS + 5)),
                                      activate=False,
                                      bn=False)

    conv = common.convolutional(conv, (1, 1, 256, 128))
    conv = common.upsample(conv)

    conv = tf.concat([conv, route_1], axis=-1)

    conv = common.convolutional(conv, (1, 1, 384, 128))
    conv = common.convolutional(conv, (3, 3, 128, 256))
    conv = common.convolutional(conv, (1, 1, 256, 128))
    conv = common.convolutional(conv, (3, 3, 128, 256))
    conv = common.convolutional(conv, (1, 1, 256, 128))

    conv_sobj_branch = common.convolutional(conv, (3, 3, 128, 256))
    conv_sbbox = common.convolutional(conv_sobj_branch,
                                      (1, 1, 256, 3 * (NUM_CLASS + 5)),
                                      activate=False,
                                      bn=False)

    return [conv_sbbox, conv_mbbox, conv_lbbox]
예제 #20
0
    def __build_network(self, input_data):
        route_1, route_2, input_data = backbone.darknet53(
            input_data, self.trainable)

        # DBL * 5
        input_data = common.convolutional(input_data, (1, 1, 1024, 512),
                                          self.trainable, 'conv52')
        input_data = common.convolutional(input_data, (3, 3, 512, 1024),
                                          self.trainable, 'conv53')
        input_data = common.convolutional(input_data, (1, 1, 1024, 512),
                                          self.trainable, 'conv54')
        input_data = common.convolutional(input_data, (3, 3, 512, 1024),
                                          self.trainable, 'conv55')
        input_data = common.convolutional(input_data, (1, 1, 1024, 512),
                                          self.trainable, 'conv56')

        # Large, Route 3 in .images/yolo-arch1.png
        conv_lobj_branch = common.convolutional(input_data, (3, 3, 512, 1024),
                                                self.trainable,
                                                name='conv_lobj_branch')
        conv_lbbox = common.convolutional(
            conv_lobj_branch, (1, 1, 1024, 3 * (self.num_classes + 5)),
            trainable=self.trainable,
            name='conv_lbbox',
            activate=False,
            bn=False)
        # the last dimension of conv_lbbox is 3*(20+5), i.e anchor_per_scale * (num_classes + 5)

        input_data = common.convolutional(input_data, (1, 1, 512, 256),
                                          self.trainable, 'conv57')
        input_data = common.upsample(input_data,
                                     name='upsample0',
                                     method=self.upsample_method)  #resize

        with tf.variable_scope('route_1'):
            input_data = tf.concat([input_data, route_2], axis=-1)

        input_data = common.convolutional(input_data, (1, 1, 768, 256),
                                          self.trainable, 'conv58')
        input_data = common.convolutional(input_data, (3, 3, 256, 512),
                                          self.trainable, 'conv59')
        input_data = common.convolutional(input_data, (1, 1, 512, 256),
                                          self.trainable, 'conv60')
        input_data = common.convolutional(input_data, (3, 3, 256, 512),
                                          self.trainable, 'conv61')
        input_data = common.convolutional(input_data, (1, 1, 512, 256),
                                          self.trainable, 'conv62')

        conv_mobj_branch = common.convolutional(input_data, (3, 3, 256, 512),
                                                self.trainable,
                                                name='conv_mobj_branch')
        conv_mbbox = common.convolutional(
            conv_mobj_branch, (1, 1, 512, 3 * (self.num_classes + 5)),
            trainable=self.trainable,
            name='conv_mbbox',
            activate=False,
            bn=False)

        input_data = common.convolutional(input_data, (1, 1, 256, 128),
                                          self.trainable, 'conv63')
        input_data = common.upsample(input_data,
                                     name='upsample1',
                                     method=self.upsample_method)

        with tf.variable_scope('route_2'):
            input_data = tf.concat([input_data, route_1], axis=-1)

        input_data = common.convolutional(input_data, (1, 1, 384, 128),
                                          self.trainable, 'conv64')
        input_data = common.convolutional(input_data, (3, 3, 128, 256),
                                          self.trainable, 'conv65')
        input_data = common.convolutional(input_data, (1, 1, 256, 128),
                                          self.trainable, 'conv66')
        input_data = common.convolutional(input_data, (3, 3, 128, 256),
                                          self.trainable, 'conv67')
        input_data = common.convolutional(input_data, (1, 1, 256, 128),
                                          self.trainable, 'conv68')

        conv_sobj_branch = common.convolutional(input_data, (3, 3, 128, 256),
                                                self.trainable,
                                                name='conv_sobj_branch')
        conv_sbbox = common.convolutional(
            conv_sobj_branch, (1, 1, 256, 3 * (self.num_classes + 5)),
            trainable=self.trainable,
            name='conv_sbbox',
            activate=False,
            bn=False)
        return conv_lbbox, conv_mbbox, conv_sbbox