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
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
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
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)
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]
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
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
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
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)
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
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
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
def build_backbone(self): return backbone.darknet53(self.trainable, self.darknet_gn, self.precision)
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
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
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
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]
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