¿Es posible dar imágenes de tamaño variable como entrada a una red neuronal convolucional?

17

¿Podemos dar imágenes con tamaño variable como entrada a una red neuronal convolucional para la detección de objetos? Si es posible, ¿cómo podemos hacer eso?


Pero si tratamos de recortar la imagen, perderemos una parte de la imagen y si tratamos de cambiar el tamaño, se perderá la claridad de la imagen. ¿Significa que usar la propiedad de red inherente es lo mejor si la claridad de la imagen es el principal punto de consideración?

Ashna Eldho
fuente

Respuestas:

9

Hay varias formas de hacerlo. La mayoría de estos ya se han cubierto en varias publicaciones en StackOverflow, Quora y otros sitios web de contenido.

Para resumir, la mayoría de las técnicas enumeradas se pueden agrupar en dos clases de soluciones, a saber,

  1. Transformaciones
  2. Propiedad de red inherente

En las transformaciones, uno puede buscar técnicas como

  • Cambiar tamaño , que es la más simple de todas las técnicas mencionadas
  • Recorte , que se puede hacer como una ventana deslizante o un recorte único con pérdida de información

También se puede buscar en redes que tengan la propiedad inherente de ser inmunes al tamaño de la entrada en virtud del comportamiento de la capa que construye la red. Se pueden encontrar ejemplos de esto en términos de,

  • Redes completamente convolucionales (FCN) , que no tienen limitaciones en cuanto al tamaño de entrada porque una vez que se describen los tamaños de kernel y de paso, la convolución en cada capa puede generar salidas de dimensión apropiadas de acuerdo con las entradas correspondientes.

  • Spanial Pyramid Pooling (SPP) , los FCN no tienen una capa densa completamente conectada y, por lo tanto, son independientes del tamaño de la imagen, pero dicen que si uno quisiera usar una capa densa sin considerar las transformaciones de entrada, entonces hay un documento interesante que explica la capa en Una red de aprendizaje profundo.

Referencias

  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

PD: me podría haber perdido citando algunas técnicas. No afirmo que esta sea una lista exhaustiva.

m1cro1ce
fuente
1
Esto suena bien en teoría, pero no funciona en Tensorflow. ¿Alguien tiene alguna implementación para ello?
Hossein
1
@Hossein También encontré algunos problemas en la implementación práctica, pero obtuve un CNN de tamaño variable que funciona en Tensorflow Keras 2.x hoy con algunas limitaciones. He publicado un resumen del enfoque en mi respuesta con respecto a algunos de los detalles prácticos. ¡La mejor de las suertes!
J Trana
4

Las capas convolucionales y las capas de agrupación son independientes de las dimensiones de entrada. Sin embargo, la salida de las capas convolucionales tendrá diferentes tamaños espaciales para imágenes de diferentes tamaños, y esto causará un problema si tenemos una capa completamente conectada después (ya que nuestra capa completamente conectada requiere una entrada de tamaño fijo). Hay varias soluciones para esto:

1. Agrupación global: evite las capas completamente conectadas al final de las capas convolucionales, y en su lugar use la agrupación (como la Agrupación promedio global) para reducir sus mapas de características de una forma de (N, H, W, C) (antes de la agrupación global ) para dar forma (N, 1,1, C) (después del conjunto global), donde:

N = Número de muestras de minibatch
H = Altura espacial del mapa de características
W = Ancho espacial del mapa de características
C = Número de mapas de características (canales)

Como Como se puede ver, la dimensionalidad de salida (N * C) ahora es independiente del tamaño espacial (H, W) de los mapas de características. En caso de clasificación, puede proceder a usar una capa completamente conectada en la parte superior para obtener los logits para sus clases.

2. Agrupación de tamaño variable:Utilice regiones de agrupación de tamaño variable para obtener el mismo tamaño de mapa de características para diferentes tamaños de entrada.

3. Recortar / redimensionar / rellenar imágenes de entrada: puede intentar cambiar la escala / recortar / rellenar sus imágenes de entrada para que todas tengan la misma forma.


En el contexto del aprendizaje por transferencia, es posible que desee utilizar entradas de diferente tamaño que las entradas originales con las que se entrenó el modelo. Aquí hay algunas opciones para hacerlo:

4. Cree nuevas capas completamente conectadas: puede deshacerse completamente de las capas completamente conectadas originales e inicializar una nueva capa completamente conectada con la dimensionalidad que necesita, y entrenarla desde cero.

5. Trate la capa completamente conectada como una convolución: normalmente, damos forma a los mapas de características de (N, H, W, C) a (N, H * W * C) antes de alimentarla a la capa completamente conectada. Pero también puede tratar la capa totalmente conectada como una convolución con un campo receptivo de (H, W). Luego, puede convolver este núcleo con sus mapas de características independientemente de su tamaño (use cero relleno si es necesario) [http://cs231n.github.io/transfer-learning/ ].

Soroush
fuente
1

Tuve que resolver este problema hoy, así que pensé en compartir lo que encontré que funcionó. Descubrí que había bastantes respuestas y curiosidades de "esto podría funcionar en teoría" en la web, pero menos de un práctico "así es como implementas esto concretamente".

Para implementar esto usando Tensorflow Keras, tuve que hacer lo siguiente. Quizás alguien más pueda encontrar que algunos de estos pueden modificarse, relajarse o descartarse.

  1. Establezca la entrada de la red para permitir una entrada de tamaño variable usando "Ninguno" como una dimensión de marcador de posición en input_shape. Vea la respuesta de Francois Chollet aquí .
  2. Utilice capas convolucionales solo hasta que se haya producido una operación de agrupación global (por ejemplo, GlobalMaxPooling2D). Entonces se pueden usar capas densas, etc., porque el tamaño ahora está fijo.
  3. Use un tamaño de lote de 1 solamente. Esto evita tratar con tamaños mixtos dentro de un lote.
  4. Escriba una pequeña secuencia personalizada que cree lotes de tamaño 1 a partir de la lista de entradas. Hice esto para evitar tratar con diferentes tamaños dentro de una sola matriz Numpy.
  5. Use Model.fit_generator en su secuencia personalizada para capacitación y validación. (vs Model.fit)
  6. Por alguna razón, Model.predict_generator apareció incluso cuando se usa la secuencia como se indicó anteriormente. Tuve que recurrir al uso de Model.predict en entradas individuales.

Tenga en cuenta que las llamadas a Model.predict se quejaron del rendimiento, lo que no es sorprendente dada la ineficiencia de la solución, ¡pero funciona!

J Trana
fuente
-2

Sí, simplemente seleccione una red troncal apropiada que no dependa del tamaño de la imagen de entrada para que tenga un valor preciso; la mayoría de las redes satisfacen este criterio.

shimao
fuente
3
No está equivocado, pero su respuesta no es muy informativa: ¿qué hay de expandirlo para explicar por qué la CNN más moderna puede trabajar con imágenes de tamaño variable? Además, ¿cuáles son los límites de esta variabilidad (por ejemplo, no intente mezclar imágenes de diferentes tamaños en el mismo mini lote ...)? La mayoría de las personas que provienen de MLP antiguas (la longitud de entrada es fija) o CNN antiguas (AlexNet y VGG-1X), con sus molestas Flattencapas, no entienden cómo las CNN modernas pueden, en principio, tomar imágenes de cualquier tamaño.
DeltaIV