unet semantic segnet segmentation learning images computer-vision classification tensorflow scene labeling

computer vision - semantic - ¿Cómo implementar la clasificación de píxeles para el etiquetado de escenas en TensorFlow?



semantic segmentation (1)

Para aplicar softmax y usar una pérdida de entropía cruzada , debe mantener intacta la salida final de su red de tamaño batch_size x 256 x 256 x 33 . Por lo tanto, no puede utilizar promedios medios o argmax porque destruiría las probabilidades de salida de su red.

Tiene que recorrer todos los lotes de tamaño x 256 x 256 píxeles y aplicar una pérdida de entropía cruzada a su predicción para este píxel. Esto es fácil con la función tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels) .

Algunas advertencias del documento antes de aplicar el siguiente código:

  • ADVERTENCIA: Esta operación espera logits sin escala , ya que realiza un softmax en logits internamente para mayor eficiencia. No llame a esta operación con la salida de softmax, ya que producirá resultados incorrectos.
  • logits y debe tener la forma [batch_size, num_classes] y el dtype (float32 o float64).
  • las etiquetas deben tener la forma [batch_size] y el dtype int64.

El truco es usar batch_size * 256 * 256 como el tamaño de lote requerido por la función. Vamos a cambiar la forma de logits y labels a este formato. Aquí está el código que utilizo:

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)

A continuación, puede aplicar su optimizador en esa pérdida.

Actualización: v0.10

La documentation de tf.sparse_softmax_cross_entropy_with_logits muestra que ahora acepta cualquier forma para logits , por lo que no es necesario cambiar la forma de los tensores (gracias @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)

Estoy trabajando en un modelo de aprendizaje profundo utilizando TensorFlow de Google . El modelo debe utilizarse para segmentar y etiquetar escenas .

  1. Estoy usando el conjunto de datos SiftFlow que tiene 33 clases semánticas e imágenes con 256x256 píxeles .
  2. Como resultado, en mi capa final utilizando convolución y desconvolución, llego al siguiente tensor (matriz) [256, 256, 33] .
  3. A continuación, me gustaría aplicar Softmax y comparar los resultados con una etiqueta semántica de tamaño [256, 256] .

Preguntas: ¿Debo aplicar promediado promedio o argmax a mi capa final para que su forma se convierta en [256,256,1] y luego recorrer cada píxel y clasificar como si estuviera clasificando 256x256 instancias? Si la respuesta es sí, ¿cómo, si no, qué otras opciones?