如何在TensorFlow中实现场景标注的逐像素分类?

Goo*_*han 17 classification computer-vision scene labeling tensorflow

我正在使用Google的TensorFlow开发深度学习模型.该模型应用于分割和标记场景.

  1. 我使用的是SiftFlow数据集,它有33个语义类256x256像素的图像.
  2. 结果,在我使用卷积和反卷积的最后一层,我得到了下面的张量(数组)[256,256,33].
  3. 接下来我想应用Softmax并将结果与​​大小为[256,256]的语义标签进行比较 .

问题: 我应该将均值平均值或argmax应用于我的最后一层,使其形状变为[256,256,1],然后循环遍历每个像素并进行分类,好像我在对256x256实例进行分类?如果答案是肯定的,如果没有,还有什么其他选择?

Oli*_*rot 12

要应用SOFTMAX并使用交叉熵损失,你必须保持完整的规模网络的最终输出的batch_size×256×256×33.因此,您不能使用均值平均值或argmax,因为它会破坏网络的输出概率.

您必须循环遍历所有batch_size x 256 x 256像素,并将交叉熵损失应用于此像素的预测.内置功能非常简单tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels).

在应用以下代码之前,来自文档的一些警告:

  • 警告:此操作需要未缩放的日志,因为它在内部执行logmax以提高效率.不要使用softmax的输出调用此op,因为它会产生不正确的结果.
  • logits并且必须具有[batch_size,num_classes]和dtype(float32或float64)的形状.
  • 标签必须具有[batch_size]形状和dtype int64形状.

诀窍是使用batch_size * 256 * 256函数所需的批量大小.我们将重塑logitslabels为此格式.这是我使用的代码:

inputs = tf.placeholder(tf.float32, [batch_size, 256, 256, 3])  # input images
logits = inference(inputs)  # your outputs of shape [batch_size, 256, 256, 33] (no final softmax !!)
labels = tf.placeholder(tf.float32, [batch_size, 256, 256])  # your labels of shape [batch_size, 256, 256] and type int64

reshaped_logits = tf.reshape(logits, [-1, 33])  # shape [batch_size*256*256, 33]
reshaped_labels = tf.reshape(labels, [-1])  # shape [batch_size*256*256]
loss = sparse_softmax_cross_entropy_with_logits(reshaped_logits, reshaped_labels)
Run Code Online (Sandbox Code Playgroud)

然后,您可以针对该损失应用优化程序.


更新:v0.10

文件tf.sparse_softmax_cross_entropy_with_logits显示,现在接受任何形状logits,所以没有必要重塑张量(感谢@chillinger):

inputs = tf.placeholder(tf.float32, [batch_size, 256, 256, 3])  # input images
logits = inference(inputs)  # your outputs of shape [batch_size, 256, 256, 33] (no final softmax !!)
labels = tf.placeholder(tf.float32, [batch_size, 256, 256])  # your labels of shape [batch_size, 256, 256] and type int64

loss = sparse_softmax_cross_entropy_with_logits(logits, labels)
Run Code Online (Sandbox Code Playgroud)