在目标检测中,真值与预测值的交并比IoU(Intersection over Union)是用来评价检测模型的一个重要指标。通俗意义上来讲,也就是检测结果与真实的结果重叠的区间所占两者面积之和的权重,一般说来,当IoU>0.5,我们认为检测准确。IoU具体的定义如下所示:
对于常见的矩形框类型的求取交并比,我们见得较多,算法也容易掌握。而最近需要求解一个任意多边形的IoU用来判断检测效果,在手撸了代码不断尝试以后,发现了借助opencv可以简单快速的实现。详情见代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
height=600
width=600
color = (1,0,0)
color2 = (0,1,0)
img = np.zeros([600,600,2])
triangle1 = np.array([[20,20], [20, 100], [300, 100],[300,20]])
cv2.fillConvexPoly(img, triangle1, color)
area1 = img.sum()
img = np.zeros([600,600,3])
triangle2 = np.array([[20,60], [20, 120], [300, 120],[300,60]])
cv2.fillConvexPoly(img, triangle2, color2)
area2 = img.sum()
cv2.fillConvexPoly(img, triangle1, color)
union_area = img.sum()
inter_area = area1 + area2 - union_area
IOU = inter_area / union_area
plt.imshow(img)
plt.show()
print (IOU)
借助opencv的fillConvexPoly函数,实现对多变形的填充,而填充的对象为固定的color,利用triangle接受多边形各个顶点的坐标信息,最后得到两个多边形的IoU。上述代码在计算IoU时存在一定的误差,这主要是利用fillConvexPoly函数时导致,如果满足你的IoU精度要求,不妨采用这种思路,主要我也没想到怎么求任意多边形的IoU,就将就着了。