美文网首页
tensorflow

tensorflow

作者: dario_hit | 来源:发表于2020-10-09 20:39 被阅读0次

    FLAGS.train_image_size = 300

            out_shape = [FLAGS.train_image_size] * 2

            anchor_creator = anchor_manipulator.AnchorCreator(out_shape,

                                                        layers_shapes = ,

                                                        anchor_scales = [(0.1,), (0.2,), (0.375,), (0.55,), (0.725,), (0.9,)],

                                                        extra_anchor_scales = ,

                                                        anchor_ratios = ,

                                                        layer_steps = )

    class AnchorCreator(object):

        def __init__(self, img_shape, layers_shapes, anchor_scales, extra_anchor_scales, anchor_ratios, layer_steps):

            super(AnchorCreator, self).__init__()

            # img_shape -> (height, width)

            self._img_shape = img_shape

            self._layers_shapes = layers_shapes

            self._anchor_scales = anchor_scales

            self._extra_anchor_scales = extra_anchor_scales

            self._anchor_ratios = anchor_ratios

            self._layer_steps = layer_steps

            self._anchor_offset = [0.5] * len(self._layers_shapes)

    【入参】:

    # img_shape: 原始图形尺寸

    self._img_shape = [300, 300]

    # layers_shapes:输出层特征图尺寸大小

    self._layers_shapes = [(38, 38), (19, 19), (10, 10), (5, 5), (3, 3), (1, 1)]

    # anchor_scales: 各层锚框的尺度缩小因子

    self._anchor_scales = [(0.1,), (0.2,), (0.375,), (0.55,), (0.725,), (0.9,)]

    # extra_anchor_scales: 每层方框的额外尺度缩小因子

    self._extra_anchor_scales = [(0.1414,), (0.2739,), (0.4541,), (0.6315,), (0.8078,), (0.9836,)]

    # anchor_ratios: 每层锚框的宽高比

    self._anchor_ratios = [(1., 2., .5), (1., 2., 3., .5, 0.3333), (1., 2., 3., .5, 0.3333), (1., 2., 3., .5, 0.3333), (1., 2., .5), (1., 2., .5)]

    # layer_steps:原图与输出层特征图的尺寸比例

    self._layer_steps = [8, 16, 32, 64, 100, 300]

    # anchor_offset:锚框的起点偏移

    self._anchor_offset = [0.5]*6

    【出参】:

    all_anchors

    all_num_anchors_depth

    all_num_anchors_spatial

    出参初始化

    all_anchors = []

    all_num_anchors_depth = []

    all_num_anchors_spatial = []

    【计算过程】:

            for layer_index, layer_shape in enumerate(self._layers_shapes):

                anchors_this_layer = self.get_layer_anchors(layer_shape,

                                                            self._anchor_scales[layer_index],

                                                            self._extra_anchor_scales[layer_index],

                                                            self._anchor_ratios[layer_index],

                                                            self._layer_steps[layer_index],

                                                            self._anchor_offset[layer_index])

                all_anchors.append(anchors_this_layer[:-2])

                all_num_anchors_depth.append(anchors_this_layer[-2])

                all_num_anchors_spatial.append(anchors_this_layer[-1])

    以第一层为例:

    [参数列表]

    layer_shape = [38,38]

    layer_index = 0

    anchor_scale = (0.1,)

    extra_anchor_scale = (0.1414,)

    anchor_ratio = (1., 2., .5)

    layer_step = 8

    offset = 0.5

    def get_layer_anchors(self, layer_shape, anchor_scale, extra_anchor_scale, anchor_ratio, layer_step, offset = 0.5):

      with tf.name_scope('get_layer_anchors'):

    # x_on_layer, y_on_layer = tf.meshgrid(tf.range(38), tf.range(38))

                x_on_layer, y_on_layer = tf.meshgrid(tf.range(layer_shape[1]), tf.range(layer_shape[0]))

                y_on_image = (tf.cast(y_on_layer, tf.float32) + offset) * layer_step / self._img_shape[0]

                x_on_image = (tf.cast(x_on_layer, tf.float32) + offset) * layer_step / self._img_shape[1]

                num_anchors_along_depth = len(anchor_scale) * len(anchor_ratio) + len(extra_anchor_scale)

                num_anchors_along_spatial = layer_shape[1] * layer_shape[0]

                list_h_on_image = []

                list_w_on_image = []

                global_index = 0

                # for square anchors

                for _, scale in enumerate(extra_anchor_scale):

                    list_h_on_image.append(scale)

                    list_w_on_image.append(scale)

                    global_index += 1

                # for other aspect ratio anchors

                for scale_index, scale in enumerate(anchor_scale):

                    for ratio_index, ratio in enumerate(anchor_ratio):

                        list_h_on_image.append(scale / math.sqrt(ratio))

                        list_w_on_image.append(scale * math.sqrt(ratio))

                        global_index += 1

                # shape info:

                # y_on_image, x_on_image: layers_shapes[0] * layers_shapes[1]

                # h_on_image, w_on_image: num_anchors_along_depth

                return tf.expand_dims(y_on_image, axis=-1), tf.expand_dims(x_on_image, axis=-1), \

                        tf.constant(list_h_on_image, dtype=tf.float32), \

                        tf.constant(list_w_on_image, dtype=tf.float32), num_anchors_along_depth, num_anchors_along_spatial

    -------------------------------------------------------------------

    将入参代入后:

      with tf.name_scope('get_layer_anchors'):

    x_on_layer, y_on_layer = tf.meshgrid(tf.range(38), tf.range(38))

    # x_on_layer = [

    #  [0,1,2,...,37],

    #  [0,1,2,...,37],

    #  ...

    #  [0,1,2,...,37],

    # ]

    # x_on_layer 共38行

    #

    # y_on_layer = [

    #  [0,0,0,...,0],

    #  [1,1,1,...,1],

    #  ...

    #  [37,37,37,...,37],

    # ]

    # x_on_layer 共38列

    #

    y_on_image = (tf.cast(y_on_layer, tf.float32) + offset) * layer_step / self._img_shape[0]

                x_on_image = (tf.cast(x_on_layer, tf.float32) + offset) * layer_step / self._img_shape[1]

    # tf.cast(y_on_layer, tf.float32) 该步骤是将坐标转为float类型,方便计算

    # (tf.cast(y_on_layer, tf.float32) + offset) * layer_step 该步骤是计算映射回原图后的坐标

    # / self._img_shape[0]  该步骤是将坐标归一化

    num_anchors_along_depth = len(anchor_scale) * len(anchor_ratio) + len(extra_anchor_scale)

                num_anchors_along_spatial = layer_shape[1] * layer_shape[0]

    # num_anchors_along_depth = 4

    # num_anchors_along_spatial = 38*38 = 1524

    list_h_on_image = []

                list_w_on_image = []

                global_index = 0

                # for square anchors

    # extra_anchor_scale = (0.1414,)

                for _, scale in enumerate(extra_anchor_scale):

                    list_h_on_image.append(scale)

                    list_w_on_image.append(scale)

                    global_index += 1

    # list_h_on_image = [0.1414]

    # list_w_on_image = [0.1414]

    # global_index = 1

                # for other aspect ratio anchors

    # anchor_scale = (0.1,)

    # anchor_ratio = (1., 2., .5)

                for scale_index, scale in enumerate(anchor_scale):

                    for ratio_index, ratio in enumerate(anchor_ratio):

                        list_h_on_image.append(scale / math.sqrt(ratio)) # 0.1/sqrt(1)

                        list_w_on_image.append(scale * math.sqrt(ratio))

                        global_index += 1

    # list_h_on_image = [0.1414, 0.1, 0.0707, x, x]

    # list_w_on_image = [0.1414, y, y, y, y]

    # global_index = 4

                # shape info:

                # y_on_image, x_on_image: layers_shapes[0] * layers_shapes[1]

                # h_on_image, w_on_image: num_anchors_along_depth

                return tf.expand_dims(y_on_image, axis=-1), tf.expand_dims(x_on_image, axis=-1), \

                        tf.constant(list_h_on_image, dtype=tf.float32), \

                        tf.constant(list_w_on_image, dtype=tf.float32), num_anchors_along_depth, num_anchors_along_spatial

    # x_on_layer = [

    #  [0,1,2,...,37],

    #  [0,1,2,...,37],

    #  ...

    #  [0,1,2,...,37],

    # ]

    # x_on_layer 共38行

    #

    # y_on_layer = [

    #  [0,0,0,...,0],

    #  [1,1,1,...,1],

    #  ...

    #  [37,37,37,...,37],

    # ]

    x_on_layer.shape = (38,38)

    y_on_layer.shape = (38,38)

    tf.expand_dims(y_on_image, axis=-1).shape = (38,38,1)

    tf.expand_dims(x_on_image, axis=-1).shape = (38,38,1)

    list_h_on_image = [0.1414, 0.1, 0.0707, x, x]

    list_w_on_image = [0.1414, y, y, y, y]

    num_anchors_along_depth = 4

    num_anchors_along_spatial = 38*38 = 1444

    anchors_this_layer = tf.expand_dims(y_on_image, axis=-1),

    tf.expand_dims(x_on_image, axis=-1),

    list_h_on_image,

    list_w_on_image,

    num_anchors_along_depth,

    num_anchors_along_spatial

    -------------------------------------------------------------------

    all_anchors.append(anchors_this_layer[:-2]) = [six elements]

    elment = (expand_dim_y_on_image(38,38,1),

      expand_dim_x_on_image(38,38,1),

      list_h_on_image(4,),

      list_h_on_image(4,))

    all_num_anchors_depth.append(anchors_this_layer[-2]) = [six elements]

    elment = 4

    all_num_anchors_spatial.append(anchors_this_layer[-1]) = [six elements]

    elment = feature map size.

    第二段

    【参数】:

    all_anchors.append(anchors_this_layer[:-2]) = [six elements]

    elment = (expand_dim_y_on_image(38,38,1),

      expand_dim_x_on_image(38,38,1),

      list_h_on_image(4,),

      list_h_on_image(4,))

    all_num_anchors_depth.append(anchors_this_layer[-2]) = [six elements]

    elment = 4

    all_num_anchors_spatial.append(anchors_this_layer[-1]) = [six elements]

    elment = feature map size

    【代码段】:

          all_anchors, all_num_anchors_depth, all_num_anchors_spatial = anchor_creator.get_all_anchors()

            num_anchors_per_layer = []

            for ind in range(len(all_anchors)):

                num_anchors_per_layer.append(all_num_anchors_depth[ind] * all_num_anchors_spatial[ind])

            anchor_encoder_decoder = anchor_manipulator.AnchorEncoder(allowed_borders = [1.0] * 6,

                                                                positive_threshold = FLAGS.match_threshold,

                                                                ignore_threshold = FLAGS.neg_threshold,

                                                                prior_scaling=[0.1, 0.1, 0.2, 0.2])

    【过程参数】:

    num_anchors_per_layer = [38*38*4, ] .shape = 6

    相关文章

      网友评论

          本文标题:tensorflow

          本文链接:https://www.haomeiwen.com/subject/fprrpktx.html