text: # --------------------------------------------------------
  # Tensorflow Phrase Detection
  # Licensed under The MIT License [see LICENSE for details]
  # Written by Bryan Plummer based on code from Ross Girshick
  # --------------------------------------------------------
  
  """Transform a roidb into a trainable roidb by adding a bunch of metadata."""
  from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  
  import numpy as np
  from model.config import cfg
  from model.bbox_transform import bbox_transform
  from utils.cython_bbox import bbox_overlaps
  import PIL
  
  def prepare_roidb(imdb):
    """Enrich the imdb's roidb by adding some derived quantities that
    are useful for training. This function precomputes the maximum
    overlap, taken over ground-truth boxes, between each ROI and
    each ground-truth box. The class with maximum overlap is also
    recorded.
    """
    roidb = imdb.roidb
    sizes = [PIL.Image.open(imdb.image_path_at(i)).size
             for i in range(imdb.num_images)]
  
    for i in range(len(imdb.image_index)):
      roidb[i]['image'] = imdb.image_path_at(i)
      roidb[i]['width'] = sizes[i][0]
      roidb[i]['height'] = sizes[i][1]
  
      # need gt_overlaps as a dense array for argmax
      # max overlap with gt over classes (columns)
      max_overlaps = np.ones(len(roidb[i]['processed_phrases']), np.float32)
      # gt class that had the max overlap
      max_classes = np.ones(len(max_overlaps), np.int32)
      roidb[i]['max_classes'] = max_classes
      roidb[i]['gt_classes'] = max_classes
      roidb[i]['max_overlaps'] = max_overlaps
      # sanity checks
      # max overlap of 0 => class should be zero (background)
      zero_inds = np.where(max_overlaps == 0)[0]
      assert all(max_classes[zero_inds] == 0)
      # max overlap > 0 => class should not be zero (must be a fg class)
      nonzero_inds = np.where(max_overlaps > 0)[0]
      assert all(max_classes[nonzero_inds] != 0)
  