¿Cómo preparar / aumentar imágenes para la red neuronal?

41

Me gustaría usar una red neuronal para la clasificación de imágenes. Comenzaré con CaffeNet pre-entrenado y lo entrenaré para mi aplicación.

¿Cómo debo preparar las imágenes de entrada?

En este caso, todas las imágenes son del mismo objeto pero con variaciones (piense: control de calidad). Están en escalas / resoluciones / distancias / condiciones de iluminación algo diferentes (y en muchos casos no conozco la escala). Además, en cada imagen hay un área (conocida) alrededor del objeto de interés que la red debe ignorar.

Podría (por ejemplo) recortar el centro de cada imagen, que se garantiza que contiene una parte del objeto de interés y ninguna del área ignorada; pero parece que tiraría información, y los resultados no serían realmente la misma escala (quizás una variación de 1.5x).

Aumento de conjunto de datos

He oído hablar de la creación de más datos de entrenamiento por cultivo aleatorio / espejo / etc., ¿hay un método estándar para esto? ¿Algún resultado sobre cuánta mejora produce a la precisión del clasificador?

Alex I
fuente

Respuestas:

35

La idea con Neural Networks es que necesitan poco preprocesamiento ya que el algoritmo, que es el encargado de aprender las características, realiza el trabajo pesado.

Los ganadores del Data Science Bowl 2015 tienen una excelente reseña sobre su enfoque, por lo que la mayor parte del contenido de esta respuesta se tomó de: Clasificación del plancton con redes neuronales profundas . Le sugiero que lo lea, especialmente la parte sobre Preprocesamiento y aumento de datos .

- Cambiar el tamaño de las imágenes

En cuanto a diferentes tamaños, resoluciones o distancias, puede hacer lo siguiente. Simplemente puede cambiar el tamaño del lado más grande de cada imagen a una longitud fija.

Otra opción es usar openCV o scipy. y esto redimensionará la imagen para que tenga 100 cols (ancho) y 50 filas (alto):

resized_image = cv2.resize(image, (100, 50)) 

Otra opción es usar el módulo scipy, usando:

small = scipy.misc.imresize(image, 0.5)

- Aumento de datos

El aumento de datos siempre mejora el rendimiento, aunque la cantidad depende del conjunto de datos. Si desea aumentar los datos para aumentar artificialmente el tamaño del conjunto de datos, puede hacer lo siguiente si el caso se aplica (no se aplicaría si, por ejemplo, fueran imágenes de casas o personas donde si las gira 180 grados perderían toda la información pero no si los volteas como lo hace un espejo):

  • rotación: aleatorio con ángulo entre 0 ° y 360 ° (uniforme)
  • traducción: aleatorio con desplazamiento entre -10 y 10 píxeles (uniforme)
  • reescalado: aleatorio con factor de escala entre 1 / 1.6 y 1.6 (log-uniforme)
  • volteo: sí o no (bernoulli)
  • corte: aleatorio con ángulo entre -20 ° y 20 ° (uniforme)
  • estiramiento: aleatorio con factor de estiramiento entre 1 / 1.3 y 1.3 (log-uniforme)

Puede ver los resultados en las imágenes del tazón de Data Science.

Imágenes preprocesadas

Imágenes preprocesadas

versiones aumentadas de las mismas imágenes

ingrese la descripción de la imagen aquí

-Otras técnicas

Estos tratarán con otras propiedades de imagen como la iluminación y ya están relacionados con el algoritmo principal, más como un simple paso de preprocesamiento. Consulte la lista completa en: Tutorial de UFLDL

wacax
fuente
1
También vale la pena mirar el color para el aumento de datos.
David C. Bishop
¿También puede compartir el código para la rotación y corte, etc.? @wacax
Arsenal Fanatic
Ustedes pueden usar un paquete como keras para el aumento de datos.
Ricardo Cruz
2
Para cualquiera que tenga problemas con la importación del módulo scipy.misc. Usted necesita import scipy.misc. stackoverflow.com/questions/13581593/…
eleijonmarck
En cuanto al cambio de tamaño de la imagen, ¿qué método se usa generalmente en los métodos más modernos, por ejemplo, los que se usan en ImageNet?
HelloGoodbye
2

Si bien la respuesta de wacax es completa y realmente explicativa, me gustaría agregar un par de cosas en caso de que alguien tropiece con esta respuesta.

En primer lugar, la mayoría scipy.miscde imagen funciones relacionadas ( imread, imsave, imresizeERC) han llegado a ser obsoleto en favor de cualquiera de ImageIO o skimage .

En segundo lugar, recomendaría encarecidamente el imgaug de la biblioteca de Python para cualquier tarea de aumento. Es realmente fácil de usar y tiene prácticamente todas las técnicas de aumento que desee usar.

John Doe
fuente