¿Cómo formatear los datos de la imagen para entrenamiento / predicción cuando las imágenes son de diferente tamaño?


88

Estoy tratando de entrenar mi modelo que clasifica imágenes. El problema que tengo es que tienen diferentes tamaños. ¿Cómo debo formatear mis imágenes / modelo de arquitectura?


2
Muestre lo que ha intentado hasta ahora y lo que parece no funcionar para usted.
Keith John Hutchison

16
Y bam ahí va el código de Inception v4. No estoy de acuerdo con ese comentario estándar. Un poco más de información estaría bien, como el tipo de red del que estamos hablando, pero los votos negativos no están justificados en absoluto. Ese es un problema real allí.
Sunside

4
La pregunta es ¿cómo formatea ImageNet sus datos de imagen para que sean útiles para la capacitación?
mskw

Respuestas:


148

No dijiste de qué arquitectura estás hablando. Como dijo que desea clasificar imágenes, supongo que es una red en parte convolucional y en parte completamente conectada como AlexNet, GoogLeNet, etc. En general, la respuesta a su pregunta depende del tipo de red con la que esté trabajando.

Si, por ejemplo, su red solo contiene unidades convolucionales, es decir, no contiene capas completamente conectadas, puede ser invariable al tamaño de la imagen de entrada. Tal red podría procesar las imágenes de entrada y, a su vez, devolver otra imagen ("convolucional hasta el final"); tendría que asegurarse de que la salida coincida con lo que espera, ya que tiene que determinar la pérdida de alguna manera, por supuesto.

Sin embargo, si está utilizando unidades completamente conectadas, tendrá problemas: aquí tiene un número fijo de pesos aprendidos con los que debe trabajar su red, por lo que las entradas variables requerirían un número variable de pesos, y eso no es posible.

Si ese es tu problema, aquí tienes algunas cosas que puedes hacer:

  • No te preocupes por aplastar las imágenes. Una red podría aprender a darle sentido al contenido de todos modos; ¿La escala y la perspectiva significan algo para el contenido de todos modos?
  • Recorta las imágenes en el centro a un tamaño específico. Si teme que está perdiendo datos, haga varios recortes y utilícelos para aumentar sus datos de entrada, de modo que la imagen original se divida en Ndiferentes imágenes del tamaño correcto.
  • Rellena las imágenes con un color sólido hasta un tamaño cuadrado y luego cambia el tamaño.
  • Haz una combinación de eso.

La opción de relleno podría introducir una fuente de error adicional a la predicción de la red, ya que la red podría (leer: probablemente lo hará) estar sesgada a imágenes que contengan dicho borde relleno. Si necesita algunas ideas, eche un vistazo a la sección Imágenes de la documentación de TensorFlow, hay piezas como resize_image_with_crop_or_padesas que eliminan el trabajo más grande.

En cuanto a no preocuparse por el aplastamiento, aquí hay una parte del proceso de preprocesamiento de la famosa red Inception:

# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.

# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
    distorted_image,
    lambda x, method: tf.image.resize_images(x, [height, width], method=method),
    num_cases=num_resize_cases)

Son totalmente conscientes de ello y lo hacen de todos modos.

Dependiendo de qué tan lejos quiera o necesite ir, en realidad hay un documento aquí llamado Spatial Pyramid Pooling in Deep Convolution Networks for Visual Recognition que maneja entradas de tamaños arbitrarios procesándolas de una manera muy especial.


11
Este tema parece mucho más complicado cuando se trata de la detección de objetos y la segmentación de instancias, porque los tamaños de los cuadros de ancla que también son hiperparámetros deben ajustarse si tiene un conjunto de datos con una gran variación en el tamaño de las imágenes.
CMCDragonkai

Las relaciones de aspecto juegan un papel muy importante para una red que consiste en distinguir entre círculos y elipses.
Hello Goodbye

1
Otra observación general es que los lotes no necesariamente tienen que tener las mismas dimensiones; el primer lote podría tratar con imágenes 4: 3, el segundo con 16: 9, etc., siempre que se cuiden las capas densas.
sunside

1
@Tobitor, siempre haga las entradas de la red lo más cerca posible de los datos reales (prueba o tiempo de inferencia). Si todas sus imágenes son mucho más amplias que altas, también debe modelar su red para procesar sus imágenes de esta manera. Dicho esto, si no puede decir cómo serán sus datos de "uso", tendrá que hacer algunos sacrificios durante el entrenamiento. Y en ese caso, cambiar el tamaño de una imagen de 1000x200 a 256x256 generalmente está bien (imagínese mirando esa placa en un ángulo de 60 grados, ahora es muy aproximadamente cuadrada).
Sunside

2
@Tobitor No hay ningún requisito para que las imágenes sean cuadradas, simplemente es la compensación menos mala si no conoce los tamaños reales de la imagen durante la inferencia. : ^) En cuanto al tamaño, cuanto más pequeño, mejor, pero las imágenes deben ser lo suficientemente grandes como para capturar los detalles más finos requeridos; en términos generales, solo tenga en cuenta que si usted, como experto humano, no puede determinar lo que hay en el imagen, la red tampoco podrá.
Sunside

11

Intente hacer una capa de agrupación piramidal espacial. Luego colóquelo después de su última capa de convolución para que las capas FC siempre obtengan vectores dimensionales constantes como entrada. Durante el entrenamiento, entrene las imágenes de todo el conjunto de datos utilizando un tamaño de imagen particular para una época. Luego, para la siguiente época, cambie a un tamaño de imagen diferente y continúe entrenando.


¿Podría explicar un poco más qué es la "agrupación piramidal espacial" en comparación con la agrupación normal?
Matthieu

por favor lea la combinación de pirámides espaciales en redes convolucionales profundas para el reconocimiento visual en blog.acolyer.org/2017/03/21/convolution-neural-nets-part-2 @Matthieu
Asif Mohammed
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.