numpy批量iou

x33g5p2x  于2021-11-25 转载在 其他  
字(1.3k)|赞(0)|评价(0)|浏览(320)
  1. import random
  2. import time
  3. import numpy as np
  4. """
  5. #单个iou
  6. """
  7. def compute_iou2(rec1, rec2):
  8. areas1 = (rec1[3] - rec1[1]) * (rec1[2] - rec1[0])
  9. areas2 = (rec2[3] - rec2[1]) * (rec2[2] - rec2[0])
  10. left = max(rec1[1],rec2[1])
  11. right = min(rec1[3],rec2[3])
  12. top = max(rec1[0], rec2[0])
  13. bottom = min(rec1[2], rec2[2])
  14. w = max(0, right-left)
  15. h = max(0, bottom-top)
  16. return w*h/(areas2+areas1-w*h)
  17. def Ious(bbox, gt):
  18. assert bbox.shape[0]>0, 'bbox len must>0'
  19. assert gt.shape[0]>0, 'bbox len must>0'
  20. """
  21. :param bbox: (n, 4)
  22. :param gt: (m, 4)
  23. :return: (n, m)
  24. numpy 广播机制 从后向前对齐。 维度为1 的可以重复等价为任意维度
  25. eg: (4,3,2) (3,2) (3,2)会扩充为(4,3,2)
  26. (4,1,2) (3,2) (4,1,2) 扩充为(4, 3, 2) (3, 2)扩充为(4, 3,2) 扩充的方法为重复
  27. 广播会在numpy的函数 如sum, maximun等函数中进行
  28. """
  29. lt = np.maximum(bbox[:, None, :2], gt[:, :2]) # left_top (x, y)
  30. rb = np.minimum(bbox[:, None, 2:], gt[:, 2:]) # right_bottom (x, y)
  31. wh = np.maximum(rb - lt , 0) # inter_area (w, h)
  32. inter_areas = wh[:, :, 0] * wh[:, :, 1] # shape: (n, m)
  33. box_areas = (bbox[:, 2] - bbox[:, 0] ) * (bbox[:, 3] - bbox[:, 1] )
  34. gt_areas = (gt[:, 2] - gt[:, 0] ) * (gt[:, 3] - gt[:, 1] )
  35. IoU = inter_areas / (box_areas[:, None] + gt_areas - inter_areas)
  36. return IoU
  37. if __name__ == '__main__':
  38. data_a=[[1,1,3,3]]
  39. data_a=[]
  40. data_b=[[1,1,2,2],[2,2,4,4],[1,1,3,3],[3,3,4,4]]
  41. ious= Ious(np.array(data_a), np.array(data_b))
  42. print('IoU res')
  43. print(ious.max())
  44. ious=[]
  45. start = time.time()
  46. for data in data_b:
  47. iou = compute_iou2(data_a[0], data)
  48. ious.append(iou)
  49. print('compute_iou2 res')
  50. print(ious)

相关文章