예제 #1
0
def ssd_net(inputs,
            num_classes=SSDNet.default_params.num_classes,
            feat_layers=SSDNet.default_params.feat_layers,
            anchor_sizes=SSDNet.default_params.anchor_sizes,
            anchor_ratios=SSDNet.default_params.anchor_ratios,
            normalizations=SSDNet.default_params.normalizations,
            is_training=True,
            dropout_keep_prob=0.5,
            prediction_fn=slim.softmax,
            reuse=None,
            scope='ssd_512_vgg'):
    """SSD net definition.
    """
    # End_points collect relevant activations for external use.
    end_points = {}
    with tf.variable_scope(scope, 'ssd_512_vgg', [inputs], reuse=reuse):
        # Original VGG-16 blocks.
        net = slim.repeat(inputs, 2, slim.conv2d, 64, [3, 3], scope='conv1')
        end_points['block1'] = net
        net = slim.max_pool2d(net, [2, 2], scope='pool1')
        # Block 2.
        net = slim.repeat(net, 2, slim.conv2d, 128, [3, 3], scope='conv2')
        end_points['block2'] = net
        net = slim.max_pool2d(net, [2, 2], scope='pool2')
        # Block 3.
        net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], scope='conv3')
        end_points['block3'] = net
        net = slim.max_pool2d(net, [2, 2], scope='pool3')
        # Block 4.
        net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv4')
        end_points['block4'] = net
        net = slim.max_pool2d(net, [2, 2], scope='pool4')
        # Block 5.
        net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv5')
        end_points['block5'] = net
        net = slim.max_pool2d(net, [3, 3], 1, scope='pool5')

        # Additional SSD blocks.
        # Block 6: let's dilate the hell out of it!
        net = slim.conv2d(net, 1024, [3, 3], rate=6, scope='conv6')
        end_points['block6'] = net
        # Block 7: 1x1 conv. Because the f**k.
        net = slim.conv2d(net, 1024, [1, 1], scope='conv7')
        end_points['block7'] = net

        # Block 8/9/10/11: 1x1 and 3x3 convolutions stride 2 (except lasts).
        end_point = 'block8'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 256, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net,
                              512, [3, 3],
                              stride=2,
                              scope='conv3x3',
                              padding='VALID')
        end_points[end_point] = net
        end_point = 'block9'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 128, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net,
                              256, [3, 3],
                              stride=2,
                              scope='conv3x3',
                              padding='VALID')
        end_points[end_point] = net
        end_point = 'block10'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 128, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net,
                              256, [3, 3],
                              stride=2,
                              scope='conv3x3',
                              padding='VALID')
        end_points[end_point] = net
        end_point = 'block11'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 128, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net,
                              256, [3, 3],
                              stride=2,
                              scope='conv3x3',
                              padding='VALID')
        end_points[end_point] = net
        end_point = 'block12'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 128, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net,
                              256, [4, 4],
                              scope='conv4x4',
                              padding='VALID')
            # Fix padding to match Caffe version (pad=1).
            # pad_shape = [(i-j) for i, j in zip(layer_shape(net), [0, 1, 1, 0])]
            # net = tf.slice(net, [0, 0, 0, 0], pad_shape, name='caffe_pad')
        end_points[end_point] = net

        # Prediction and localisations layers.
        predictions = []
        logits = []
        localisations = []
        for i, layer in enumerate(feat_layers):
            with tf.variable_scope(layer + '_box'):
                p, l = ssd_vgg_300.ssd_multibox_layer(end_points[layer],
                                                      num_classes,
                                                      anchor_sizes[i],
                                                      anchor_ratios[i],
                                                      normalizations[i])
            predictions.append(prediction_fn(p))
            logits.append(p)
            localisations.append(l)

        return predictions, localisations, logits, end_points
예제 #2
0
def ssd_net(inputs,
            num_classes=SSDNet.default_params.num_classes,
            feat_layers=SSDNet.default_params.feat_layers,
            anchor_sizes=SSDNet.default_params.anchor_sizes,
            anchor_ratios=SSDNet.default_params.anchor_ratios,
            normalizations=SSDNet.default_params.normalizations,
            is_training=True,
            dropout_keep_prob=0.5,
            prediction_fn=slim.softmax,
            reuse=None,
            scope='ssd_512_vgg'):
    """SSD net definition.
    """
    # End_points collect relevant activations for external use.
    end_points = {}
    with tf.variable_scope(scope, 'ssd_512_vgg', [inputs], reuse=reuse):
        # Original VGG-16 blocks.
        net = slim.repeat(inputs, 2, slim.conv2d, 64, [3, 3], scope='conv1')
        end_points['block1'] = net
        net = slim.max_pool2d(net, [2, 2], scope='pool1')
        # Block 2.
        net = slim.repeat(net, 2, slim.conv2d, 128, [3, 3], scope='conv2')
        end_points['block2'] = net
        net = slim.max_pool2d(net, [2, 2], scope='pool2')
        # Block 3.
        net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], scope='conv3')
        end_points['block3'] = net
        net = slim.max_pool2d(net, [2, 2], scope='pool3')
        # Block 4.
        net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv4')
        end_points['block4'] = net
        net = slim.max_pool2d(net, [2, 2], scope='pool4')
        # Block 5.
        net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv5')
        end_points['block5'] = net
        net = slim.max_pool2d(net, [3, 3], 1, scope='pool5')

        # Additional SSD blocks.
        # Block 6: let's dilate the hell out of it!
        net = slim.conv2d(net, 1024, [3, 3], rate=6, scope='conv6')
        end_points['block6'] = net
        # Block 7: 1x1 conv. Because the f**k.
        net = slim.conv2d(net, 1024, [1, 1], scope='conv7')
        end_points['block7'] = net

        # Block 8/9/10/11: 1x1 and 3x3 convolutions stride 2 (except lasts).
        end_point = 'block8'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 256, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net, 512, [3, 3], stride=2, scope='conv3x3', padding='VALID')
        end_points[end_point] = net
        end_point = 'block9'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 128, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net, 256, [3, 3], stride=2, scope='conv3x3', padding='VALID')
        end_points[end_point] = net
        end_point = 'block10'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 128, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net, 256, [3, 3], stride=2, scope='conv3x3', padding='VALID')
        end_points[end_point] = net
        end_point = 'block11'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 128, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net, 256, [3, 3], stride=2, scope='conv3x3', padding='VALID')
        end_points[end_point] = net
        end_point = 'block12'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 128, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net, 256, [4, 4], scope='conv4x4', padding='VALID')
            # Fix padding to match Caffe version (pad=1).
            # pad_shape = [(i-j) for i, j in zip(layer_shape(net), [0, 1, 1, 0])]
            # net = tf.slice(net, [0, 0, 0, 0], pad_shape, name='caffe_pad')
        end_points[end_point] = net

        # Prediction and localisations layers.
        predictions = []
        logits = []
        localisations = []
        for i, layer in enumerate(feat_layers):
            with tf.variable_scope(layer + '_box'):
                p, l = ssd_vgg_300.ssd_multibox_layer(end_points[layer],
                                                      num_classes,
                                                      anchor_sizes[i],
                                                      anchor_ratios[i],
                                                      normalizations[i])
            predictions.append(prediction_fn(p))
            logits.append(p)
            localisations.append(l)

        return predictions, localisations, logits, end_points
예제 #3
0
def ssd_net(inputs,
            num_classes=SSDNet.default_params.num_classes,
            feat_layers=SSDNet.default_params.feat_layers,
            anchor_sizes=SSDNet.default_params.anchor_sizes,
            anchor_ratios=SSDNet.default_params.anchor_ratios,
            normalizations=SSDNet.default_params.normalizations,
            is_training=True,
            dropout_keep_prob=0.5,
            prediction_fn=slim.softmax,
            reuse=None,
            scope='ssd_512_vgg',
            DSSD_FLAG=False):
    """SSD net definition.
    """
    # End_points collect relevant activations for external use.
    end_points = {}
    if inputs.shape[2] == inputs.shape[3]:
        mode = 'bnwh'
    else:
        mode = 'bwhn'
    with tf.variable_scope(scope, 'ssd_512_vgg', [inputs], reuse=reuse):
        # Original VGG-16 blocks.
        net = slim.repeat(inputs, 2, slim.conv2d, 64, [3, 3], scope='conv1')
        end_points['block1'] = net
        net = slim.max_pool2d(net, [2, 2], scope='pool1')
        # Block 2.
        net = slim.repeat(net, 2, slim.conv2d, 128, [3, 3], scope='conv2')
        end_points['block2'] = net
        net = slim.max_pool2d(net, [2, 2], scope='pool2')
        # Block 3.
        net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], scope='conv3')
        end_points['block3'] = net
        net = slim.max_pool2d(net, [2, 2], scope='pool3')
        # Block 4.
        net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv4')
        end_points['block4'] = net
        net = slim.max_pool2d(net, [2, 2], scope='pool4')
        # Block 5.
        net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv5')
        end_points['block5'] = net
        net = slim.max_pool2d(net, [3, 3], 1, scope='pool5')

        # Additional SSD blocks.
        # Block 6: let's dilate the hell out of it!
        net = slim.conv2d(net, 1024, [3, 3], rate=6, scope='conv6')
        end_points['block6'] = net
        # Block 7: 1x1 conv. Because the f**k.
        net = slim.conv2d(net, 1024, [1, 1], scope='conv7')
        end_points['block7'] = net

        # Block 8/9/10/11: 1x1 and 3x3 convolutions stride 2 (except lasts).
        end_point = 'block8'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 256, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net,
                              512, [3, 3],
                              stride=2,
                              scope='conv3x3',
                              padding='VALID')
        end_points[end_point] = net
        end_point = 'block9'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 128, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net,
                              256, [3, 3],
                              stride=2,
                              scope='conv3x3',
                              padding='VALID')
        end_points[end_point] = net
        end_point = 'block10'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 128, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net,
                              256, [3, 3],
                              stride=2,
                              scope='conv3x3',
                              padding='VALID')
        end_points[end_point] = net
        end_point = 'block11'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 128, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net,
                              256, [3, 3],
                              stride=2,
                              scope='conv3x3',
                              padding='VALID')
        end_points[end_point] = net
        end_point = 'block12'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 128, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net,
                              256, [4, 4],
                              scope='conv4x4',
                              padding='VALID')
            # Fix padding to match Caffe version (pad=1).
            # pad_shape = [(i-j) for i, j in zip(layer_shape(net), [0, 1, 1, 0])]
            # net = tf.slice(net, [0, 0, 0, 0], pad_shape, name='caffe_pad')
        end_points[end_point] = net

        # Prediction and localisations layers.
        # rever_feat_layers = list(reversed(feat_layers))
        # for i, l in enumerate(rever_feat_layers):
        #     if i == 0: continue
        #     l_ = rever_feat_layers[i - 1]
        #
        #     end_points[l] = tf.concat([upbilinear([end_points[l_], end_points[l]], name=l_), end_points[l]],axis=1)

        # with tf.variable_scope("fpn11"):
        #
        #
        #     end_points['block11'] = tf.add(upbilinear([end_points['block12'], end_points['block11']],name ="up_11",mode=mode),
        #                                    end_points['block11'],name= "fpn_block11")
        #
        # with tf.variable_scope("fpn10"):
        #
        #     end_points['block10'] = tf.add(upbilinear([end_points['block11'],end_points['block10']],name ="up_10",mode=mode),
        #                                    end_points['block10'],
        #                                    name="fpn_block10")
        # with tf.variable_scope("fpn9"):
        #     b9 = slim.conv2d(end_points['block10'], 256, [1, 1], scope='9conv1x1')
        #     b9_ = slim.conv2d(end_points['block9'], 256, [1, 1], scope='9_conv1x1')
        #     end_points['block9'] = tf.add(upbilinear([end_points['block10'],end_points['block9']],name ="up_9",mode=mode),
        #                                   end_points['block9'],
        #                                    name="fpn_block9")
        # with tf.variable_scope("fpn8"):
        #     b8 = slim.conv2d(end_points['block9'], 512, [1, 1], scope='8conv1x1')
        #
        #     end_points['block8'] = tf.add(upbilinear([b8, end_points['block8']],name ="up_8",mode=mode), end_points['block8'],
        #                                    name="fpn_block8")
        # with tf.variable_scope("fpn7"):
        #     b7 = slim.conv2d(end_points['block8'], 1024, [1, 1], scope='7conv1x1')
        #
        #     end_points['block7'] = tf.add(upbilinear([b7, end_points['block7']],name ="up_7",mode=mode), end_points['block7'],
        #                                   name="fpn_block7")
        # with tf.variable_scope("fpn4"):
        #     b4 = slim.conv2d(end_points['block7'], 512, [1, 1], scope='4conv1x1')
        #
        #     end_points['block4'] = tf.add(upbilinear([b4, end_points['block4']],name ="up_4",mode=mode), end_points['block4'],
        #                                   name="fpn_block4")

        if DSSD_FLAG:
            with tf.variable_scope("dssd11"):

                de_12 = slim.conv2d_transpose(end_points['block12'],
                                              512, [3, 3],
                                              stride=2,
                                              scope="de_12")
                con_12 = slim.conv2d(de_12, 512, [3, 3], scope='conv_12')
                bn_12 = slim.batch_norm(con_12, is_training=is_training)

                con_11 = slim.conv2d(end_points["block11"],
                                     512, [3, 3],
                                     scope="conv11")
                bn_11 = slim.batch_norm(con_11, is_training=is_training)
                relu_11 = tf.nn.relu(bn_11)
                con_11 = slim.conv2d(relu_11, 512, [3, 3], scope="conv11_2")
                bn_11 = slim.batch_norm(con_11, is_training=is_training)

                end_points["block11"] = tf.nn.relu(tf.multiply(bn_12, bn_11))

            with tf.variable_scope("dssd10"):

                de_11 = slim.conv2d_transpose(end_points['block11'],
                                              512, [3, 3],
                                              stride=2,
                                              scope="de_11")
                con_11 = slim.conv2d(de_11, 512, [3, 3], scope='conv_11')
                bn_11 = slim.batch_norm(con_11, is_training=is_training)

                con_10 = slim.conv2d(end_points["block10"],
                                     512, [3, 3],
                                     scope="conv10")
                bn_10 = slim.batch_norm(con_10, is_training=is_training)
                relu_10 = tf.nn.relu(bn_10)
                con_10 = slim.conv2d(relu_10, 512, [3, 3], scope="conv10_2")
                bn_10 = slim.batch_norm(con_10, is_training=is_training)

                end_points["block10"] = tf.nn.relu(tf.multiply(bn_11, bn_10))

            with tf.variable_scope("dssd9"):

                de_10 = slim.conv2d_transpose(end_points['block10'],
                                              512, [3, 3],
                                              stride=2,
                                              scope="de_10")
                con_10 = slim.conv2d(de_10, 512, [3, 3], scope='conv_10')
                bn_10 = slim.batch_norm(con_10, is_training=is_training)

                con_9 = slim.conv2d(end_points["block9"],
                                    512, [3, 3],
                                    scope="conv9")
                bn_9 = slim.batch_norm(con_9, is_training=is_training)
                relu_9 = tf.nn.relu(bn_9)
                con_9 = slim.conv2d(relu_9, 512, [3, 3], scope="conv9_2")
                bn_9 = slim.batch_norm(con_9, is_training=is_training)

                end_points["block9"] = tf.nn.relu(tf.multiply(bn_10, bn_9))

            with tf.variable_scope("dssd8"):

                de_9 = slim.conv2d_transpose(end_points['block9'],
                                             512, [3, 3],
                                             stride=2,
                                             scope="de_9")
                con_9 = slim.conv2d(de_9, 512, [3, 3], scope='conv_9')
                bn_9 = slim.batch_norm(con_9, is_training=is_training)

                con_8 = slim.conv2d(end_points["block8"],
                                    512, [3, 3],
                                    scope="conv8")
                bn_8 = slim.batch_norm(con_8, is_training=is_training)
                relu_8 = tf.nn.relu(bn_8)
                con_8 = slim.conv2d(relu_8, 512, [3, 3], scope="conv8_2")
                bn_8 = slim.batch_norm(con_8, is_training=is_training)

                end_points["block8"] = tf.nn.relu(tf.multiply(bn_9, bn_8))

            with tf.variable_scope("dssd7"):

                de_8 = slim.conv2d_transpose(end_points['block8'],
                                             512, [3, 3],
                                             stride=2,
                                             scope="de_8")
                con_8 = slim.conv2d(de_8, 512, [3, 3], scope='conv_8')
                bn_8 = slim.batch_norm(con_8, is_training=is_training)

                con_7 = slim.conv2d(end_points["block7"],
                                    512, [3, 3],
                                    scope="conv7")
                bn_7 = slim.batch_norm(con_7, is_training=is_training)
                relu_7 = tf.nn.relu(bn_7)
                con_7 = slim.conv2d(relu_7, 512, [3, 3], scope="conv7_2")
                bn_7 = slim.batch_norm(con_7, is_training=is_training)

                end_points["block7"] = tf.nn.relu(tf.multiply(bn_8, bn_7))

            with tf.variable_scope("dssd4"):

                de_7 = slim.conv2d_transpose(end_points['block7'],
                                             512, [3, 3],
                                             stride=2,
                                             scope="de_7")
                con_7 = slim.conv2d(de_7, 512, [3, 3], scope='conv_7')
                bn_7 = slim.batch_norm(con_7, is_training=is_training)

                con_4 = slim.conv2d(end_points["block4"],
                                    512, [3, 3],
                                    scope="conv4")
                bn_4 = slim.batch_norm(con_4, is_training=is_training)
                relu_4 = tf.nn.relu(bn_4)
                con_4 = slim.conv2d(relu_4, 512, [3, 3], scope="conv4_2")
                bn_4 = slim.batch_norm(con_4, is_training=is_training)

                end_points["block4"] = tf.nn.relu(tf.multiply(bn_7, bn_4))

        #
        predictions = []
        logits = []
        localisations = []
        for i, layer in enumerate(feat_layers):
            with tf.variable_scope(layer + '_box'):
                p, l = ssd_vgg_300.ssd_multibox_layer(end_points[layer],
                                                      num_classes,
                                                      anchor_sizes[i],
                                                      anchor_ratios[i],
                                                      normalizations[i])
            predictions.append(prediction_fn(p))
            logits.append(p)
            localisations.append(l)

        return predictions, localisations, logits, end_points
예제 #4
0
파일: ssd_vgg_512.py 프로젝트: lolzdb/dl
def ssd_net(inputs,
            num_classes=SSDNet.default_params.num_classes,
            feat_layers=SSDNet.default_params.feat_layers,
            anchor_sizes=SSDNet.default_params.anchor_sizes,
            anchor_ratios=SSDNet.default_params.anchor_ratios,
            normalizations=SSDNet.default_params.normalizations,
            is_training=True,
            dropout_keep_prob=0.5,
            prediction_fn=slim.softmax,
            reuse=None,
            scope='ssd_512_vgg'):
    """SSD net definition.
    """
    # End_points collect relevant activations for external use.
    end_points = {}
    with tf.variable_scope(scope, 'ssd_512_vgg', [inputs], reuse=reuse):
        # Original VGG-16 blocks.
        print(inputs.shape)
        #inputs = tf.transpose(inputs, [0,2,3,1])
        with tf.variable_scope("RseNet50"):
            with tf.variable_scope("RseNet50"):
                net = slim.conv2d(inputs,
                                  64, [3, 3],
                                  activation_fn=tf.nn.selu,
                                  stride=2,
                                  data_format=data_format)  # 256
                print(net.shape)
                end_points['block0'] = net
                print('block0')
                net = unit_neck(net, [32, 32, 32], 'block1', False)
                end_points['block1'] = net
                print('block1')
                net = block(net, [[96, 96, 48], [144, 144, 48]], 2,
                            'block1')  # 128
                end_points['block2'] = net
                print('block2')
                net = block(net, [[144, 144, 64], [192, 192, 64]], 3,
                            'block2')  # 64
                end_points['block3'] = net
                print('block3')
                net = block(net, [[144, 144, 64], [192, 192, 64]], 3,
                            'block3')  # 32
                end_points['block4'] = net
                print('block4')
                net = block(net, [[192, 192, 128], [384, 384, 128]], 4,
                            'block4')  # 16
                end_points['block5'] = net
                print('block5')
                net = block(net, [[384, 384, 192], [576, 576, 192]],
                            3,
                            'block5',
                            stride=1)
                net = block(net, [[576, 576, 320], [960, 960, 320]], 3,
                            'block6')  # 8
                end_points['block6'] = net
                print('block6')
                net = block(net, [[576, 576, 320], [960, 960, 320]], 3,
                            'block7')  # 4
                end_points['block7'] = net
            end_point = 'Fblock6'
            with tf.variable_scope(end_point):
                p = slim.conv2d_transpose(net,
                                          256, [3, 3],
                                          stride=2,
                                          activation_fn=tf.nn.selu,
                                          data_format=data_format)
                c = slim.conv2d(end_points['block6'],
                                256, [3, 3],
                                activation_fn=tf.nn.selu,
                                data_format=data_format)
                print(p.shape, c.shape)
                f = tf.concat([p, c], axis=funsion_axis)
                net = slim.conv2d(f,
                                  256, [1, 1],
                                  scope='F6conv1x1',
                                  activation_fn=tf.nn.selu,
                                  data_format=data_format)
                print(net.shape)
            end_points[end_point] = net
            end_point = 'Fblock5'
            with tf.variable_scope(end_point):
                p = slim.conv2d_transpose(net,
                                          256, [3, 3],
                                          stride=2,
                                          activation_fn=tf.nn.selu,
                                          data_format=data_format)
                c = slim.conv2d(end_points['block5'],
                                256, [3, 3],
                                activation_fn=tf.nn.selu,
                                data_format=data_format)
                print(p.shape, c.shape)
                f = tf.concat([p, c], axis=funsion_axis)
                net = slim.conv2d(f,
                                  256, [1, 1],
                                  scope='F5conv1x1',
                                  activation_fn=tf.nn.selu,
                                  data_format=data_format)
                print(net.shape)
            end_points[end_point] = net
            end_point = 'Fblock4'
            with tf.variable_scope(end_point):
                p = slim.conv2d_transpose(net,
                                          256, [3, 3],
                                          stride=2,
                                          activation_fn=tf.nn.selu,
                                          data_format=data_format)
                c = slim.conv2d(end_points['block4'],
                                256, [3, 3],
                                activation_fn=tf.nn.selu,
                                data_format=data_format)
                print(p.shape, c.shape)
                f = tf.concat([p, c], axis=funsion_axis)
                net = slim.conv2d(f,
                                  256, [1, 1],
                                  scope='F4conv1x1',
                                  activation_fn=tf.nn.selu,
                                  data_format=data_format)
                print(net.shape)
            end_points[end_point] = net
            end_point = 'Fblock3'
            with tf.variable_scope(end_point):
                p = slim.conv2d_transpose(net,
                                          256, [3, 3],
                                          stride=2,
                                          activation_fn=tf.nn.selu,
                                          data_format=data_format)
                c = slim.conv2d(end_points['block3'],
                                256, [3, 3],
                                activation_fn=tf.nn.selu,
                                data_format=data_format)
                print(p.shape, c.shape)
                f = tf.concat([p, c], axis=funsion_axis)
                net = slim.conv2d(f,
                                  256, [1, 1],
                                  scope='F3conv1x1',
                                  activation_fn=tf.nn.selu,
                                  data_format=data_format)
                print(net.shape)
            end_points[end_point] = net
        predictions = []
        logits = []
        localisations = []
        for i, layer in enumerate(feat_layers):
            with tf.variable_scope(layer + '_box'):
                p, l = ssd_vgg_300.ssd_multibox_layer(end_points[layer],
                                                      num_classes,
                                                      anchor_sizes[i],
                                                      anchor_ratios[i],
                                                      normalizations[i])
            predictions.append(prediction_fn(p))
            logits.append(p)
            localisations.append(l)

        return predictions, localisations, logits, end_points
def ssd_net(inputs,
            num_classes=SSDNet.default_params.num_classes,
            feat_layers=SSDNet.default_params.feat_layers,
            anchor_sizes=SSDNet.default_params.anchor_sizes,
            anchor_ratios=SSDNet.default_params.anchor_ratios,
            normalizations=SSDNet.default_params.normalizations,
            is_training=True,
            dropout_keep_prob=0.5,
            prediction_fn=slim.softmax,
            reuse=None,
            scope='ssd_512_vgg'):
    """SSD net definition.
    """

    # End_points collect relevant activations for external use.
    end_points = {}
    with tf.variable_scope(scope, 'ssd_512_vgg', [inputs], reuse=reuse):
        # Original VGG-16 blocks.
        net = slim.repeat(inputs, 2, slim.conv2d, 64, [3, 3], scope='conv1')
        end_points['block1'] = net
        # print("====net.shape = {}".format(net))
        net = slim.max_pool2d(net, [2, 2], scope='pool1')
        # Block 2.
        net = slim.repeat(net, 2, slim.conv2d, 128, [3, 3], scope='conv2')
        end_points['block2'] = net
        net = slim.max_pool2d(net, [2, 2], scope='pool2')
        # Block 3.txt.
        net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], scope='conv3')
        end_points['block3'] = net
        net = slim.max_pool2d(net, [2, 2], scope='pool3')
        # Block 4.
        net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv4')
        end_points['block4'] = net
        net = slim.max_pool2d(net, [2, 2], scope='pool4')
        # Block 5.
        net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv5')
        end_points['block5'] = net
        net = slim.max_pool2d(net, [3, 3], 1, scope='pool5')

        # Additional SSD blocks.
        # Block 6: let's dilate the hell out of it!
        net = slim.conv2d(net, 1024, [3, 3], rate=6, scope='conv6')
        end_points['block6'] = net
        # Block 7: 1x1 conv. Because the f**k.
        net = slim.conv2d(net, 1024, [1, 1], scope='conv7')
        end_points['block7'] = net
        if IS_FPN:
            stride_b8_to_b12 = 1
        else:
            stride_b8_to_b12 = 2
        # Block 8/9/10/11: 1x1 and 3x3 convolutions stride 2 (except lasts).
        end_point = 'block8'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 256, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net,
                              512, [3, 3],
                              stride=2,
                              scope='conv3x3',
                              padding='VALID')
        end_points[end_point] = net

        end_point = 'block9'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 128, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net,
                              256, [3, 3],
                              stride=stride_b8_to_b12,
                              scope='conv3x3',
                              padding='VALID')
        end_points[end_point] = net
        end_point = 'block10'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 128, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net,
                              256, [3, 3],
                              stride=stride_b8_to_b12,
                              scope='conv3x3',
                              padding='VALID')
        end_points[end_point] = net
        end_point = 'block11'
        with tf.variable_scope(end_point):
            net = slim.conv2d(net, 128, [1, 1], scope='conv1x1')
            net = custom_layers.pad2d(net, pad=(1, 1))
            net = slim.conv2d(net,
                              256, [3, 3],
                              stride=stride_b8_to_b12,
                              scope='conv3x3',
                              padding='VALID')
        end_points[end_point] = net

        end_point = 'concat'
        with tf.variable_scope(end_point):
            high_feature_list = []
            for i in range(9, 12):
                high_feature_list.append(end_points['block' + str(i)])
            high_feature = tf.concat(high_feature_list, 1)
            end_points[end_point] = high_feature

        end_point = 'block4_concat'
        with tf.variable_scope(end_point):
            net_block4 = slim.conv2d(end_points['concat'],
                                     128, [1, 1],
                                     scope='conv1x1')
            # print("net_block4 ========{}".format(net_block4))
            net_block4 = tf.layers.conv2d_transpose(
                net_block4,
                512,
                kernel_size=3,
                strides=(4, 4),
                data_format='channels_first')
            # print("net_block4 ========{}".format(net_block4))
            end_points['block4'] += net_block4

        end_point = 'block7_concat'
        with tf.variable_scope(end_point):
            net_block7 = slim.conv2d(end_points['concat'],
                                     128, [1, 1],
                                     scope='conv1x1')
            # print("net_block4 ========{}".format(net_block4))
            net_block7 = tf.layers.conv2d_transpose(
                net_block7,
                1024,
                kernel_size=1,
                strides=(2, 2),
                data_format='channels_first')
            # print("net_block4 ========{}".format(net_block4))
            end_points['block7'] += net_block7

        end_point = 'block8_concat'
        with tf.variable_scope(end_point):
            net_block8 = slim.conv2d(end_points['concat'],
                                     512, [1, 1],
                                     scope='conv1x1')
            end_points['block8'] += net_block8
        # with tf.variable_scope(end_point):

        # print("=debug===========high_feature = {}".format(high_feature))

        # for i in range(1,12):
        # print("=debug===== "+str(i)+"  = {}".format(end_points['block'+str(i)]))
        # Prediction and localisations layers.
        predictions_pest = []
        logits_pest = []
        predictions = []
        logits = []
        localisations = []
        for i, layer in enumerate(feat_layers):
            with tf.variable_scope(layer + '_box'):
                # print("=debug===== "+str(i)+"  = {}".format(end_points[layer]))
                # 这里获取每一个anchor的预测值
                pest, p, l = ssd_vgg_300.ssd_multibox_layer(
                    end_points[layer], num_classes, anchor_sizes[i],
                    anchor_ratios[i], normalizations[i])
            predictions_pest.append(prediction_fn(pest))
            logits_pest.append(pest)

            predictions.append(prediction_fn(p))
            logits.append(p)
            localisations.append(l)

        return predictions_pest, logits_pest, predictions, localisations, logits, end_points