034、实例分割重叠粘连难以区分?Mask R-CNN 输出后处理与轮廓精修方案
一、从一次“翻车”调试说起
去年做工业零件分拣项目,Mask R-CNN 跑出来的结果让我差点砸键盘——两个紧挨着的螺丝垫片,模型输出的 mask 直接糊成一团,IoU 高达 0.85 以上,后处理用 NMS 怎么调阈值都分不开。更离谱的是,有些 mask 边缘锯齿严重,导致后续抓取位姿计算直接偏了 3 毫米。
当时我盯着终端里那一串 False Positive 的日志,突然意识到:模型训练得再好,后处理这层“最后一公里”要是拉胯,整个系统就是废的。今天这篇笔记,就是我当时踩坑后整理出来的实战方案,专治各种“粘连、重叠、锯齿”疑难杂症。
二、Mask R-CNN 输出到底长啥样?先别急着调参
很多新手拿到模型输出就直接上 NMS,这是第一个坑。Mask R-CNN 的原始输出包含三部分:边界框回归值、分类置信度、以及一个 28x28 的二进制 mask(注意,不是原图尺寸!)。这个 28x28 的 mask 需要经过 RoI Align 的反向映射和双线性插值才能恢复到原图分辨率。
这里踩过坑:直接对 28x28 的 mask 做形态学操作,结果放大到原图后边缘全是马赛克。正确做法是先做双线性插值上采样到原图尺寸,再做后处理。代码里我习惯这样写: