目标检测算法中规则矩形和不规则四边形IOU的Python实现

交并比(Intersection-over-Union,IoU),目标检测中使用的一个概念,我们在进行目标检测算法测试时,重要的指标,是产生的预测框(candidate bound)与标记框(ground truth bound)的交叠率,即它们的交集与并集的比值。最理想情况是完全重叠,即比值为1。

交并比(Intersection-over-Union,IoU),目标检测中使用的一个概念,我们在进行目标检测算法测试时,重要的指标,是产生的预测框(candidate bound)与标记框(ground truth bound)的交叠率,即它们的交集与并集的比值。最理想情况是完全重叠,即比值为1。

目标检测算法中规则矩形和不规则四边形IOU的Python实现

交并比(Intersection-over-Union,IoU),目标检测中使用的一个概念,我们在进行目标检测算法测试时,重要的指标,是产生的预测框(candidate bound)与标记框(ground truth bound)的交叠率,即它们的交集与并集的比值。最理想情况是完全重叠,即比值为1。

通常,我们所说的目标检测检测的框是规则的矩形框,计算IOU也非常简单,一般两种方法:

  • 两个矩形的宽之和减去组合后的矩形的宽就是重叠矩形的宽,同比重叠矩形的高。
  • 右下角的最小值减去左上角的最大值就是重叠矩形的宽,同比高。

上述规则四边形(矩形)IOU计算方式一的 Python实现

  1. defcalculate_regular_iou(rec1,rec2):
  2. """
  3. computingIoU
  4. :paramrec1:(y0,x0,y1,x1),whichreflects
  5. (top,left,bottom,right)
  6. :paramrec2:(y0,x0,y1,x1)
  7. :return:scalavalueofIoU
  8. """
  9. S_rec1=(rec1[2]-rec1[0])*(rec1[3]-rec1[1])
  10. S_rec2=(rec2[2]-rec2[0])*(rec2[3]-rec2[1])
  11. sum_area=S_rec1+S_rec2
  12. left_line=max(rec1[1],rec2[1])
  13. right_line=min(rec1[3],rec2[3])
  14. top_line=max(rec1[0],rec2[0])
  15. bottom_line=min(rec1[2],rec2[2])
  16. ifleft_line>=right_lineortop_line>=bottom_line:
  17. return0
  18. else:
  19. intersect=(right_line-left_line)*(bottom_line-top_line)
  20. return(intersect/(sum_area-intersect))*1.0
  21. if__name__=='__main__':
  22. #(top,left,bottom,right)
  23. rect1=[551,26,657,45]
  24. rect2=[552,27,672,46]
  25. iou=calculate_regular_iou(rect1,rect2)

上述规则四边形(矩形)IOU计算方式二的 Python 实现

  1. defcompute_regular_iou_other(rec1,rec2):
  2. """
  3. computingIoU
  4. :paramrec1:(y0,x0,y1,x1),whichreflects
  5. (top,left,bottom,right)
  6. :paramrec2:(y0,x0,y1,x1)
  7. :return:scalavalueofIoU
  8. """
  9. areas1=(rec1[3]-rec1[1])*(rec1[2]-rec1[0])
  10. areas2=(rec2[3]-rec2[1])*(rec2[2]-rec2[0])
  11. left=max(rec1[1],rec2[1])
  12. right=min(rec1[3],rec2[3])
  13. top=max(rec1[0],rec2[0])
  14. bottom=min(rec1[2],rec2[2])
  15. w=max(0,right-left)
  16. h=max(0,bottom-top)
  17. returnw*h/(areas2+areas1-w*h)
  18. if__name__=='__main__':
  19. #(top,left,bottom,right)
  20. rect1=[551,26,657,45]
  21. rect2=[552,27,672,46]
  22. iou=compute_regular_iou_other(rect1,rect2)

但是,对于不规则四边形就不能通过上述这两种方式来计算,这里可以使用Python的 Shapely 库实现,Python 实现如下:

  1. importnumpyasnp
  2. importshapely
  3. fromshapely.errorsimportTopologicalError
  4. fromshapely.geometryimportPolygon,MultiPoint
  5. defto_polygon(quadrilateral):
  6. """
  7. :paramquadrilateral:四边形四个点坐标的一维数组表示,[x,y,x,y....]
  8. :return:四边形二维数组,Polygon四边形对象
  9. """
  10. #四边形二维数组表示
  11. quadrilateral_array=np.array(quadrilateral).reshape(4,2)
  12. #Polygon四边形对象,会自动计算四个点,最后四个点顺序为:左上左下右下右上左上
  13. quadrilateral_polygon=Polygon(quadrilateral_array).convex_hull
  14. returnquadrilateral_array,quadrilateral_polygon
  15. defcalculate_iou(actual_quadrilateral,predict_quadrilateral):
  16. """
  17. :paramactual_quadrilateral:预测四边形四个点坐标的一维数组表示,[x,y,x,y....]
  18. :parampredict_quadrilateral:期望四边形四个点坐标的一维数组表示,[x,y,x,y....]
  19. :return:
  20. """
  21. #预测四边形二维数组,预测四边形Polygon对象
  22. actual_quadrilateral_array,actual_quadrilateral_polygon=to_polygon(actual_quadrilateral)
  23. #期望四边形二维数组,期望四边形Polygon对象
  24. predict_quadrilateral_array,predict_quadrilateral_polygon=to_polygon(predict_quadrilateral)
  25. #合并两个box坐标,变为8*2便于后面计算并集面积
  26. union_poly=np.concatenate((actual_quadrilateral_array,predict_quadrilateral_array))
  27. #两两四边形是否存在交集
  28. inter_status=actual_quadrilateral_polygon.intersects(predict_quadrilateral_polygon)
  29. #如果两四边形相交,则进iou计算
  30. ifinter_status:
  31. try:
  32. #交集面积
  33. inter_area=actual_quadrilateral_polygon.intersection(predict_quadrilateral_polygon).area
  34. #并集面积计算方式一
  35. #union_area=poly1.area+poly2.area-inter_area
  36. #并集面积计算方式二
  37. union_area=MultiPoint(union_poly).convex_hull.area
  38. #若并集面积等于0,则iou=0
  39. ifunion_area==0:
  40. iou=0
  41. else:
  42. #第一种计算的是:交集部分/包含两个四边形最小多边形的面积
  43. iou=float(inter_area)/union_area
  44. #第二种:交集/并集(常见矩形框IOU计算方式)
  45. #iou=float(inter_area)/(poly1.area+poly2.area-inter_area)
  46. exceptshapely.errors.TopologicalError:
  47. print('shapely.errors.TopologicalErroroccured,iousetto0')
  48. iou=0
  49. else:
  50. iou=0
  51. returniou
  52. if__name__=='__main__':
  53. actual_quadrilateral=[908,215,934,312,752,355,728,252]
  54. predict_quadrilateral=[923,308,758,342,741,262,907,228]
  55. iou=calculate_iou(actual_quadrilateral,predict_quadrilateral)
  56. print(iou)

避坑指南

运行代码抛出 WinError 126 错误

在使用Python中的使用 import shapely 时不会报错,但是在使用 from shapely.geometry import Polygon,MultiPoint 会报错,报错的详细信息如下图:

目标检测算法中规则矩形和不规则四边形IOU的Python实现

报错的主要原因就出现在 geos_c.dll 这里,看了网上很多文章大部分说是由于 geos_c.dll 文件缺失导致报错。尝试在网上找了几个 geos_c.dll 文件放到 C:\Windows\System32 下仍然没有解决问题。

目标检测算法中规则矩形和不规则四边形IOU的Python实现

最终解决方案:通过 pip uninstall Shapely 卸载原来安装的 Shapely 然后 在 https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely,如上图,这里下载对应版本的whl文件安装,安装这个whl 就可以解决该问题。

whl文件下载404错误

在 https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely 下载制定版本的whl时,出现404错误。如下。

目标检测算法中规则矩形和不规则四边形IOU的Python实现

此时改用 chrome 浏览器重新尝试下载,即可解决。

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月4日 13:19
下一篇 2023年5月4日 13:19

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信