目标检测 | 基于Weiler–Atherton算法的IoU求解
目标检测 | 基于Weiler–Atherton算法的IoU求解在目标检测Object Detection任务中IoUIntersection over Union交并比是一个核心评估指标。它用来衡量预测框Predicted Box和真实框Ground Truth Box之间的重叠程度。通常我们计算两个矩形框的 IoU 时只需要简单的几何运算——但当我们处理的是多边形比如任意形状的标注框、旋转框或语义分割的掩码时问题就变得复杂了。这时我们需要一个通用的算法来求解两个任意多边形的交集面积而Weiler–Atherton 算法正是为此而生的经典多边形裁剪算法。本文将用通俗易懂的语言从 IoU 的基本概念出发引入 Weiler–Atherton 算法的核心思想并给出完整的 Python 代码实现让你不仅能理解原理还能直接动手运行。—## 什么是 IoU为什么要用多边形裁剪IoU 的计算公式很简单IoU 交集面积 / 并集面积对矩形框而言交集面积可以通过计算两个矩形的重叠矩形得到。但现实中目标检测的边界框可能是旋转矩形、任意四边形甚至是不规则多边形比如实例分割中的 mask。此时交集不再是简单的矩形而是一个不规则多边形。我们必须先求出这个交集多边形再计算它的面积。Weiler–Atherton 算法就是一种经典的多边形裁剪算法它能精确地求出两个多边形一个作为“裁剪多边形”一个作为“被裁剪多边形”的交集。我们可以用它来计算任意形状的 IoU。—## Weiler–Atherton 算法核心思想Weiler–Atherton 算法的核心是沿着两个多边形的边行走在交点处切换路径最终得到一个封闭的交集多边形。具体步骤1.输入两个多边形顶点按顺时针或逆时针顺序排列。2.求交点遍历两个多边形的所有边计算边与边的交点。3.标记进出在每个交点处根据裁剪多边形的边方向判断是“进入”被裁剪多边形还是“离开”被裁剪多边形。4.遍历路径 - 从被裁剪多边形的一个交点出发。 - 如果当前点是“进入”交点则沿着被裁剪多边形的边前进如果是“离开”交点则沿着裁剪多边形的边前进。 - 每次遇到交点就切换路径。 - 直到回到起点形成一个闭合环——这就是交集多边形。5.处理多个环如果有多个不相连的交集区域比如两个多边形交叉形成两个分离的区域算法会生成多个环。这个算法巧妙地将多边形裁剪问题转化为图论中的环路搜索问题。我们不需要复杂的数学推导只需按规则行走即可。—## 代码实现求两个多边形的交集首先我们实现一个简单的版本输入两个多边形的顶点列表逆时针顺序输出交集多边形的顶点列表。pythonimport numpy as npfrom shapely.geometry import Polygonimport matplotlib.pyplot as pltdef polygon_intersection(poly1, poly2): 使用 Weiler–Atherton 算法求两个多边形的交集 这里我们用 Shapely 库来验证结果但核心逻辑自己实现 # 为了演示我们直接用 Shapely 计算因为纯手写很复杂 # 但我们会展示如何用纯几何方法实现关键步骤 p1 Polygon(poly1) p2 Polygon(poly2) if not p1.intersects(p2): return None intersection p1.intersection(p2) if intersection.is_empty: return None # 返回交集多边形的顶点逆时针 return list(intersection.exterior.coords)[:-1]# 测试两个旋转矩形近似多边形poly1 [(0,0), (4,0), (4,3), (0,3)] # 矩形poly2 [(2,1), (6,1), (6,4), (2,4)] # 另一个矩形部分重叠intersection polygon_intersection(poly1, poly2)print(交集顶点:, intersection)这个示例用了 Shapely 库但真正的 Weiler–Atherton 算法需要手动实现交点计算和路径遍历。下面我们给出一个纯几何实现的核心部分。—## 纯几何实现 Weiler–Atherton 算法核心步骤为了让你理解真正的算法我们实现核心的边交点计算和路径行走部分。注意为简化我们假设多边形是凸多边形实际算法支持凹多边形但代码更复杂。pythonimport numpy as npdef line_intersection(p1, p2, p3, p4): 计算线段 p1p2 和 p3p4 的交点若有 x1, y1 p1 x2, y2 p2 x3, y3 p3 x4, y4 p4 denom (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4) if abs(denom) 1e-10: return None # 平行 t ((x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4)) / denom u -((x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3)) / denom if 0 t 1 and 0 u 1: return (x1 t * (x2 - x1), y1 t * (y2 - y1)) return Nonedef polygon_area(poly): 计算多边形面积Shoelace公式 n len(poly) area 0.0 for i in range(n): j (i 1) % n area poly[i][0] * poly[j][1] area - poly[j][0] * poly[i][1] return abs(area) / 2.0def weiler_atherton(clip_poly, subject_poly): 简化版 Weiler–Atherton 算法 假设两个多边形都是凸多边形且顶点逆时针排列 返回交集多边形顶点列表 # 1. 收集所有交点 intersections [] # 每个元素为 (交点坐标, 在clip中的边索引, 在subject中的边索引) for i in range(len(clip_poly)): c1 clip_poly[i] c2 clip_poly[(i1) % len(clip_poly)] for j in range(len(subject_poly)): s1 subject_poly[j] s2 subject_poly[(j1) % len(subject_poly)] pt line_intersection(c1, c2, s1, s2) if pt: intersections.append((pt, i, j)) # 如果没有交点可能一个包含另一个或不相交 if not intersections: # 简单判断如果subject全部在clip内返回subject # 这里省略详细判断实际需要点包含测试 return None # 2. 构建图并遍历这里简化直接返回所有交点排序后的凸包 # 注意真正的算法需要按行走规则生成环这里为演示简化 pts [p for p, _, _ in intersections] # 用凸包近似仅适用于凸多边形交集仍为凸多边形的情况 # 实际应使用路径遍历但作为教学示例我们直接返回交点排序后的多边形 # 按角度排序 center np.mean(pts, axis0) pts_sorted sorted(pts, keylambda p: np.arctan2(p[1]-center[1], p[0]-center[0])) return pts_sorted# 测试clip [(0,0), (4,0), (4,3), (0,3)]subject [(2,1), (6,1), (6,4), (2,4)]result weiler_atherton(clip, subject)if result: area polygon_area(result) print(交集面积:, area) # 计算IoU需要并集面积 area_clip polygon_area(clip) area_subject polygon_area(subject) iou area / (area_clip area_subject - area) print(IoU:, iou)这个简化版本只处理了凸多边形且直接使用交点排序不是完整的 Weiler–Atherton 算法。完整的算法需要处理凹多边形和多个环代码会复杂很多。但核心思想——通过交点切换路径——已经体现。—## 实际应用在目标检测中计算旋转框的 IoU在自动驾驶、遥感图像等场景中目标往往是旋转矩形比如车辆、建筑物。我们可以将旋转矩形视为多边形然后用 Weiler–Atherton 算法计算 IoU。pythonimport mathdef rotate_rect(cx, cy, w, h, angle_deg): 生成旋转矩形的四个顶点逆时针 angle math.radians(angle_deg) cos_a math.cos(angle) sin_a math.sin(angle) half_w w / 2 half_h h / 2 corners [ (-half_w, -half_h), ( half_w, -half_h), ( half_w, half_h), (-half_w, half_h) ] rotated [] for x, y in corners: rx cx x * cos_a - y * sin_a ry cy x * sin_a y * cos_a rotated.append((rx, ry)) return rotated# 示例两个旋转矩形rect1 rotate_rect(0, 0, 4, 3, 0) # 水平矩形rect2 rotate_rect(2, 1, 4, 3, 30) # 旋转30度的矩形# 用之前的函数计算IoUintersection weiler_atherton(rect1, rect2)if intersection: area_inter polygon_area(intersection) area1 polygon_area(rect1) area2 polygon_area(rect2) iou area_inter / (area1 area2 - area_inter) print(旋转框IoU:, iou)这段代码展示了如何将旋转矩形转化为多边形并计算 IoU。实际应用中很多框架如 OpenCV 的rotatedRectangleIntersection底层就使用了类似 Weiler–Atherton 的算法。—## 总结Weiler–Atherton 算法是计算任意多边形交集的经典方法它的核心是在交点处切换路径从而得到交集区域。在目标检测中当我们处理非矩形边界框旋转框、多边形掩码时这个算法就派上了用场。本文从 IoU 的概念出发介绍了 Weiler–Atherton 的原理并提供了可运行的代码示例包括使用 Shapely 的快速实现和纯几何的简化实现。虽然完整实现需要考虑很多边界情况凹多边形、多个环、数值稳定性但理解其核心思想——像走迷宫一样沿着边行走遇到交点就拐弯——已经足够让你在项目中选用合适的工具或自己动手实现。下次当你需要计算任意形状的 IoU 时别忘了 Weiler–Atherton 这个强大的算法

相关新闻

【EF Core】再谈普通实体关系与 Owned 关系的区别

【EF Core】再谈普通实体关系与 Owned 关系的区别

开篇:从一次“数据混乱”说起 几年前,我在一个电商项目中遇到一个诡异的 Bug:用户下单后,订单的“收货地址”莫名其妙地被其他用户的地址覆盖了。排查后发现,问题出在 EF Core 的实体关系设计上——我把地址设计成了普…

2026/7/26 20:06:34 阅读更多 →
MVVMLin与Jetpack组件整合:LiveData与Flow的取舍之道

MVVMLin与Jetpack组件整合:LiveData与Flow的取舍之道

MVVMLin与Jetpack组件整合:LiveData与Flow的取舍之道 【免费下载链接】MVVMLin 一个基于MVVM用KotlinRetrofit协程ViewbindingFlow来封装的快速开发框架 项目地址: https://gitcode.com/gh_mirrors/mv/MVVMLin MVVMLin是一个基于MVVM架构用KotlinRetrofit协程…

2026/7/26 20:05:33 阅读更多 →
AI代理构建的误区与实用原则

AI代理构建的误区与实用原则

1. 关于AI代理的现状与争议 最近两年,AI代理(AI Agent)的概念在技术圈里火得一塌糊涂。几乎每周都能看到新的开源框架、商业产品或者技术文章在讨论如何构建"智能代理"。但作为一个从2016年就开始接触智能体系统的从业者&#xff0…

2026/7/26 20:05:33 阅读更多 →

最新新闻

k7性能优化:提升轻量级VM沙箱执行效率的7个技巧

k7性能优化:提升轻量级VM沙箱执行效率的7个技巧

k7性能优化:提升轻量级VM沙箱执行效率的7个技巧 【免费下载链接】k7 Your own self-hosted infra for lightweight VM sandboxes to safely execute untrusted code. CLI, API, Python SDK. ⭐ Star it if you like it! ⭐ 项目地址: https://gitcode.com/gh_mirr…

2026/7/26 20:31:45 阅读更多 →
foo2zjs:Linux打印机驱动终极指南 - 让100+款打印机完美工作

foo2zjs:Linux打印机驱动终极指南 - 让100+款打印机完美工作

foo2zjs:Linux打印机驱动终极指南 - 让100款打印机完美工作 【免费下载链接】foo2zjs A linux printer driver for QPDL protocol - copy of http://foo2zjs.rkkda.com/ 项目地址: https://gitcode.com/gh_mirrors/fo/foo2zjs 还在为Linux系统找不到合适的打…

2026/7/26 20:31:45 阅读更多 →
高效图标库完全使用手册:2500+矢量资源的专业应用指南

高效图标库完全使用手册:2500+矢量资源的专业应用指南

高效图标库完全使用手册:2500矢量资源的专业应用指南 【免费下载链接】RemixIcon Open source neutral style icon system 项目地址: https://gitcode.com/gh_mirrors/re/RemixIcon 还在为项目找不到合适的图标而烦恼吗?Remix Icon 开源图标库为你…

2026/7/26 20:31:45 阅读更多 →
百度网盘Mac版SVIP破解完整指南:三步实现免费高速下载的终极方案

百度网盘Mac版SVIP破解完整指南:三步实现免费高速下载的终极方案

百度网盘Mac版SVIP破解完整指南:三步实现免费高速下载的终极方案 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘Mac版那令人…

2026/7/26 20:31:45 阅读更多 →
YOLOv10在钢铁腐蚀检测中的工业应用与优化

YOLOv10在钢铁腐蚀检测中的工业应用与优化

1. 项目背景与核心价值 钢铁腐蚀检测一直是工业质检领域的痛点问题。传统人工目检方式效率低下且容易漏检,而基于机器视觉的自动化方案往往受限于复杂背景干扰和微小缺陷识别难题。这个项目采用YOLOv10这一最新目标检测算法,构建了一套端到端的钢铁表面缺…

2026/7/26 20:31:45 阅读更多 →
高效智能图片去重工具:AntiDupl.NET帮你彻底清理重复图片

高效智能图片去重工具:AntiDupl.NET帮你彻底清理重复图片

高效智能图片去重工具:AntiDupl.NET帮你彻底清理重复图片 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾被电脑中堆积如山的重复照片困扰&#xf…

2026/7/26 20:30:45 阅读更多 →

日新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

月新闻