text: #!/usr/bin/env python3
  # -*- coding: utf-8 -*-
  
  import numpy as np
  
  def IoU(box, boxes):
      """Compute IoU between detect box and gt boxes
  
      Parameters:
      ----------
      box: numpy array , shape (5, ): x1, y1, x2, y2, score
          input box
      boxes: numpy array, shape (n, 4): x1, y1, x2, y2
          input ground truth boxes
  
      Returns:
      -------
      ovr: numpy.array, shape (n, )
          IoU
      """
      # box = (x1, y1, x2, y2)
      box_area = (box[2] - box[0] + 1) * (box[3] - box[1] + 1)
      area = (boxes[:, 2] - boxes[:, 0] + 1) * (boxes[:, 3] - boxes[:, 1] + 1)
  
      # abtain the offset of the interception of union between crop_box and gt_box
      xx1 = np.maximum(box[0], boxes[:, 0])
      yy1 = np.maximum(box[1], boxes[:, 1])
      xx2 = np.minimum(box[2], boxes[:, 2])
      yy2 = np.minimum(box[3], boxes[:, 3])
  
      # compute the width and height of the bounding box
      w = np.maximum(0, xx2 - xx1 + 1)
      h = np.maximum(0, yy2 - yy1 + 1)
  
      inter = w * h
      ovr = inter / (box_area + area - inter)
      return ovr
  
  
  def convert_to_square(bbox):
      """Convert bbox to square
  
      Parameters:
      ----------
      bbox: numpy array , shape n x 5
          input bbox
  
      Returns:
      -------
      square bbox
      """
      square_bbox = bbox.copy()
  
      h = bbox[:, 3] - bbox[:, 1] + 1
      w = bbox[:, 2] - bbox[:, 0] + 1
      max_side = np.maximum(h,w)
      square_bbox[:, 0] = bbox[:, 0] + w*0.5 - max_side*0.5
      square_bbox[:, 1] = bbox[:, 1] + h*0.5 - max_side*0.5
      square_bbox[:, 2] = square_bbox[:, 0] + max_side - 1
      square_bbox[:, 3] = square_bbox[:, 1] + max_side - 1
      return square_bbox
  