IOU概念
-
IOU
最直观的理解就是两个检测框的交并比,即交集/并集
如图所示:
2.图像检测中的IOU应用一般分为query_boxex和boxes
query_box的个数为K,boxes的个数为N
如上图所示:
检测框的坐标为( x 0 x_0 x0, y 0 y_0 y0, x 1 x_1 x1, y 1 y_1 y1)代表的是左上角坐标和右下角坐标
需要注意的是:像素坐标跟直角坐标系是有区别的,x轴朝右,y轴朝下。
下面为python实现计算IOU的计算过程
import numpy as np
'''
1、query_boxes的个数为K,boxes的个数为N
2、overlaps为query_boxes分别跟boxes的IOU值,以矩阵的形式表示,shape == (N,K)
3、当交集部分的宽或高大于0时,面积才能够大于0,否则IOU为0,故overlaps = np.zeros((N,K))
'''
class Iou():
def __init__(self, query_boxes=None, boxes=None):
self.query_boxes = query_boxes
self.boxes = boxes
def IOU(self):
K = self.query_boxes.shape[0]
N = self.boxes.shape[0]
overlaps = np.zeros((N,K)) #初始化一组IOU为0的矩阵
for k in range(K):
#计算出query_box的长宽、高和面积
query_width = self.query_boxes[k,2] - self.query_boxes[k,0] + 1
query_height = self.query_boxes[k,3] - self.query_boxes[k,1] + 1
query_area = query_width * query_height
for n in range(N):
#box的面积
box_area = (self.boxes[n,2] -self.boxes[n,0] + 1)*(self.boxes[n,3] -self.boxes[n,1] + 1)
#用max和min函数去找出交集部分的坐上角和右下角横坐标
x_left = max(self.boxes[n,0], self.query_boxes[k,0]) #交集部分的左上角横坐标
x_right = min(self.boxes[n,2], self.query_boxes[k,2]) #交集部分的右下角横坐标
#求解交集部分的宽
i_width = x_right - x_left + 1
if i_width > 0:
#用max和min函数去找出交集部分的坐上角和右下角纵坐标
y_left = max(self.boxes[n,1], self.query_boxes[k,1]) #交集部分的坐上交纵坐标
y_right = min(self.boxes[n,3], self.query_boxes[k,3]) #交集部分的右下角纵坐标
i_height = y_right - y_left + 1
if i_height > 0:
#计算并集部分面积
i_area = i_width*i_height
#计算并集部分面积
union_area = box_area + query_area - i_area
#计算iou
overlaps[n,k] = i_area/union_area
return overlaps