code: def generate_rpn_proposals(
      boxes, scores, img_shape, pre_nms_topk, post_nms_topk=None
  ):
      """
      Sample RPN proposals by the following steps:
      1. Pick top k1 by scores
      2. NMS them
      3. Pick top k2 by scores. Default k2 == k1, i.e. does not filter the NMS output.
  
      Args:
          boxes: nx4 float dtype, the proposal boxes. Decoded to floatbox already
          scores: n float, the logits
          img_shape: [h, w]
          pre_nms_topk, post_nms_topk (int): See above.
  
      Returns:
          boxes: kx4 float
          scores: k logits
      """
      assert boxes.shape.ndims == 2, boxes.shape
      if post_nms_topk is None:
          post_nms_topk = pre_nms_topk
  
      topk = tf.minimum(pre_nms_topk, tf.size(scores))
      topk_scores, topk_indices = tf.nn.top_k(
          scores, k=topk, sorted=False
      )
      topk_boxes = tf.gather(boxes, topk_indices)
      topk_boxes = clip_boxes(topk_boxes, img_shape)
  
      if cfg.RPN.MIN_SIZE > 0:
          topk_boxes_x1y1x2y2 = tf.reshape(topk_boxes, (-1, 2, 2))
          topk_boxes_x1y1, topk_boxes_x2y2 = tf.split(
              topk_boxes_x1y1x2y2, 2, axis=1
          )
          # nx1x2 each
          wbhb = tf.squeeze(topk_boxes_x2y2 - topk_boxes_x1y1, axis=1)
          valid = tf.reduce_all(wbhb > cfg.RPN.MIN_SIZE, axis=1)  # n,
          topk_valid_boxes = tf.boolean_mask(topk_boxes, valid)
          topk_valid_scores = tf.boolean_mask(topk_scores, valid)
      else:
          topk_valid_boxes = topk_boxes
          topk_valid_scores = topk_scores
  
      nms_indices = tf.image.non_max_suppression(
          topk_valid_boxes,
          topk_valid_scores,
          max_output_size=post_nms_topk,
          iou_threshold=cfg.RPN.PROPOSAL_NMS_THRESH,
      )
  
      proposal_boxes = tf.gather(topk_valid_boxes, nms_indices)
      proposal_scores = tf.gather(topk_valid_scores, nms_indices)
      tf.sigmoid(proposal_scores, name="probs")  # for visualization
      return tf.stop_gradient(
          proposal_boxes, name="boxes"
      ), tf.stop_gradient(proposal_scores, name="scores")
  
file_path: tensorpack/examples/FasterRCNN/modeling/model_rpn.py
imports: import tensorflow
  import numpy
  from tensorpack import tfv1
  from tensorpack.models import Conv2D, layer_register
  from tensorpack.tfutils.argscope import argscope
  from tensorpack.tfutils.scope_utils import auto_reuse_variable_scope, under_name_scope
  from tensorpack.tfutils.summary import add_moving_summary
  from tensorpack.utils.argtools import memoized
  from config import config
  from .model_box import clip_boxes
label_desc: Use image node_id 3 for calling a global function with example usage: generate_rpn_proposals(boxes, scores, img_shape, pre_nms_topk, post_nms_topk) and returns: tf,  tf