4、多边形标注:语义分割中的多边形标注技巧与顶点控制

语义分割的数据标注,说白了就是给图像里的每个像素打上类别标签。但实际项目中,我们很少真的去画像素——太慢了。主流做法是用多边形去勾勒目标轮廓,然后内部自动填充。

我刚开始做分割标注时,总觉得多边形就是围着目标点一圈就行。结果呢?模型训练出来,边缘锯齿严重,小目标直接漏检。后来才明白,顶点怎么放、放多少、顺序对不对,直接影响标注质量和模型效果。

4.1 多边形标注的核心概念

多边形标注,就是用一系列有序顶点围成一个闭合区域。每个顶点是一个二维坐标点 (x, y),首尾相连形成封闭多边形。

关键公式:多边形面积(Shoelace 公式)

S = 0.5 * | Σ (x_i * y_{i+1} - x_{i+1} * y_i) |

这个公式我经常用来验证标注是否自交。如果算出来面积异常小或为负,说明顶点顺序可能反了。

一个合格的多边形标注,需要满足三个条件:

  • 闭合性:首尾顶点相连,没有缺口
  • 非自交:边与边之间不能交叉
  • 顶点顺序一致:要么全顺时针,要么全逆时针

嗯,这里要注意。不同标注工具对顶点顺序的要求不一样。有的工具默认顺时针,有的默认逆时针。我建议你在项目开始前,先统一约定好顺序规则。

4.2 顶点放置的核心技巧

顶点怎么放,是门手艺活。放多了,标注成本高;放少了,轮廓不准。我总结了一套「三区放置法」:

区域类型 顶点密度 典型场景
高曲率区 密集(每 5-10 像素一个点) 动物耳朵、车轮边缘、文字拐角
低曲率区 稀疏(每 30-50 像素一个点) 车身侧面、建筑物墙面、道路标线
直线段 仅端点(2 个点) 矩形物体、窗户、广告牌

我在项目中遇到过最典型的错误,就是有人在直线段上放了一堆顶点。你想想看,一条直线放 10 个点,不仅浪费标注时间,还会让模型学到不必要的抖动。

个人习惯:我一般先放 4-6 个关键顶点勾勒大致轮廓,然后在高曲率区域补点。这样效率最高,而且不容易漏掉重要特征。

4.3 顶点顺序与方向

顶点顺序看似小事,实际上坑很多。我见过一个团队,标注员有的顺时针画,有的逆时针画,结果模型训练时 loss 死活降不下去。

为什么会这样?因为很多分割模型在计算损失时,会假设多边形顶点顺序一致。如果混用,梯度方向就乱了。

我建议统一采用顺时针顺序。原因很简单:大多数标注工具默认顺时针,而且顺时针的顶点列表更容易做数据增强(比如旋转、翻转)。

我曾经踩过的坑:在做多边形裁剪时,如果顶点顺序是逆时针,裁剪后的结果可能会翻转。后来我加了一个自动检测顺序的脚本,发现顺序不对就反转列表。这个脚本现在还在我的工具包里。

4.4 顶点数量控制

顶点数量直接影响标注效率和模型精度。太少,轮廓粗糙;太多,标注成本高,而且容易过拟合到噪声。

我一般遵循「20-50 规则」:

  • 小目标(面积 < 1000 像素²):8-15 个顶点
  • 中目标(面积 1000-10000 像素²):15-30 个顶点
  • 大目标(面积 > 10000 像素²):30-50 个顶点

超过 50 个顶点,我建议你检查一下是不是标注得太细了。除非是极其复杂的轮廓(比如树叶边缘),否则 50 个点足够描述任何物体。

经验值:一个 512×512 的图像,平均每个目标 20-25 个顶点,标注质量和效率的平衡最好。这是我做了 10 万张图后总结出来的。

4.5 多边形标注的常见错误与避坑

我整理了一份「多边形标注避坑清单」,都是实际项目中踩过的:

错误类型 表现 解决方法
顶点自交 多边形内部出现交叉区域 标注工具开启自交检测,或使用 Shoelace 公式验证
顶点冗余 直线段上放多个顶点 只保留端点,中间点删除
顶点缺失 高曲率区域顶点太少 在曲率最大处补点,每 5-10 像素一个
顺序混乱 混用顺时针和逆时针 统一约定顺时针,脚本自动校正
边缘溢出 顶点超出目标真实边界 放大图像到 200% 后再标注

我曾经因为「边缘溢出」这个错误,导致一批标注数据全部返工。当时标注员在 100% 视图下标注,结果顶点都飘到背景里去了。后来我强制要求标注时至少放大到 200%,这个问题就再没出现过。

4.6 多边形标注的知识体系

下面这张图,是我对多边形标注核心知识的总结。你可以把它当作一个快速参考:

多边形标注知识体系 多边形标注 顶点放置技巧 顶点顺序与方向 顶点数量控制 常见错误与避坑 高曲率区密集 低曲率区稀疏 直线段仅端点 统一顺时针约定 脚本自动校正顺序 小目标 8-15 点 中目标 15-30 点 大目标 30-50 点 自交 / 冗余 / 缺失 顺序混乱 / 边缘溢出

4.7 实践建议

最后,分享几个我在实际项目中用到的工具和流程:

  1. 标注前先做模板:对常见物体(车辆、行人、交通标志)预先定义顶点数量范围,标注员照着模板画,一致性会好很多。
  2. 用脚本做质量检查:我写了一个小脚本,自动检查顶点数量、顺序、自交情况。标注完成后跑一遍,能过滤掉 80% 的低质量标注。
  3. 定期做校准:每周抽 50 张图,让两个标注员独立标注同一张图,然后计算顶点位置的 IoU。如果 IoU 低于 0.85,说明标注标准需要重新对齐。

一个小技巧:如果你用 Labelme 或 CVAT 做标注,可以开启「自动吸附」功能。它会自动把顶点吸附到物体边缘,能省不少时间。但注意,吸附阈值别设太大,否则容易吸到背景上去。

多边形标注看起来简单,但真正做好,需要理解顶点与轮廓的关系,也需要在实践中不断积累手感。希望这些经验能帮你少走一些弯路。