def rect_grid_pyr(response_size, rf, search_size, rect_size, scales, name='rect_grid_pyr'): '''Obtains the rectangles for a translation and scale scoremap. Args: response_size -- Dimension of scoremap. (height, width) rf -- Receptive field of scoremap. search_size -- Dimension of search image in pixels. (height, width) rect_size -- Size of rectangle in normalized co-ords in search image. [b, 2] ''' with tf.name_scope(name) as scope: # Assert that receptive fields are centered. receptive_field.assert_center_alignment(search_size, response_size, rf) # Obtain displacement from center of search image. # Not necessary to use receptive field offset because it is centered. disp = displacement_from_center(response_size) disp = tf.to_float(disp) * rf.stride / search_size disp = tf.multiply( tf.expand_dims(disp, -4), # [b, h, w, 2] -> [b, 1, h, w, 2] expand_dims_n(scales, -1, 3)) # [s] -> [s, 1, 1, 1] # Get centers of receptive field of each pixel. centers = 0.5 + disp rect_size = tf.multiply( tf.expand_dims(rect_size, -2), # [b, 2] -> [b, 1, 2] tf.expand_dims(scales, -1)) # [s] -> [s, 1] rect_size = expand_dims_n(rect_size, -2, 2) # [b, s, 2] -> [b, s, 1, 1, 2] return geom.make_rect_center_size(centers, rect_size)
def _clip_rect_size(rect, min_size=None, max_size=None, name='clip_rect_size'): with tf.name_scope(name) as scope: center, size = geom.rect_center_size(rect) if max_size is not None: size = tf.minimum(size, max_size) if min_size is not None: size = tf.maximum(size, min_size) return geom.make_rect_center_size(center, size)
def _rect_translate_scale(rect, translate, scale, name='rect_translate_scale'): ''' Args: rect: [..., 4] translate: [..., 2] scale: [..., 1] ''' with tf.name_scope(name) as scope: center, size = geom.rect_center_size(rect) return geom.make_rect_center_size(center + translate, size * scale)
def modify_aspect_ratio(rect, method='stretch', axis=-1, eps=1e-3, name='modify_aspect_ratio'): if method == 'stretch': return rect # No change. with tf.name_scope(name) as scope: center, size = geom.rect_center_size(rect) with tf.control_dependencies([tf.assert_non_negative(size)]): size = tf.identity(size) size = tf.maximum(size, eps) width = scalar_size(size, method, axis=axis, keepdims=True) return geom.make_rect_center_size(center, width)