1. 规则矩形框的IoU计算

  1. 有些目标检测中,预测的边界框为规则的矩形,则只需要知道矩形的左上角和右下角的坐标信息,就可以得到矩形框所有想要的信息。对于这种情况,IoUpython实现如下(python3.5
  1. def IoU(box1, box2):
  2. '''
  3. 计算两个矩形框的交并比
  4. :param box1: list,第一个矩形框的左上角和右下角坐标
  5. :param box2: list,第二个矩形框的左上角和右下角坐标
  6. :return: 两个矩形框的交并比iou
  7. '''
  8. x1 = max(box1[0], box2[0]) # 交集左上角x
  9. x2 = min(box1[2], box2[2]) # 交集右下角x
  10. y1 = max(box1[1], box2[1]) # 交集左上角y
  11. y2 = min(box1[3], box2[3]) # 交集右下角y
  12. overlap = max(0., x2-x1) * max(0., y2-y1)
  13. union = (box1[2]-box1[0]) * (box1[3]-box1[1]) \
  14. + (box2[2]-box2[0]) * (box2[3]-box2[1]) \
  15. - overlap
  16. return overlap/union
  17. if __name__ == '__main__':
  18. # box = [左上角x1,左上角y1,右下角x2,右下角y2]
  19. box1 = [10, 0, 15, 10]
  20. box2 = [12, 5, 20, 15]
  21. iou = IoU(box1, box2)

2. 非矩形框IoU计算

  1. 在有些目标检测中,检测框并不是规则的矩形框,例如自然场景下的文本检测,有些呈现平行四边形,梯形等情况,这时计算IoU时,就比较复杂一些。这时可以借助于python的一些库实现多边形的面积计算。
  1. import shapely
  2. import numpy as np
  3. from shapely.geometry import Polygon, MultiPoint # 多边形
  4. def bbox_iou_eval(box1, box2):
  5. '''
  6. 利用python的库函数实现非矩形的IoU计算
  7. :param box1: list,检测框的四个坐标[x1,y1,x2,y2,x3,y3,x4,y4]
  8. :param box2: lsit,检测框的四个坐标[x1,y1,x2,y2,x3,y3,x4,y4]
  9. :return: IoU
  10. '''
  11. box1 = np.array(box1).reshape(4, 2) # 四边形二维坐标表示
  12. # python四边形对象,会自动计算四个点,并将四个点重新排列成
  13. # 左上,左下,右下,右上,左上(没错左上排了两遍)
  14. poly1 = Polygon(box1).convex_hull
  15. box2 = np.array(box2).reshape(4, 2)
  16. poly2 = Polygon(box2).convex_hull
  17. if not poly1.intersects(poly2): # 如果两四边形不相交
  18. iou = 0
  19. else:
  20. try:
  21. inter_area = poly1.intersection(poly2).area # 相交面积
  22. iou = float(inter_area) / (poly1.area + poly2.area - inter_area)
  23. except shapely.geos.TopologicalError:
  24. print('shapely.geos.TopologicalError occured, iou set to 0')
  25. iou = 0
  26. return iou
  27. if __name__ == '__main__':
  28. # box = [四个点的坐标,顺序无所谓]
  29. box3 = [10, 0, 15, 0, 15, 10, 10, 10] # 左上,右上,右下,左下
  30. box4 = [12, 5, 20, 2, 20, 15, 12, 15]
  31. iou = bbox_iou_eval(box3, box4)
  32. print(iou)

References

IOU交并比的计算