+# -*- coding: utf-8 -*-
+from __future__ import absolute_import, print_function, division
+
+import tensorflow as tf
+from libs.configs import cfgs
+
+
+def make_anchors(base_anchor_size, anchor_scales, anchor_ratios,
+ featuremap_height, featuremap_width,
+ stride, name='make_anchors'):
+ '''
+ :param base_anchor_size:256
+ :param anchor_scales:
+ :param anchor_ratios:
+ :param featuremap_height:
+ :param featuremap_width:
+ :param stride:
+ :return:
+ '''
+ with tf.variable_scope(name):
+ base_anchor = tf.constant([0, 0, base_anchor_size, base_anchor_size], tf.float32) # [x_center, y_center, w, h]
+
+ ws, hs = enum_ratios(enum_scales(base_anchor, anchor_scales),
+ anchor_ratios) # per locations ws and hs
+
+ # featuremap_height = tf.Print(featuremap_height,
+ # [featuremap_height, featuremap_width], summarize=10,
+ # message=name+"_SHAPE***")
+
+ x_centers = tf.range(featuremap_width, dtype=tf.float32) * stride
+ y_centers = tf.range(featuremap_height, dtype=tf.float32) * stride
+
+ if cfgs.USE_CENTER_OFFSET:
+ x_centers = x_centers + stride/2.
+ y_centers = y_centers + stride/2.
+
+ x_centers, y_centers = tf.meshgrid(x_centers, y_centers)
+
+ ws, x_centers = tf.meshgrid(ws, x_centers)
+ hs, y_centers = tf.meshgrid(hs, y_centers)
+
+ anchor_centers = tf.stack([x_centers, y_centers], 2)
+ anchor_centers = tf.reshape(anchor_centers, [-1, 2])
+
+ box_sizes = tf.stack([ws, hs], axis=2)
+ box_sizes = tf.reshape(box_sizes, [-1, 2])
+ # anchors = tf.concat([anchor_centers, box_sizes], axis=1)
+ anchors = tf.concat([anchor_centers - 0.5*box_sizes,
+ anchor_centers + 0.5*box_sizes], axis=1)
+ return anchors
+
+
+def enum_scales(base_anchor, anchor_scales):
+
+ anchor_scales = base_anchor * tf.constant(anchor_scales, dtype=tf.float32, shape=(len(anchor_scales), 1))
+
+ return anchor_scales
+
+
+def enum_ratios(anchors, anchor_ratios):
+ '''
+ ratio = h /w
+ :param anchors:
+ :param anchor_ratios:
+ :return:
+ '''
+ ws = anchors[:, 2] # for base anchor: w == h
+ hs = anchors[:, 3]
+ sqrt_ratios = tf.sqrt(tf.constant(anchor_ratios))
+
+ ws = tf.reshape(ws / sqrt_ratios[:, tf.newaxis], [-1, 1])
+ hs = tf.reshape(hs * sqrt_ratios[:, tf.newaxis], [-1, 1])
+
+ return hs, ws
+
+
+if __name__ == '__main__':
+ import os
+ os.environ["CUDA_VISIBLE_DEVICES"] = '0'
+ base_anchor_size = 256
+ anchor_scales = [1.0]
+ anchor_ratios = [0.5, 2.0, 1.0]
+ anchors = make_anchors(base_anchor_size=base_anchor_size, anchor_ratios=anchor_ratios,
+ anchor_scales=anchor_scales,
+ featuremap_width=32,
+ featuremap_height=63,
+ stride=16)
+ init = tf.global_variables_initializer()
+ with tf.Session() as sess:
+ sess.run(init)
+ anchor_result = sess.run(anchors)
+ print (anchor_result.shape)