关于语义分割的输出格式

机器算法验证 机器学习 深度学习 计算机视觉 张量流
2022-03-28 15:17:50

在阅读语义分割论文及其相应的实现时,我发现一些方法使用 softmax,而另一些则使用 sigmoid 进行像素级标记。

例如,对于u-net paper,输出是具有两个通道的特征图。

我已经看到一些在这两个通道输出上使用 softmax 的实现。我不确定我的以下理解是否正确?

出于说明目的,蒙面部分属于 1 类,另一部分属于 2 类。我只假设两类:蒙面或非蒙面。

我用xy形状 (1, image_row,image_col,2) 来表示输出映射。然后,xy[1,0,0,0]将表示 (0,0) 处的像素属于第 1 类xy[1,0,0,1]的概率,而将表示像素 (0,0) 属于第 2 类的概率。换句话说,xy[1,row,col,0]+xy[1,row,col,1]=1

我的理解正确吗?

1个回答

语义分割只是扩展分类,您可以将每个像素分类到n_classes.

假设您的输入是一个大小为 的 RGB 图像(cols,rows,3),您将一批大小相同的图像传递(batch_size, cols, rows, 3)给 CNN。

在网络图中执行计算后,您最终将选择拥有最后一个卷积层n_outputs

二进制分割(逐像素是/否)


然后你有 can haven_outputs = 1并且输出形状将是(batch_size, cols, rows, 1). 您稍后会承担sigmoid激活使用binary_crossentropy损失。请注意,这仅适用于二进制分割。

多类分割(逐像素概率向量)


然后你有n_outputs = n_classes,输出形状将是(batch_size, cols, rows, n_classes). 现在是棘手的部分。您需要应用softmax到每个像素概率向量,这通常涉及根据您使用的深度学习框架置换维度。在这种情况下,您可以使用categorical_crossentropy

在 Keras 你可以

final_conv_out = Convolution2D(n_classes, 1, 1)(conv9)

x = Reshape((n_classes, rows*cols))(final_conv_out)
x = Permute((2,1))(x)

# seg is a pixelwise probability vector sized (batch_size, rows*cols, n_classes)
seg = Activation("softmax")(x)