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?
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?
Respuestas:
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:
N
diferentes imágenes del tamaño correcto.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_pad
esas 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.
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.