in 04_detect_segment/utils_box.py [0:0]
def grid_cell_to_tile_coords(rois, grid_n, tile_size):
# converts between coordinates used internally by the model
# and coordinates expected by Tensorflow's draw_bounding_boxes function
#
# input coords:
# shape [batch, grid_n, grid_n, n, 3]
# coordinates in last dimension are x, y, w
# x and y are in [-1, 1] relative to grid cell center and size of grid cell
# w is in [0, 1] relatively to tile size. w is a "diameter", not "radius"
#
# output coords:
# shape [batch, grid_n, grid_n, n, 4]
# coordinates in last dimension are y1, x1, y2, x2
# relatively to tile_size
# grid for (0,0) based tile of size tile_size
cell_w = tile_size/grid_n
grid = gen_grid(grid_n) * cell_w
# grid cell centers
grid_centers = (grid + grid + cell_w) / 2.0 # shape [grid_n, grid_n, 2]
# roi coordinates
roi_cx, roi_cy, roi_w = tf.unstack(rois, axis=-1) # shape [batch, grid_n, grid_n, n]
# grid centers unstacked
gr_cx, gr_cy = tf.unstack(grid_centers, axis=-1) # shape [grid_n, grid_n]
gr_cx = tf.expand_dims(tf.expand_dims(gr_cx, 0), 3) # shape [1, grid_n, grid_n, 1]
gr_cy = tf.expand_dims(tf.expand_dims(gr_cy, 0), 3) # shape [1, grid_n, grid_n, 1]
roi_cx = roi_cx * cell_w/2 # roi_x=1 means cell center + cell_w/2
roi_cx = roi_cx+gr_cx
roi_cy = roi_cy * cell_w/2 # roi_x=1 means cell center + cell_w/2
roi_cy = roi_cy+gr_cy
roi_w = roi_w * tile_size
roi_x1 = roi_cx - roi_w/2
roi_x2 = roi_cx + roi_w/2
roi_y1 = roi_cy - roi_w/2
roi_y2 = roi_cy + roi_w/2
rois = tf.stack([roi_x1, roi_y1, roi_x2, roi_y2], axis=4) # shape [batch, grid_n, grid_n, n, 4]
return rois