code: def bbox_iou(
      box1, box2, giou=False, diou=False, ciou=False, eps=1e-9
  ):
      """calculate the iou of box1 and box2
  
      Args:
          box1 (list): [x, y, w, h], all have the shape [b, na, h, w, 1]
          box2 (list): [x, y, w, h], all have the shape [b, na, h, w, 1]
          giou (bool): whether use giou or not, default False
          diou (bool): whether use diou or not, default False
          ciou (bool): whether use ciou or not, default False
          eps (float): epsilon to avoid divide by zero
  
      Return:
          iou (Tensor): iou of box1 and box1, with the shape [b, na, h, w, 1]
      """
      px1, py1, px2, py2 = box1
      gx1, gy1, gx2, gy2 = box2
      x1 = paddle.maximum(px1, gx1)
      y1 = paddle.maximum(py1, gy1)
      x2 = paddle.minimum(px2, gx2)
      y2 = paddle.minimum(py2, gy2)
  
      overlap = ((x2 - x1).clip(0)) * ((y2 - y1).clip(0))
  
      area1 = (px2 - px1) * (py2 - py1)
      area1 = area1.clip(0)
  
      area2 = (gx2 - gx1) * (gy2 - gy1)
      area2 = area2.clip(0)
  
      union = area1 + area2 - overlap + eps
      iou = overlap / union
  
      if giou or ciou or diou:
          # convex w, h
          cw = paddle.maximum(px2, gx2) - paddle.minimum(px1, gx1)
          ch = paddle.maximum(py2, gy2) - paddle.minimum(py1, gy1)
          if giou:
              c_area = cw * ch + eps
              return iou - (c_area - union) / c_area
          else:
              # convex diagonal squared
              c2 = cw**2 + ch**2 + eps
              # center distance
              rho2 = (
                  (px1 + px2 - gx1 - gx2) ** 2
                  + (py1 + py2 - gy1 - gy2) ** 2
              ) / 4
              if diou:
                  return iou - rho2 / c2
              else:
                  w1, h1 = px2 - px1, py2 - py1 + eps
                  w2, h2 = gx2 - gx1, gy2 - gy1 + eps
                  delta = paddle.atan(w1 / h1) - paddle.atan(w2 / h2)
                  v = (4 / math.pi**2) * paddle.pow(delta, 2)
                  alpha = v / (1 + eps - iou + v)
                  alpha.stop_gradient = True
                  return iou - (rho2 / c2 + v * alpha)
      else:
          return iou
  
imports: import math
  import paddle
  import numpy
label_desc: Use image node_id 15 for calling a global function with example usage: bbox_iou(box1, box2, giou, diou, ciou, eps) and returns: iou, unknown, unknown, unknown