目标检测 IoU 交并比 作者:马育民 • 2020-03-20 17:27 • 阅读:10118 # 介绍 IoU,Intersection over Union,交并比 公式如下图: [![](https://www.malaoshi.top/upload/0/0/1EF5DnPohM43.png)](https://www.malaoshi.top/upload/0/0/1EF5DnPohM43.png) # 计算 ### 情况一 有2个方框 A 和 B ,分别知道 **左上角** 和 **右下角** 的坐标,如下图: [![](https://www.malaoshi.top/upload/0/0/1EF5DnR0ura8.png)](https://www.malaoshi.top/upload/0/0/1EF5DnR0ura8.png) 为了计算上图 **绿色框** 的面积,就要知道绿色框 左上角、右下角的坐标: 1. 比较 ax1 和 bx1,取最大值 2. 比较 ax2 和 bx2,取最小值 上面 最小值 减去 最大值,就是 **绿色框** 的长度 同理求出 **绿色框** 宽度,让 长度 乘以 宽度,就求出面积 ##### 为什么要比较大小 A 和 B 相交的方式有6种情况绿色框 的左上角 不总是(bx1,by1),右下角不总是(ax2,ay2): [![](https://www.malaoshi.top/upload/0/0/1EF5DnhumjZf.jpeg)](https://www.malaoshi.top/upload/0/0/1EF5DnhumjZf.jpeg) ``` 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 框的 **中心点坐标** 和 **宽高**,如下图: [![](https://www.malaoshi.top/upload/0/0/1EF5DnpHRZM2.png)](https://www.malaoshi.top/upload/0/0/1EF5DnpHRZM2.png) 计算时,先计算出 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 原文出处:http://malaoshi.top/show_1EF5ByInKAqL.html