IOU计算公式:两个box相交的面积/并集面积
- 首先计算单个矩形面积。
输入为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])
- 计算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
- 首先计算单个矩形面积。
输入为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])
- 计算两个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))