语义分割只是扩展分类,您可以将每个像素分类到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)