目标检测算法中规则矩形和不规则四边形IOU的Python实现
交并比(Intersection-over-Union,目标IoU),检测目标检测中使用的算法n实一个概念,我们在进行目标检测算法测试时,中规则矩则边重要的形和形I现指标,是不规产生的预测框(candidate bound)与标记框(ground truth bound)的交叠率,即它们的目标交集与并集的比值。最理想情况是检测完全重叠,即比值为1。算法n实
通常,中规则矩则边我们所说的形和形I现目标检测检测的框是规则的矩形框,计算IOU也非常简单,不规一般两种方法:
两个矩形的目标宽之和减去组合后的矩形的宽就是站群服务器重叠矩形的宽,同比重叠矩形的检测高。 右下角的算法n实最小值减去左上角的最大值就是重叠矩形的宽,同比高。上述规则四边形(矩形)IOU计算方式一的 Python实现
def calculate_regular_iou(rec1, rec2): """ computing IoU :param rec1: (y0, x0, y1, x1), which reflects (top, left, 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)) * 1.0 if __name__ == __main__: # (top, left, 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 (top, left, 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__: # (top, left, 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 shapely.errors import TopologicalError from shapely.geometry import Polygon,MultiPoint def to_polygon(quadrilateral): """ :param quadrilateral: 四边形四个点坐标的一维数组表示,[x,y,x,y....] :return: 四边形二维数组, Polygon四边形对象 """ # 四边形二维数组表示 quadrilateral_array = np.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 = np.concatenate((actual_quadrilateral_array, predict_quadrilateral_array)) # 两两四边形是香港云服务器否存在交集 inter_status = actual_quadrilateral_polygon.intersects(predict_quadrilateral_polygon) # 如果两四边形相交,则进iou计算 if inter_status: try: # 交集面积 inter_area = actual_quadrilateral_polygon.intersection(predict_quadrilateral_polygon).area # 并集面积 计算方式一 #union_area = poly1.area + poly2.area - inter_area # 并集面积 计算方式二 union_area = MultiPoint(union_poly).convex_hull.area # 若并集面积等于0,则iou = 0 if union_area == 0: iou = 0 else: # 第一种计算的是: 交集部分/包含两个四边形最小多边形的面积 iou = float(inter_area) / union_area # 第二种: 交集 / 并集(常见矩形框IOU计算方式) # iou=float(inter_area) /(poly1.area+poly2.area-inter_area) except shapely.errors.TopologicalError : print(shapely.errors.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 shapely.geometry import Polygon,MultiPoint 会报错,报错的详细信息如下图:

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

最终解决方案:通过 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错误。如下。

此时改用 chrome 浏览器重新尝试下载,即可解决。
云服务器提供商