em relação ao formato de saída para segmentação semântica


9

Ao ler os documentos de segmentação semântica, bem como suas implementações correspondentes, descobri que algumas abordagens usam softmax enquanto outras usam sigmoide para a rotulação em nível de pixel.

Por exemplo, com relação ao papel u-net , a saída é um mapa de recursos com dois canais.

Eu já vi algumas implementações usando o softmax sobre essas duas saídas de canal. Não tenho certeza se meu entendimento a seguir está correto ou não?

Para fins de ilustração, a parte mascarada pertence à classe 1 e a outra parte pertence à classe 2. Apenas assumo duas classes: mascarada ou não.

Eu uso xypara representar o mapa de saída com a forma (1, image_row, image_col, 2). Então, xy[1,0,0,0]representará a probabilidade de pixel em (0,0) pertencente à classe 1, enquanto xy[1,0,0,1]representará a probabilidade de pixel (0,0) pertencente à classe 2. Em outras palavras,xy[1,row,col,0]+xy[1,row,col,1]=1

Meu entendimento está correto?

Respostas:


8

A segmentação semântica é apenas uma classificação estendida, onde você executa a classificação de cada pixel no n_classes.

Digamos que sua entrada seja uma imagem RGB com tamanho (cols,rows,3), você passa um lote dessas imagens dimensionadas (batch_size, cols, rows, 3)para a CNN.

Após realizar cálculos no gráfico de rede, você terá a opção de ter a última camada convolucional n_outputs.

Segmentação binária (pixel sim / não)


Então você pode ter n_outputs = 1e a forma de saída será (batch_size, cols, rows, 1). Mais tarde, você realiza a perda de sigmoiduso de ativação binary_crossentropy. Observe que isso funciona apenas para segmentação binária.

Segmentação MultiClass (vetor de probabilidade em pixels)


Então você tem n_outputs = n_classese a forma de saída será (batch_size, cols, rows, n_classes). Agora vem a parte complicada. Você precisa aplicar softmaxa cada vetor de probabilidade de pixel que geralmente envolve dimensões permutantes, dependendo da estrutura de aprendizado profundo que você está usando. Nesse caso, você usa categorical_crossentropycomo

Em Keras você pode

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)

Na segmentação binária, por que usar a ativação sigmóide em vez do softmax?
Cláudio

2
p1-p
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.