pairwise_iou计算

pairwise_iou计算_第1张图片
IOU.png

IOU计算公式:两个box相交的面积/并集面积

  1. 首先计算单个矩形面积。
    输入为boxes:nx4.输出为面积 n
def area(boxes):
    x_min, y_min, x_max, y_max = tf.split(boxes, 4, axis=1)
    return tf.squeeze((y_max - y_min) * (x_max - x_min), [1])
  1. 计算boxes相交面积。
    输入为boxlist1: Nx4, boxlist2: Mx4. 输出为intersection:NxM
def pairwise_intersection(boxlist1, boxlist2):
    x_min1, y_min1, x_max1, y_max1 = tf.split(boxlist1, 4, axis=1)
    x_min2, y_min2, x_max2, y_max2 = tf.split(boxlist2, 4, axis=1)
    all_pairs_min_ymax = tf.minimum(y_max1, tf.transpose(y_max2))
    all_pairs_max_ymin = tf.maximum(y_min1, tf.transpose(y_min2))
    intersect_heights = tf.maximum(0.0, all_pairs_min_ymax - all_pairs_max_ymin)
    all_pairs_min_xmax = tf.minimum(x_max1, tf.transpose(x_max2))
    all_pairs_max_xmin = tf.maximum(x_min1, tf.transpose(x_min2))
    intersect_widths = tf.maximum(0.0, all_pairs_min_xmax - all_pairs_max_xmin)
    return intersect_heights * intersect_widths
  1. 首先计算单个矩形面积。
    输入为boxes:nx4.输出为面积 n
def area(boxes):
    x_min, y_min, x_max, y_max = tf.split(boxes, 4, axis=1)
    return tf.squeeze((y_max - y_min) * (x_max - x_min), [1])
  1. 计算两个box相交的iou比值,如果不相交,则为0,如果相交,则为相交面积/并集面积。
    输入为boxlist1: Nx4, boxlist2: Mx4. 输出为IOU值:NxM
def pairwise_iou(boxlist1, boxlist2):
    intersections = pairwise_intersection(boxlist1, boxlist2)
    areas1 = area(boxlist1)
    areas2 = area(boxlist2)
    unions = (
        tf.expand_dims(areas1, 1) + tf.expand_dims(areas2, 0) - intersections)
    return tf.where(
        tf.equal(intersections, 0.0),
        tf.zeros_like(intersections), tf.truediv(intersections, unions))

你可能感兴趣的:(pairwise_iou计算)