concernant le format de sortie pour la segmentation sémantique

9

En lisant les articles de segmentation sémantique ainsi que leurs implémentations correspondantes, j'ai constaté que certaines approches utilisent softmax tandis que d'autres utilisent sigmoid pour l'étiquetage au niveau des pixels.

Par exemple, en ce qui concerne le papier u-net , la sortie est une carte d'entités à deux canaux.

J'ai vu quelques implémentations utilisant softmax sur ces deux sorties de canal. Je ne sais pas si ma compréhension suivante est correcte ou non?

À des fins d'illustration, la partie masquée appartient à la classe 1 et l'autre partie appartient à la classe 2. Je suppose que deux classes: masquée ou non masquée.

J'utilise xypour représenter la carte de sortie avec une forme (1, image_row, image_col, 2). Ensuite, xy[1,0,0,0]représentera la probabilité de pixel à (0,0) appartenant à la classe 1 tandis que xy[1,0,0,1]représentera la probabilité de pixel (0,0) appartenant à la classe 2. En d'autres termes,xy[1,row,col,0]+xy[1,row,col,1]=1

Ma compréhension est-elle correcte?

user785099
la source

Réponses:

8

La segmentation sémantique est simplement une classification étendue, où vous effectuez une classification de chaque pixel dans le n_classes.

Disons que votre entrée est une image RVB de taille (cols,rows,3), vous passez un lot de ces images dimensionnées (batch_size, cols, rows, 3)au CNN.

Après avoir effectué des calculs dans le graphe de réseau, vous vous retrouverez avec le choix d'avoir la dernière couche convolutionnelle à avoir n_outputs.

Segmentation binaire (pixel par pixel oui / non)


Ensuite, vous pouvez avoir n_outputs = 1et la forme de sortie sera (batch_size, cols, rows, 1). Vous prenez plus tard la perte d' sigmoidutilisation d'activation binary_crossentropy. Notez que cela ne fonctionne que pour la segmentation binaire.

Segmentation MultiClass (vecteur de probabilité pixel par pixel)


Ensuite, vous avez n_outputs = n_classeset la forme de sortie sera (batch_size, cols, rows, n_classes). Vient maintenant la partie délicate. Vous devez appliquer softmaxà chaque vecteur de probabilité de pixel ce qui implique généralement une permutation des dimensions en fonction du cadre d'apprentissage profond que vous utilisez. Dans ce cas, vous l'utilisez categorical_crossentropycomme

À Keras, vous pouvez

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)
stochastic_zeitgeist
la source
Dans la segmentation binaire, pourquoi utiliser l'activation sigmoïde au lieu de softmax?
Claudio
2
@Claudio - Dans la segmentation binaire, vous pouvez supposer que chaque activation de pixel représente la probabilité que ce pixel soit au premier plan , faisant ainsi , la probabilité que ce pixel soit en arrière-plan, il n'est donc pas nécessaire d'avoir une variable distincte pour la même chose. p1p
stochastic_zeitgeist