'Constructs a MultipleGridAnchorGenerator.
To construct anchors, at multiple grid resolutions, one must provide a
list of feature_map_shape_list (e.g., [(8, 8), (4, 4)]), and for each grid
size, a corresponding list of (scale, aspect ratio) box specifications.
For example:
box_specs_list = [[(.1, 1.0), (.1, 2.0)],  # for 8x8 grid
[(.2, 1.0), (.3, 1.0), (.2, 2.0)]]  # for 4x4 grid
To support the fully convolutional setting, we pass grid sizes in at
generation time, while scale and aspect ratios are fixed at construction
time.
Args:
box_specs_list: list of list of (scale, aspect ratio) pairs with the
outside list having the same number of entries as feature_map_shape_list
(which is passed in at generation time).
base_anchor_size: base anchor size as [height, width]
(length-2 float tensor, default=[256, 256]).
clip_window: a tensor of shape [4] specifying a window to which all
anchors should be clipped. If clip_window is None, then no clipping
is performed.
Raises:
ValueError: if box_specs_list is not a list of list of pairs
ValueError: if clip_window is not either None or a tensor of shape [4]'

def __init__(self, box_specs_list, base_anchor_size=None, clip_window=None):

    if (isinstance(box_specs_list, list) and all([isinstance(list_item, list) for list_item in box_specs_list])):
        self._box_specs = box_specs_list
    else:
        raise ValueError('box_specs_list    is    expected    to    be    a    list    of    lists    of    pairs')
    if (base_anchor_size is None):
        base_anchor_size = tf.constant([256, 256], dtype=tf.float32)
    self._base_anchor_size = base_anchor_size
    if ((clip_window is not None) and (clip_window.get_shape().as_list() != [4])):
        raise ValueError('clip_window    must    either    be    None    or    a    shape    [4]    tensor')
    self._clip_window = clip_window
    self._scales = []
    self._aspect_ratios = []
    for box_spec in self._box_specs:
        if (not all([(isinstance(entry, tuple) and (len(entry) == 2)) for entry in box_spec])):
            raise ValueError('box_specs_list    is    expected    to    be    a    list    of    lists    of    pairs')
        (scales, aspect_ratios) = zip(*box_spec)
        self._scales.append(scales)
        self._aspect_ratios.append(aspect_ratios)
