背景

来了个自家的工作,精确分割某类目标。图像分辨率较低,环境噪声较多。

失败方案1

在AI吊打一切的时代,自然优先想到用AI来做。实例分割的SOTA全都是大模型,我要在笔记本上训练还是比较困难,于是选择到了YOLOv8-seg,毕竟他家提供的一键训练导出是真的简单。

模型训练出来发现这个分割的边缘是真的能凑合就凑合。简单来说,分割的边缘只是比检测框稍靠近一点点目标罢了,目标的复杂细节根本分割不出来,即使我制作了高精度数据集还是一样。

于是我又尝试着找一些边缘细化的方案。首先肯定有注重于边缘细化的端到端实例分割模型,但我看了看他们的demo视频,我觉得不行,很拉胯。然后又找了一些针对多边形的后期细化方案,一个看起来比较可行的方案是多边形的每一个顶点沿法线移动。这个工作没开源,但基本思路看起来还是没问题的。然而不想在这里浪费时间做实验了,毕竟我又不是做科研的。

失败方案2

既然AI做不好,自然想到用老一套:降噪,梯度。在背景中已经提到,这次工作的图像环境噪声较多,而且这个噪声并不是所谓的随机噪声,单纯是环境中存在很多无法预测的高频背景。

在一个比较理想的情况下,我希望通过目标检测模型先获取一些检测框,然后根据检测框抠一个矩形图片出来,这样就能去掉绝大多数环境噪声了。然后对截取的图像进行直方图均衡化,各种滤波降噪,用Canny算子直接提取图像中剩余的边缘,将边缘进行形态学闭运算,使其连通,形成指示目标轮廓的多边形。提取面积最大的多边形,即为目标的轮廓。

理想很丰满,现实很骨感。这个噪声根本去不掉。。。并且目标部分区域和背景颜色实在是太相近了,即使进行了闭运算,边缘也很难连通。

最终方案

通过目标检测模型获取目标的检测框,抠矩形图片下来,中值滤波强力降噪,Sobel算子沿俩方向扫一遍,求均值,获得梯度图。手动设置梯度图的梯度阈值,忽略较小梯度,保留较大梯度。

这样获得的肯定不是目标的完整外轮廓,并且有些环境噪声还是会留下来。

但因为可视化这块儿做得比较好看,leader非常满意。。。所以说核心技术还是美工。

在这里我用的目标检测模型是YOLOv10m,单类别训练了330 epoch收敛。推理时我发现YOLOv10虽然干掉了NMS,但它实际上是有重合检测框的啊!我是真的服了气了,然后自己又做了NMS。

碎碎念

我知道CV发展是陷入停滞了,但这NMS去得是真的没啥用说实话。以及实例分割就现在这水平不琢磨着细化边缘,光琢磨着刷点,是不是有点离谱了,这多边形真的没比检测框强到哪里去啊!

如果觉得我的文章对你有用,请随意赞赏