É possível fornecer imagens de tamanho variável como entrada para uma rede neural convolucional?

17

Podemos fornecer imagens com tamanho variável como entrada para uma rede neural convolucional para detecção de objetos? Se possível, como podemos fazer isso?


Mas se tentarmos cortar a imagem, perderemos uma parte da imagem e se tentarmos redimensionar, a clareza da imagem será perdida. Isso significa que usar a propriedade de rede inerente é o melhor se a clareza da imagem for o principal ponto de consideração?

Ashna Eldho
fonte

Respostas:

9

Existem várias maneiras de fazer isso. A maioria delas já foi abordada em várias postagens no StackOverflow, Quora e outros sites de conteúdo.

Para resumir, a maioria das técnicas listadas pode ser agrupada em duas classes de soluções, a saber:

  1. Transformações
  2. Propriedade de rede inerente

Nas transformações, pode-se procurar técnicas como

  • Redimensionar , que é a mais simples de todas as técnicas mencionadas
  • Recorte , que pode ser feito como uma janela deslizante ou recorte único com perda de informações

Pode-se também olhar para redes que possuem propriedades inerentes a serem imunes ao tamanho da entrada em virtude do comportamento da camada que constrói a rede. Exemplos disso podem ser encontrados em termos de,

  • Redes totalmente convolucionais (FCN) , que não têm limitações quanto ao tamanho da entrada, porque, uma vez descritos os tamanhos do kernel e da etapa, a convolução em cada camada pode gerar saídas de dimensão apropriadas de acordo com as entradas correspondentes.

  • Spatial Pyramid Pooling (SPP) , as FCNs não têm uma camada densa totalmente conectada e, portanto, são agnósticas ao tamanho da imagem, mas digamos que se alguém quiser usar uma camada densa sem considerar as transformações de entrada, existe um artigo interessante que explica a camada. uma rede de aprendizado profundo.

Referências:

  1. https://www.quora.com/How-are-variably-shaped-and-sized-images-given-inputs-to-convoluted-neural-networks
  2. /ai/2008/how-can-neural-networks-deal-with-varying-input-sizes
  3. https://discuss.pytorch.org/t/how-to-create-convnet-for-variable-size-input-dimension-images/1906

PS : Talvez eu tenha esquecido de citar algumas técnicas. Não alegando que esta seja uma lista exaustiva.

m1cro1ce
fonte
11
Parece bom em teoria, mas não funciona no Tensorflow. Alguém tem alguma implementação para isso?
Hossein
11
@Hossein Também me deparei com alguns problemas na implementação prática, mas tenho uma CNN de tamanho variável trabalhando no Tensorflow Keras 2.x hoje com algumas limitações. Publiquei um esboço da abordagem em minha resposta com relação a alguns detalhes práticos. Boa sorte!
J Trana 17/01
4

As camadas convolucionais e as próprias camadas de pool são independentes das dimensões de entrada. No entanto, a saída das camadas convolucionais terá tamanhos espaciais diferentes para imagens de tamanhos diferentes, e isso causará um problema se tivermos uma camada totalmente conectada posteriormente (uma vez que nossa camada totalmente conectada requer uma entrada de tamanho fixo). Existem várias soluções para isso:

1. Pool Global: Evite camadas totalmente conectadas no final das camadas convolucionais e, em vez disso, use o pool (como o Global Average Pooling) para reduzir seus mapas de recursos de uma forma de (N, H, W, C) (antes do pool global ) com a forma (N, 1,1, C) (após o pool global), em que:

N = Número de amostras de minibatch
H = Altura espacial do mapa de recursos
W = Largura espacial do mapa de recursos
C = Número de mapas de recursos (canais)

Como Como pode ser visto, a dimensionalidade da saída (N * C) agora é independente do tamanho espacial (H, W) dos mapas de recursos. No caso de classificação, você pode usar uma camada totalmente conectada na parte superior para obter os logits para suas aulas.

2. Pool de tamanho variável:Use regiões de pool de tamanho variável para obter o mesmo tamanho do mapa de recursos para diferentes tamanhos de entrada.

3. Recortar / redimensionar / adicionar imagens de entrada: Você pode tentar redimensionar / recortar / adicionar imagens de entrada a todas com a mesma forma.


No contexto do aprendizado de transferência, convém usar entradas de tamanhos diferentes das entradas originais com as quais o modelo foi treinado. Aqui estão algumas opções para fazer isso:

4. Crie novas camadas totalmente conectadas: Você pode abandonar completamente as camadas totalmente conectadas originais e inicializar uma nova camada totalmente conectada com a dimensionalidade necessária e treiná-la do zero.

5. Trate a camada totalmente conectada como uma convolução: Normalmente, remodelamos os mapas de recursos de (N, H, W, C) para (N, H * W * C) antes de alimentá-la na camada totalmente conectada. Mas você também pode tratar a camada totalmente conectada como uma convolução com um campo receptivo de (H, W). Em seguida, você pode simplesmente envolver esse kernel com seus mapas de recursos, independentemente do tamanho (use preenchimento zero, se necessário) [http://cs231n.github.io/transfer-learning/ ].

Soroush
fonte
1

Eu tive que resolver esse problema hoje, então pensei em compartilhar o que achei que funcionava. Descobri que havia algumas respostas e petiscos "isso poderia funcionar na teoria" na Web, mas menos do que na prática "eis como você implementa isso concretamente".

Para implementar isso usando o Tensorflow Keras, tive que fazer o seguinte. Talvez alguém ache que alguns deles podem ser modificados, relaxados ou descartados.

  1. Defina a entrada da rede para permitir uma entrada de tamanho variável usando "Nenhum" como uma dimensão de espaço reservado na input_shape. Veja a resposta de Francois Chollet aqui .
  2. Use camadas convolucionais apenas até que uma operação de pool global ocorra (por exemplo, GlobalMaxPooling2D). Em seguida, camadas densas etc. podem ser usadas porque o tamanho agora está fixo.
  3. Use apenas um tamanho de lote 1. Isso evita lidar com tamanhos variados em um lote.
  4. Escreva uma pequena sequência personalizada que crie lotes do tamanho 1 a partir da lista de entradas. Fiz isso para evitar lidar com tamanhos diferentes dentro de uma única matriz Numpy.
  5. Use Model.fit_generator em sua Sequência customizada para treinamento e validação. (vs Model.fit)
  6. Por alguma razão, Model.predict_generator apareceu mesmo ao usar a sequência como acima. Eu tive que recorrer ao Model.predict em entradas individuais.

Observe que as chamadas para Model.predict se queixaram do desempenho - o que não é surpreendente, dada a ineficiência da solução - mas funciona!

J Trana
fonte
-2

Sim, basta selecionar uma rede de backbone apropriada que não dependa do tamanho da imagem de entrada para ter algum valor preciso - a maioria das redes atende a esse critério.

shimao
fonte
3
Você não está errado, mas sua resposta não é muito informativa - que tal expandi-la para explicar por que a CNN mais moderna pode trabalhar com imagens de tamanho variável? Além disso, quais são os limites para essa variabilidade (por exemplo, não tente misturar imagens de tamanhos diferentes no mesmo mini-lote ...)? A maioria das pessoas provenientes de MLPs antiquados (o comprimento da entrada é fixo) ou CNNs antiquados (AlexNet e VGG-1X), com suas Flattencamadas traquinas , não entendem como as CNNs modernas podem, em princípio, capturar imagens de qualquer tamanho.
DeltaIV 24/01/19