python 实现显著性检测_目标检测算法中规则矩形和不规则四边形IOU的Python实现...

3dd8c565cb65643868fc0386df1593a2.png

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

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

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

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

def calculate_regular_iou(rec1, rec2):     """     computing IoU     :param rec1: (y0, x0, y1, x1), which reflects             (topleft, bottom, right)     :param rec2: (y0, x0, y1, x1)     :return: scala value of IoU     """      S_rec1 = (rec1[2] - rec1[0]) * (rec1[3] - rec1[1])     S_rec2 = (rec2[2] - rec2[0]) * (rec2[3] - rec2[1])      sum_area = S_rec1 + S_rec2 ​     left_line = max(rec1[1], rec2[1])     right_line = min(rec1[3], rec2[3])     top_line = max(rec1[0], rec2[0])     bottom_line = min(rec1[2], rec2[2]) ​     if left_line >= right_line or top_line >= bottom_line:         return 0     else:         intersect = (right_line - left_line) * (bottom_line - top_line)         return (intersect / (sum_area - intersect)) *       if __name__ == '__main__':     # (topleft, bottom, right)     rect1 = [551, 26, 657, 45]     rect2 = [552, 27, 672, 46]     iou = calculate_regular_iou(rect1, rect2) 

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

def compute_regular_iou_other(rec1, rec2):     """     computing IoU     :param rec1: (y0, x0, y1, x1), which reflects             (topleft, bottom, right)     :param rec2: (y0, x0, y1, x1)     :return: scala value of IoU     """     areas1 = (rec1[3] - rec1[1]) * (rec1[2] - rec1[0])     areas2 = (rec2[3] - rec2[1]) * (rec2[2] - rec2[0]) ​     left = max(rec1[1],rec2[1]) ​     right = min(rec1[3],rec2[3]) ​     top = max(rec1[0], rec2[0]) ​     bottom = min(rec1[2], rec2[2]) ​     w = max(0, right - left)     h = max(0, bottom - top) ​     return w*h / (areas2 + areas1 - w*h) ​ if __name__ == '__main__':     # (topleft, bottom, right)     rect1 = [551, 26, 657, 45]     rect2 = [552, 27, 672, 46]     iou = compute_regular_iou_other(rect1, rect2) 

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

import numpy as np import shapely from  import TopologicalError from  import Polygon,MultiPoint ​ def to_polygon(quadrilateral):     """ ​     :param quadrilateral: 四边形四个点坐标的一维数组表示,[x,y,x,y....]     :return: 四边形二维数组, Polygon四边形对象     """     # 四边形二维数组表示     quadrilateral_array = (quadrilateral).reshape(4, 2)     # Polygon四边形对象,会自动计算四个点,最后四个点顺序为:左上 左下  右下 右上 左上     quadrilateral_polygon = Polygon(quadrilateral_array).convex_hull ​     return quadrilateral_array, quadrilateral_polygon ​ def calculate_iou(actual_quadrilateral, predict_quadrilateral):     """ ​     :param actual_quadrilateral: 预测四边形四个点坐标的一维数组表示,[x,y,x,y....]     :param predict_quadrilateral: 期望四边形四个点坐标的一维数组表示,[x,y,x,y....]     :return:     """     # 预测四边形二维数组, 预测四边形 Polygon 对象     actual_quadrilateral_array, actual_quadrilateral_polygon = to_polygon(actual_quadrilateral)     # 期望四边形二维数组, 期望四边形 Polygon 对象     predict_quadrilateral_array, predict_quadrilateral_polygon = to_polygon(predict_quadrilateral) ​     # 合并两个box坐标,变为8*2 便于后面计算并集面积     union_poly = ((actual_quadrilateral_array, predict_quadrilateral_array))     # 两两四边形是否存在交集     inter_status = (predict_quadrilateral_polygon)     # 如果两四边形相交,则进iou计算     if inter_status:         try:             # 交集面积             inter_area = (predict_quadrilateral_polygon).area             # 并集面积 计算方式一             #union_area =  +  - inter_area             # 并集面积 计算方式二             union_area = MultiPoint(union_poly).             # 若并集面积等于0,则iou = 0             if union_area == 0:                 iou = 0             else:                 # 第一种计算的是: 交集部分/包含两个四边形最小多边形的面积                 iou = float(inter_area) / union_area                 #  第二种: 交集 / 并集(常见矩形框IOU计算方式)                 # iou=float(inter_area) /(+-inter_area)         except .TopologicalError :             print('.TopologicalError occured, iou set to 0')             iou = 0     else:         iou = 0 ​     return iou ​ if __name__ == '__main__':     actual_quadrilateral = [908, 215, 934, 312, 752, 355, 728, 252]     predict_quadrilateral =  [923, 308, 758, 342, 741, 262, 907, 228]     iou = calculate_iou(actual_quadrilateral, predict_quadrilateral)     print(iou) 

避坑指南

运行代码抛出 WinError 126 错误

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

33915fc30a4527babbd8e463e51436cd.png

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

dbb0c1c3a87c48ab183a14e0f8cfb80d.png

最终解决方案:通过 pip uninstall Shapely 卸载原来安装的 Shapely 然后 在 ,如上图,这里下载对应版本的whl文件安装,安装这个whl 就可以解决该问题。

whl文件下载404错误

在 下载制定版本的whl时,出现404错误。如下。

07c0f0fd862c3800ec70bd05801d911a.png

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

【责任编辑:

未丽燕

TEL:(010)68476606】


点赞 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值