单个类中没有标签的语义分割

Posted

技术标签:

【中文标题】单个类中没有标签的语义分割【英文标题】:Semantic segmentation without labels in a single class 【发布时间】:2021-03-09 15:48:07 【问题描述】:

我对语义分割有点陌生。我正在尝试对有缺陷的图像进行分割。 我使用注释工具对缺陷图像进行了注释,并为每个图像创建了蒙版。我想预测图像是否有缺陷以及它的确切位置。但我的问题是我的缺陷在所有图像中看起来都不一样。示例:钢上的缺陷——钢破损、腐蚀表面等。我只是想对图像是否有缺陷以及它的位置进行分类。那么用这些被认为是缺陷的所有类型来训练神经网络是错误的,即使不是所有的东西看起来都一样?

我想对缺陷进行二进制分割,使其没有缺陷。如果我不正确,我该如何对缺陷和非缺陷图像进行分割?

【问题讨论】:

【参考方案1】:

您首先必须明确定义您的问题和目标:

如果您只想检测图像是否有缺陷,这是一个二元分类问题,您会影响每个图像的标签(0 或 1)。 如果您想近似地定位缺陷(如边界框),这是一个对象检测问题,可以通过一个或多个类来实现。 如果您想精确定位缺陷(例如为了执行测量),最好是语义分割实例分割。 如果要对缺陷进行分类,则需要为要分类的每个缺陷创建类。

没有神奇的解决方案,因为它取决于您的项目目标。我可以给你以下建议,因为我在一个类似的项目上实习过:

仔细查看您的数据,如果您有数千张图像,则创建语义分割数据集需要很长时间。使用data augmentation techniques 变得更聪明。 如果要对缺陷进行分类,请确保每种类型都有足够的缺陷来训练您的网络。如果您的网络在每个时期只发现一种缺陷类型,它就无法学会检测它。 确保您的网络可以检测到您提供的缺陷(例如,不是两个像素的划痕或对齐缺陷)。

执行语义分割以仅知道是否存在缺陷似乎过大,因为这是一个漫长而复杂的过程(重建图像,Unet 中的中间图像的内存,大量计算)。如果您真的想应用此方法,您可以创建一个阈值来检测检测到的缺陷像素数是否允许将图像分类为“存在缺陷”。

【讨论】:

嗨,我正在尝试执行是否存在缺陷,并在没有任何类分离的情况下精确定位它。当然,我也会尝试多标签分割,但我想知道我尝试的是正确的。例如,如果我们有一个像 Oxford_iit_pets 这样的数据集。我希望它能够检测宠物并对其进行定位,而不会将它们标记为狗或猫,并且总体上标记为宠物。 最简单的方法是使用两个类(缺陷和无缺陷)的语义分割,然后设置一个阈值将图像分类为呈现默认。您必须注意类之间的不平衡(因为“准确性”不相关 - towardsdatascience.com/…)。 “最难”的方法是先判断图像是否有缺陷,然后再检测,但这样可以显示出更好的结果。最好的就是尝试! 我没有使用无缺陷图像。它只是一个具有缺陷部分作为基本事实掩码的类。因为缺陷形状变化很大,这就是我感到困惑的原因。 你的意思是没有缺陷类是没有任何标签的地面真相掩码? 只用一节课试试,它可以工作(狗也有各种形状)!如果没有,也许你将不得不分成两个子类(比如说圆形和纵向缺陷)。也许实例分割也会更合适。【参考方案2】:

一个类应该足以满足您的用例。如果您希望能够区分不同类型的缺陷,您可以尝试为该类创建属性。所以这个类是一个像素是否有缺陷,属性是破损、腐蚀像素等。然后你可以训练一个模型来检测语义类上的裂缝,另一个模型来识别它是哪种类型的缺陷是。

确保使用支持创建属性的注释工具。就个人而言,我使用 hasty.ai,因为他们的自动化助手很棒!但我想大多数工具应该都能做到。

【讨论】:

以上是关于单个类中没有标签的语义分割的主要内容,如果未能解决你的问题,请参考以下文章

语义分割(研究现状技术基础)

基于语义分割Ground Truth(GT)转换yolov5目标检测标签(路面积水检测例子)

语义分割(研究现状技术基础)

使用 U-Net 作为单层进行语义分割的输入标签

图像语义分割方法

数据增强图像数据生成器 Keras 语义分割