尧图精选

边缘检测指标全解析:从Canny到深度学习的ODS/OIS/AP数学推导

🕒 发布时间:2026/10/2 1:29:12 📁 来源:尧图网络
做边缘检测的人大概都经历过这样一个尴尬时刻深度模型输出的边缘概率图肉眼明显比 Canny 精致可真值评估时却不知道该怎么量化“好多少”。我两年前复现一篇边缘检测论文时就被卡在这——Canny 有固定调参套路深度网络输出的是连续概率图拿二值 Mask 算 IoU 又太苛刻最后逼着自己把 ODS/OIS/AP 这套指标从数学到实现完整啃了一遍。这篇文章就是我从 Canny 到深度学习的脉络里把边缘检测指标进化史、以及 ODS/OIS/AP 的数学推导一次性讲清楚。无论你是刚接触边缘检测的学生还是论文写到一半被评测协议折磨的工程师这篇都值得收藏。1. 从Canny说起为什么边缘检测需要专门的“尺子”1.1 Canny是怎么工作的又留下了什么难题Canny 边缘检测器是 1986 年提出的经典算法直到今天仍然能打。它的流程大家应该不陌生先用高斯核平滑图像然后计算梯度幅值和方向再做非极大值抑制NMS去掉宽边缘最后用双阈值加滞后连接把边缘点串起来。注意Canny 的输出是一张二值图每个像素要么是边缘、要么不是没有“这条边有 70% 可能是边缘”这种说法。这带来一个实际问题Canny 有两个超参数高阈值、低阈值还有 σ 这个尺度参数。阈值调高了边缘断断续续阈值调低了纹理和噪声全被当成边缘。不同参数下输出的二值图差异巨大到底怎么评价哪组参数更好早期做法很朴素就是“肉眼看效果”。但肉眼不可复现也没法公平比较两个算法。所以边缘检测从很早起就需要一套统一的评价体系。这个问题在 Canny 时代就存在只是当时大家默认靠视觉验收。等到深度学习兴起网络直接输出连续概率图问题被放大了一个概率图有无数种二值化方式你取 0.3 当阈值是一种结果取 0.7 又完全是另一种结果。没有统一的“尺子”算法对比就是各说各话。1.2 像素级对比的陷阱边缘位置差1个像素就不算对吗最容易想到的评价方法是逐像素 IoU 或者准确率。预测边缘图跟真值边缘图每个像素对齐对齐了就 TP没对齐就 FP。听起来很公平但实际跑一次就会发现 IoU 低得离谱。原因是边缘本质上是一条线宽度通常只有 1 到 2 个像素。同一个物体的边缘不同标注者画出的位置可能差 1 到 3 个像素人眼看都觉得“这就是那条边”。可逐像素 IoU 会把这些轻微偏移全部判成错误一个 3 像素宽的标签和一个 2 像素宽的预测重叠区域稍差一点IoU 直接掉一半。更麻烦的是边缘真值本身是模糊的。一个边缘到底算完整还是断裂取决于你容忍多大程度的灰度变化。像素级对比把这种歧义全部变成了惩罚导致算法明明语义正确分数却很惨。所以边缘检测界的共识是预测边缘点只要落在真值边缘的某个小邻域内就算匹配成功。这个邻域通常用欧氏距离阈值 δ 控制比如 BSDS 数据集上默认取 0.0075 倍对角线长度作为匹配容忍距离。这样既保留了位置要求又不会因为 1 个像素的偏差就把整条边判死。1.3 评测的真正目标平衡“漏检”与“误检”边缘检测算法有两个天然矛盾的目标。一个是“完整性”真值边缘上的点最好全部被检测出来这对应高召回率另一个是“纯净性”检测出来的边缘点最好全部是真实边缘这对应高精度。任何算法都在这两者之间走钢丝。你敢把阈值调低召回率上去了但误检一大堆把阈值调高精度上去了边缘又断了。Canny 的双阈值本质上就是在找这个平衡深度学习输出概率图后我们也是通过调整阈值来移动这个平衡点。所以一套合理的评测指标必须能同时表达“完整性”和“纯净性”并且允许在不同平衡点之间做比较。这正是 Precision、Recall、F-measure、ODS、OIS、AP 这套体系存在的意义。理解了这一点后面所有公式都有了直觉基础。2. Precision/Recall/F-measure边缘指标的第一块基石2.1 边缘匹配先说清楚怎样才算“检测到了”在计算任何指标之前必须先把“预测边缘点”和“真值边缘点”的对应关系定下来。这是整套评测里最容易含糊、也最影响结果的地方。常见做法是定义真值边缘点集合 (G)预测边缘点集合 (P)。对每个预测点 (p \in P)如果在 (G) 中存在某个真值点 (g) 满足 (|p - g|_2 \le \delta)就认为 (p) 是一个真正例 TP否则是假正例 FP。同时对每个真值点 (g)如果存在至少一个预测点落在它的 (\delta) 邻域内就认为这个真值点被检测到了没被任何预测点覆盖的真值点算假负例 FN。注意这里有一个细节一个真值边缘点理论上只能被一个预测点匹配。如果预测边缘在某个区域特别密集多个预测点都落在同一个真值点的邻域内贴心的实现会做一一匹配避免一个真值点被重复“刷 TP”这会人为膨胀 precision。这一点后面踩坑部分会再提。2.2 Precision、Recall与F-measure怎么算有了 TP、FP、FN三个基本指标直接定义[ \text{Precision} \frac{TP}{TP FP} ]Precision 的意思是你预测出来的边缘点里有多少是真正靠近真值边缘的。预测量越大FP 可能越多precision 下降。[ \text{Recall} \frac{TP}{TP FN} ]Recall 的意思是真值边缘里有多少被你成功检测到了。检测结果越保守漏检越多recall 下降。单独的 Precision 和 Recall 都不能评价算法好坏。一个只输出 3 个点的算法 precision 可以是 1.0但 recall 惨不忍睹一个把整张图全标成边缘的算法 recall 可以是 1.0但 precision 低到没法看。所以需要把它们合并成一个分数。最常用的合并方式是 F-measure特别是 F1[ F_1 \frac{2 \cdot \text{Precision} \cdot \text{Recall}}{\text{Precision} \text{Recall}} ]为什么用调和平均而不是算术平均因为调和平均对较小值更敏感。如果 precision 和 recall 差异很大F1 会被拉低这符合直觉一个“只准但漏”或“全但不准”的算法都不算好的边缘检测器。只有两者都高时F1 才会接近 1。2.3 一个阈值不够所以才有PR曲线Canny 这类传统算法直接输出二值图计算一次 precision、recall、F1 就结束了。但深度网络输出的是概率图 (S(x, y))取值范围在 0 到 1 之间。我们不可能只取一个阈值因为不同阈值对应完全不同的二值图。取阈值 (t)可得到二值预测[ P_t {(x, y) \mid S(x, y) \ge t} ]当 (t) 很高时只有非常确信的像素会被当作边缘结果稀疏precision 高、recall 低。当 (t) 很低时几乎所有像素都可能成为边缘结果密集recall 高、precision 低。从小到大扫描阈值就能得到一组“精确率-召回率”点。把这条曲线画出来就是 PR 曲线。后面要讲的 ODS、OIS、AP本质上都是在这条曲线或其变体上取统计量。3. ODS、OIS、AP完整推导从阈值扫描到曲线积分3.1 形式化定义概率图、阈值、真值匹配这一节是重点我会把 ODS、OIS、AP 逐个推导清楚。先定义完整评测环境。数据集有 (N) 张图像第 (i) 张图像的真值边缘图为 (G_i)网络输出的边缘概率图为 (S_i)。我们准备一组阈值 (t_1, t_2, \dots, t_M)通常会从接近 0 扫到接近 1比如 0.01 到 0.99 取 99 个点。对每个阈值 (t_k)对每张图像 (i) 做二值化得到 (P_i(t_k))然后按照上一节的匹配规则得到这张图像在这个阈值下的 (TP_i(t_k))、(FP_i(t_k))、(FN_i(t_k))。这里的匹配距离 (\delta) 统一固定。有了这些基础统计量三种指标就可以定义了。3.2 ODS推导全数据集固定阈值下的最优F值ODS 的全称是 Optimal Dataset Scale中文常翻译为“最优数据集尺度”。核心思想是整个数据集上只用一个阈值找出让全局 F-measure 最大的那个阈值。先对每个阈值 (t_k)跨所有图像累计预测结果[ TP(t_k) \sum_{i1}^{N} TP_i(t_k) ][ FP(t_k) \sum_{i1}^{N} FP_i(t_k) ][ FN(t_k) \sum_{i1}^{N} FN_i(t_k) ]注意这里不是先算每张图的 precision 再平均而是把整个数据集当成分割后的“大图”直接统计全局 TP/FP/FN。对于边缘像素数差异较大的图像这种全局累计会更看重边缘像素量大的图。然后计算全局 precision 和 recall[ P(t_k) \frac{TP(t_k)}{TP(t_k) FP(t_k)} ][ R(t_k) \frac{TP(t_k)}{TP(t_k) FN(t_k)} ]再计算对应的 F1[ F(t_k) \frac{2 P(t_k) R(t_k)}{P(t_k) R(t_k)} ]ODS 就是所有阈值下 F1 的最大值[ \text{ODS} \max_{t_k} F(t_k) ]这个定义等价于在全局 PR 曲线上找离右上角最近的那个点。它的物理含义是假设模型已经训练好部署时只允许设置一个固定阈值全数据集的平均表现能到多少。这也是工业落地上最常见的使用方式。3.3 OIS推导每张图独立阈值下的最优F值OIS 全称是 Optimal Image Scale意思是“最优图像尺度”。它放松了“全局使用同一阈值”这个限制允许每张图像单独挑选自己最优的阈值然后再取平均。对第 (i) 张图像在阈值 (t_k) 下单独计算该图的 precision、recall 和 F1[ F_i(t_k) \frac{2 P_i(t_k) R_i(t_k)}{P_i(t_k) R_i(t_k)} ]然后取出这张图所有阈值里最大的 F1[ \text{OIS}i \max{t_k} F_i(t_k) ]最终 OIS 是所有图像 OIS_i 的平均值[ \text{OIS} \frac{1}{N} \sum_{i1}^{N} \text{OIS}_i ]为什么 OIS 通常比 ODS 高因为每张图都能“开小灶”。有的图对比度低适合较低阈值有的图纹理多适合较高阈值。全局固定阈值不可能同时满足所有图的偏好但 OIS 允许每张图选自己的最优解所以上限更高。OIS 的意义在于衡量模型输出的“相对排序质量”。哪怕全局阈值不完美只要每张图都有某个合适的阈值能把边缘提出来OIS 就会高。这在自动化后处理时可参考性不如 ODS但在对比算法特征提取能力时很有价值。3.4 AP推导PR曲线下面积的离散实现AP 全称是 Average Precision即平均精度。它不再关心某个特定阈值而是把整个 PR 曲线的形状变成单一分数。在边缘检测评测里AP 通常这样算还是对每个阈值 (t_k)计算全局 (P(t_k)) 和 (R(t_k))。当阈值从低到高变化时recall 会从高降到低precision 会从低到高。把这一系列点画成曲线面积就是 AP[ \text{AP} \int_{0}^{1} P(R) , dR ]实际计算时只能用离散近似。假设阈值按 (R) 从大到小排序得到一串点 ((R_1, P_1), (R_2, P_2), \dots, (R_M, P_M))一种实现是用梯形法[ \text{AP} \approx \sum_{k2}^{M} \frac{P_k P_{k-1}}{2} (R_{k-1} - R_k) ]注意这里的 (R) 是单调递减的所以 (R_{k-1} - R_k) 是正数。另一种常见实现是“最大精度插值”[ \text{AP} \sum_{k1}^{M} (R_k - R_{k-1}) \max_{j \ge k} P_j ]最大精度插值的思想是在某个 recall 区间内precision 取后续能达到的最大值避免因为局部抖动而低估面积。信息检索里常用这种插值边缘检测开源代码中两种都有人用所以跨代码库对比数字时要格外小心。如果阈值采样点无限密梯形法和最大精度插值会收敛到同一个值。但在有限采样下阈值点越少AP 越低这是复现时最容易踩的坑之一。3.5 一张表看懂ODS/OIS/AP的差异我整理了一个对比表方便直观理解三者区别指标全称含义阈值策略数学表达反映能力ODS最优数据集尺度全数据集固定一个阈值(\max_t F(t))基于全局累计 TP/FP/FN部署时用一个固定阈值能达到的均衡水平OIS最优图像尺度每张图各自最优阈值(\frac{1}{N}\sum_i \max_t F_i(t))模型提取结构信息的上限不要求全局校准AP平均精度扫描全部阈值取 PR 曲线下面积(\int_0^1 P(R)dR)综合排序质量与具体阈值解耦实际论文里大家习惯把 ODS 和 OIS 报告成 F1 分数比如 0.803AP 也报告成百分比或分数。三个指标一起看基本能判断一个算法是“阈值好调”还是“结构提取强”。4. 从Canny到深度学习指标如何伴随算法进化4.1 Canny时代的调参本质就是“单图阈值扫描”回到 Canny 时代虽然没有深度学习概率图但调参过程其实已经隐含着 ODS/OIS 的思想。Canny 的双阈值里高阈值决定哪些强边缘能可靠保留低阈值决定弱边缘是否延续。你调低阈值检测结果变密recall 升 precision 降调高阈值则反过来。如果在一张图上手动调 Canny 参数找到一个视觉上最好看的平衡点这个过程就等价于在 PR 曲线上选一个 F 值最高的点。Canny 论文里其实也提到用“查全率和查准率”来分析算子性能只是当时没有形成大规模评测协议。传统边缘检测算法通常输出二值图无法直接计算 PR 曲线。但研究者会改变参数比如梯度阈值、σ得到多个不同密度下的输出然后画出 PR 曲线。这种“参数扫描”和深度学习里的“阈值扫描”是同构的只是前者参数空间更大后者只有阈值一维。4.2 深度学习输出概率图评测协议完美对接深度边缘检测网络如 RCF、BDCN、PiDiNet输出通常不是二值图而是一个连续的概率图。这个概率图经过简单的阈值扫描就能直接喂给 PR 曲线和 ODS/OIS/AP 这套评测协议。所以传统算法时代酝酿的评测思路到深度学习时期不但没被推翻反而成了标配。以 BSDS500 数据集为例标准评价流程是这样的网络输出概率图后先做非极大值抑制NMS把边缘细化成 1-2 像素宽的线条然后用一组阈值扫描每个阈值生成一张二值边缘图接着把每张图与真值边缘图做 δ 邻域匹配统计所有阈值下的 P/R/F最后计算 ODS、OIS、AP。输出概率图的另一个好处是评测不再依赖某一个阈值的偶然表现。哪怕某个模型在默认阈值下分数一般它仍然可能因为在多个阈值下保持稳定的高精度而获得不错的 AP。4.3 为什么今天仍然沿用这套指标你可能想问深度学习都发展这么多年了为什么评测指标还停留在几十年前的思路原因有三。第一边缘真值的“歧义性”不会因为模型变强而消失。人眼认为合理的边缘位置可以有轻微偏移逐像素比较永远不现实真值匹配加容差是绕不开的机制。第二ODS/OIS/AP 这套指标确实能区分模型能力差异。它同时刻画了“位置精确度”“结构完整性”和“阈值鲁棒性”在近几年的边缘检测论文里高分模型的 ODS/OIS/AP 几乎都一致地高。第三可复现性好协议成熟。BSDS500、NYUDv2 等数据集都提供了标准评测代码大家用同一套逻辑数字可以直接比。这说明边缘检测的核心评价逻辑比特征提取方式更稳定。Canny 靠手工设计梯度阈值深度网络靠学习特征但两者最终都要回答同一个问题预测边缘到底在多大程度上与真值一致。这个问题用“匹配PR 曲线”来回答目前依然是最可靠的方案。4.4 新指标尝试与ODS/OIS/AP的互补关系当然这套指标并非完美。一个经常被提到的缺陷是它只衡量像素级边缘位置不衡量边缘的语义连续性。两条边缘在像素上都很靠近真值但一条断成四五段另一条完整连接AP 和 ODS 可能差不多但人眼感受差别巨大。所以近年也出现了一些补充指标比如统计“边缘连通组件数量”“骨架误差”等。还有工作直接用语义分割的 IoU 来衡量边缘区域把边缘膨胀成窄带再比较缓解了像素级偏移问题。但这些新指标并没有完全取代 ODS/OIS/AP更多是作为附加分析出现。原因很现实审稿人熟悉这套指标公开发布的标准评测结果也都是这套指标新指标很难一下子建立起同等影响力。所以我的建议是论文报告时ODS/OIS/AP 作为主指标再补充一两个面向连续性和拓扑性的统计量会让评价更立体。5. 复现评测指标时最常踩的坑5.1 匹配容忍度δ不同源码默认值能差出0.5个点这是我在复现时最先踩的坑。BSDS500 的标准评测代码里匹配容忍度 (\delta) 默认取图像对角线长度的 0.0075 倍。对常见的 481×321 图像对角线约 578 像素δ 大约是 4.3 像素。看起来相当宽松。但有些源码为了更严格直接把 δ 设成 1 或 2 像素有些复现代码甚至把 δ 设成 0完全取消容差。不同 δ 下同一个模型的 ODS 可能差 0.5 到 1 个点。我在对比不同论文数字时发现有一篇论文的 AP 明显偏高查代码后发现它的匹配距离比其他工作宽松了很多。所以拿到一个开源评测代码第一步先确认 δ 的计算方式。如果数据集不是标准 BSDS最好按对角线比例设置并在论文方法里写清楚。5.2 NMS要不要做直接决定AP的可比性边缘检测模型输出概率图后通常要做一个标准的非极大值抑制。这个 NMS 沿着梯度方向找局部最大值把边缘压成薄薄一条线。如果不做 NMS模型输出的边缘可能有 2-3 像素宽在容差匹配下一个真值点附近可能有多个预测点TP 数量也会变多。听起来好像不做 NMS 会占便宜但实际上窄带预测会让 precision 在低阈值时下降更快PR 曲线形状变化明显AP 和 ODS 都会受影响。很多论文里的 ODS 数字是在做了 NMS 之后报告的。你如果直接拿概率图算结果可能比论文低 1 到 2 个点不是算法不行是后处理没做。复现时一定要看原文是“single-scale output”还是“multi-scale fusion output”以及是否包含 NMS。标准做法是评估前先跑一次 NMS再进入阈值扫描。5.3 阈值采样数量与PR曲线积分方式阈值采样数量对 ODS 影响不大但对 AP 影响非常大。你可以想象 PR 曲线是一条很曲折的线阈值只取 10 个点梯形面积会漏掉中间的大片区域取 100 个点曲线就会更精细。我在另一个复现实验里发现把阈值采样从 30 增加到 100AP 数字能提升 1.5 个百分点以上。所以报告 AP 时必须固定采样数量。一般情况下最少取 50 个点取 100 个点更稳。同时积分方式也要统一。前面提到梯形式和最大精度插值两种方法结果会有差异。如果你想跟某篇论文严格对比最好直接使用该论文的附加代码而不是自己另写一份。5.4 稀疏边缘和弱标注带来的数值抖动还有一类问题是数据本身带来的。某些图像里真值边缘只覆盖很小一块区域比如一个茶杯放在纯白桌上真值边缘可能只有几百个像素。这种情况下一个误检点就能让 precision 从 0.9 掉到 0.5。我在一个实际数据集上跑评测时发现 OIS 的方差很大。后来排查原因是有些图像真值边缘太少算法只要在这些区域多输出几条线单张图的 F1 就剧烈波动把平均值拉低。解决办法是在报告 ODS/OIS/AP 的同时附上 PR 曲线图并单独检查那些边缘稀疏的样本。如果数据集里这类图占比高可以按边缘像素数做加权统计避免少量极短真值主导整体分数。5.5 多标注真值的聚合策略很多数据集每张图有多个标注者比如 BSDS500 每张图通常有多个手工标注版本。标准评测里预测边缘只要匹配任意一个真值版本就算 TP。但也有一种更严格的做法要求预测边缘必须同时接近所有标注版本才算 TP。这两种策略得到的数字差不少。我在实际使用中习惯用“任意真值匹配”作为主报告因为边缘真值本身存在主观性多版本真值本来就是“模糊正确”的反映。但如果你做的是消融实验需要在同一策略下比较否则很容易产生错误结论。常见的聚合策略大概有三种我做了一个简单对比聚合策略说明适用场景任意真值匹配预测点只要靠近任一真值版本就为 TP主评测标准做法所有真值匹配预测点要靠近所有真值版本才算 TP对位置精度要求极高真值融合后匹配把多个真值融合成概率权重图再做阈值匹配结合语义边缘评估如果你在复现一篇论文先看它的评测代码里到底用的是哪种。很多论文不会详细描述这一点源码里却可能藏着答案。6. 我把这套指标用到实际项目后的几点体会这套评测指标用久了最大的体会是ODS、OIS、AP 三个数字背后其实是三个不同的问题。ODS 回答“你敢不敢用一个固定阈值部署”OIS 回答“模型结构到底学到了多少边缘信息”AP 回答“模型输出的排序质量是否可靠”。我在实际工业项目里会优先关注 ODS因为部署时不可能每张图都单独调阈值。如果 ODS 偏低AP 再高落地时也要额外写一堆自适应阈值逻辑。还有一次我做边缘检测后处理优化发现直接调阈值能把 ODS 提升 0.2但 AP 没动。后来我想明白了AP 衡量的是模型本身的排序能力后处理只能在固定排序下平移选择点。模型不变PR 曲线的上包络基本不变AP 就不会大幅变化。这个结论帮我省了很多无用功想提 AP必须改进网络输出本身想提 ODS可以通过校准确阈值实现。最后一个小建议复现任何边缘检测论文拿到源码后先别急着跑模型先把它的评测代码跑通。用论文提供的模型预测结果跑一遍评测看看能不能复现出论文里的 ODS/OIS/AP。这一步能帮你过滤掉至少一半的复现误差。评测协议里的各种隐藏细节只有亲自动手才记得住。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →