目标检测 IoU 交并比

介绍

IoU,Intersection over Union,交并比

公式如下图:

计算

情况一

有2个方框 A 和 B ,分别知道 左上角 和 右下角 的坐标,如下图:

为了计算上图 绿色框 的面积,就要知道绿色框 左上角、右下角的坐标:

  1. 比较 ax1 和 bx1,取最大值
  2. 比较 ax2 和 bx2,取最小值

上面 最小值 减去 最大值,就是 绿色框 的长度

同理求出 绿色框 宽度,让 长度 乘以 宽度,就求出面积

为什么要比较大小

A 和 B 相交的方式有6种情况绿色框 的左上角 不总是(bx1,by1),右下角不总是(ax2,ay2):

def iou(box1, box2):
    '''
    两个框(二维)的 iou 计算
    注意:边框以左上为原点
    box:[x1, y1, x2, y2]
    '''
    in_h = min(box1[2], box2[2]) - max(box1[0], box2[0])
    in_w = min(box1[3], box2[3]) - max(box1[1], box2[1])
    inter = 0 if in_h<0 or in_w<0 else in_h*in_w
    union = (box1[2] - box1[0]) * (box1[3] - box1[1]) + \
            (box2[2] - box2[0]) * (box2[3] - box2[1]) - inter
    iou = inter / union
    return iou

情况二

在目标检测中,已知 A 和 B 框的 中心点坐标 和 宽高,如下图:

计算时,先计算出 A 和 B 框 左上角 和 右下角的坐标,再按 情况一 计算

import tensorflow as tf

def get_iou(x1,y1,w1,h1, x2,y2,w2,h2):

    xmin1 = x1 - 0.5*w1
    xmax1 = x1 + 0.5*w1
    ymin1 = y1 - 0.5*h1 
    ymax1 = y1 + 0.5*h1 

    xmin2 = x2 - 0.5*w2
    xmax2 = x2 + 0.5*w2
    ymin2 = y2 - 0.5*h2
    ymax2 = y2 + 0.5*h2

    inter_x_min  = tf.maximum(xmin1,xmin2)
    inter_x_max  = tf.minimum(xmax1,xmax2)
    inter_w = inter_x_max - inter_x_min

    inter_y_min  = tf.maximum(ymin1, ymin2)
    inter_y_max  = tf.minimum(ymax1, ymax2)
    inter_h = inter_y_max - inter_y_min

    inter = inter_w * inter_h
    union = w1*h1 + w2*h2 - inter
    iou = inter / union

    return iou

感谢:
https://blog.csdn.net/u014061630/article/details/82818112


原文出处:/show_1EF5ByInKAqL.html