RECONOCIMIENTO DE IMAGEN CON REDES NEURONALES TUTORIAL

Las redes neuronales son una técnica que se puede utilizar para el reconocimiento de imágenes. Este tutorial le mostrará cómo utilizar la red neuronal de perceptrón de múltiples capas para el reconocimiento de imágenes. Neuroph ha incorporado soporte para reconocimiento de imágenes y asistente especializado para el entrenamiento de redes neuronales de reconocimiento de imágenes. Se puede encontrar una biblioteca de reconocimiento de imágenes simple en el paquete org.neuroph.contrib.imgrec, mientras que el asistente de reconocimiento de imágenes en el Neuroph Studio se encuentra en [Menú principal> Archivo> Nuevo> Red neuronal de reconocimiento de imágenes]

Este tutorial explicará lo siguiente:

1. Principio básico de cómo se utilizan los perceptrones multicapa para el reconocimiento de imágenes (aquí se describe un enfoque posible)
2. Cómo entrenar redes neuronales para el reconocimiento de imágenes con Neuroph Studio
3. Cómo usar redes neuronales capacitadas para el reconocimiento de imágenes en sus aplicaciones

Este tutorial es para Neuroph v2.6.

1. Reconocimiento de imágenes con Perceptron multicapa

Cada imagen puede representarse como una matriz bidimensional, donde cada elemento de esa matriz contiene información de color para un píxel. (Foto 1)

Imagen 1. Colores de la imagen

Cada color se puede representar como una combinación de tres componentes básicos de color: rojo, verde y azul.

Imagen 2. Sistema de color RGB

Entonces, para representar alguna imagen en un sistema RGB podemos usar tres matrices bidimensionales, una para cada componente de color, donde cada elemento corresponde a un píxel de imagen.

int [] [] redValues
int [] [] greenValues
int [] [] blueValues

Por ejemplo, si el píxel en la ubicación [20, 10] tiene un color RGB [33, 66, 181], tenemos

redValues [10] [20] = 33;
greenValues [10] [20] = 66;
blueValues [10] [20] = 181;

Las dimensiones de cada una de estas matrices son [imageHeight] [imageWidth]

Podemos unir estas tres matrices en una sola matriz unidimensional para que contenga todos los valores rojos, luego todos verdes y al final todos los valores azules. Así es como creamos flattenedRgbValues [] array.
La dimensión de esta matriz es [imageHeight * imageWidth * 3].
Ahora podemos usar esta matriz unidimensional como entrada para la red neuronal, y para entrenar redes neuronales para reconocerlas o clasificarlas. Los perceptrones de múltiples capas son tipos de redes neuronales adecuadas para estas tareas (Figura 3).

Figura 3. Alimentar perceptrón de múltiples capas con información de color de la imagen. Cada neurona de entrada corresponde a un componente de color (RGB) de un píxel de imagen en una ubicación específica.

Cada neurona de salida corresponde a una imagen o clase de imagen. Entonces, si la salida de red es [1, 0, 0] eso significa que la entrada se reconoce como ‘imagen A’.
Podemos crear un conjunto de entrenamiento para entrenar la red neuronal como un conjunto de pares de entrada (aplanar matrices de rgb) y vectores de salida (donde la neurona de imagen correspondiente es 1).
La red puede ser entrenada usando el algoritmo de aprendizaje Backpropagation. En la siguiente sección brindaremos algunos detalles sobre la red neuronal y el algoritmo de aprendizaje.

2. Entrenando red neuronal para el reconocimiento de imágenes con Neuroph Studio

Neuroph Studio proporciona un entorno para crear y entrenar redes neuronales, que se pueden guardar como componentes java listos para usar. También proporciona una herramienta especializada de reconocimiento de imágenes para entrenar redes neuronales para el reconocimiento de imágenes. Crear y entrenar una red neuronal para el reconocimiento de imágenes consiste en los siguientes pasos:

  1. Crear proyecto Neuroph
  2. Crear red neuronal de reconocimiento de imágenes
  3. Red de trenes
  4. Red de prueba
  5. Guardar y desplegar red

Paso 1. Para crear el Proyecto Neuroph haz clic en File>New Project

Seleccione Proyecto Neuroph y haga clic en Next.

Ingrese el nombre y la ubicación del proyecto, haga clic en Finish.

Esto creará el nuevo Proyecto Neuroph.

Paso 2. A continuación, para crear una red de reconocimiento de imágenes, haga clic en File>New File.

Seleccione el tipo de archivo de Reconocimiento de imagen y haga clic en Next.

A continuación, elija las imágenes que desea que se reconozcan, seleccionando archivos de imagen individuales o agregando la dirección completa de la imagen. También puede hacer la edición básica de imágenes, como recortar y cambiar el tamaño, abriendo el editor de imágenes simple con el botón de edición.

Color Mode: puede utilizar el reconocimiento de imágenes en el modo de color completo o en el modo binario en blanco y negro. El modo binario en blanco y negro representa píxeles como [0, 1] y por lo tanto usa menos neuronas de entrada. Para algunas aplicaciones (como el reconocimiento de caracteres, por ejemplo), el modo binario en blanco y negro puede ser una solución óptima.

En el siguiente paso, elija una imagen que no debe ser reconocida, lo que ayudará a evitar el reconocimiento falso. Usualmente estos son bloques de todas las imágenes rojas, todas verdes y todas azules, pero también incluyen otras.
Cuando pruebe su red de reconocimiento de imágenes, descubrirá qué tiene sentido incluir aquí.

Luego, ingrese la Etiqueta de conjunto de entrenamiento y la Resolución de muestreo de imagen y haga clic en Next.

Training Set Label: como puedes crear varios conjuntos de entrenamiento mientras experimentas con la red, es una buena práctica etiquetarlos.

Resolución de muestreo de la imagen (ancho x alto): todas las imágenes proporcionadas se escalarán a este tamaño (ancho x alto). Escalar imágenes las hará más pequeñas, y serán más fáciles y rápidas de aprender. Las dimensiones de la imagen determinan el tamaño del vector de entrada y el número de neuronas en la capa de entrada. (si obtiene excepciones de Java Heap para alguna dimensión, intente aumentar el tamaño de almacenamiento dinámico para JVM)

Para empezar, puede usar la configuración predeterminada (resolución 20×20 y modo de color), y solo proporcionar las imágenes.

El siguiente paso es crear la red neuronal.

Para crear la red neuronal, debe ingresar lo siguiente:

Network label: la etiqueta de la red neuronal, que es útil cuando crea varias redes neuronales para el mismo problema, y las está comparando.
Transfer function: esta configuración determina qué función de transferencia usarán las neuronas. En la mayoría de los casos, puede dejar la configuración predeterminada ‘Sigmoid’, pero a veces el uso de ‘Tanh’ puede proporcionarle mejores resultados.
Hidden Layers Neuron Counts: Esta es la configuración más importante que determina la cantidad de capas ocultas en la red y el número de neuronas en cada capa oculta. Las capas ocultas son capas entre la capa de entrada y salida. El truco es tener el menor número posible de capas y neuronas que puedan aprender con éxito el conjunto de entrenamiento. La menor cantidad de neuronas: el aprendizaje más rápido, una mejor generalización. La cantidad adecuada de neuronas ocultas también depende de la cantidad de neuronas de entrada y salida, y el mejor valor puede determinarse experimentando. Para empezar, prueba imágenes de 8×8 y una capa oculta con 12 neuronas, que es la configuración predeterminada. Si quiere aumentar el número de neuronas, simplemente ingrese el número, por ejemplo, ’12’ neuronas. Si desea agregar más de una capa de neuronas, ingrese la cantidad de neuronas en cada capa separadas por espacio. Por ejemplo,

Haga clic en el botón ‘Finish‘ para crear la red neuronal. Después de hacer clic en el botón, se abrirá una nueva ventana con la red neuronal creada.

Paso 3. Red de entrenamiento. Para entrenar a la red, seleccione el conjunto de entrenamiento del árbol del proyecto y haga clic en el botón ‘Train‘.

Esto abrirá el diálogo para establecer los parámetros de aprendizaje. Use la configuración de aprendizaje predeterminada y simplemente haga clic en el botón Train.

Esto comenzará a entrenar y abrirá el gráfico de aprendizaje en red y el contador de iteraciones, para que pueda superar el proceso de aprendizaje. Si el aprendizaje se atasca (el error total de la red no baja), puedes probar con diferentes números de neuronas, capas o parámetros de aprendizaje. Para la velocidad de aprendizaje y el impulso, use los valores entre [0, 1], y para el error, se recomienda un valor pequeño por debajo de 0.1. Algunos valores de la regla del pulgar son 0.2 para la tasa de aprendizaje y 0.7 para el impulso.

Paso 4. Prueba de red

Después de haber entrenado la red, puede probar cómo funciona en el panel de prueba. Haga clic en el botón ‘Select Test Image‘ para establecer la imagen de entrada para la red, y la salida de la red se mostrará como la lista de etiquetas de imagen y salidas de neurona correspondientes. La imagen reconocida corresponde a la neurona con el mayor rendimiento. Puede probar todo el conjunto de datos haciendo clic en el botón “Test whole data set“.

Paso 5. Guardar la red neuronal

Para guardar la red neuronal como componente de Java, haga clic en [Menú principal > File > Save] y use la extensión .nnet. La red se guardará como seralized perceptrón multicapa objeto.

3. Uso de reconocimiento de imagen Neuroph en sus aplicaciones

Aquí está el código de muestra que muestra cómo usar la red neuronal de reconocimiento de imágenes creada y entrenada con Neuroph Studio. Puede ejecutar esta muestra, solo especifique los nombres de archivo correctos para la red neuronal y alguna imagen de prueba.

import org.neuroph.core.NeuralNetwork;
	import org.neuroph.contrib.imgrec.ImageRecognitionPlugin;
	import java.util.HashMap;
	import java.io.File;
	import java.io.IOException;

	public class ImageRecognitionSample {

	 public static void main(String[] args) {
	    // load trained neural network saved with Neuroph Studio (specify some existing neural network file here)
	    NeuralNetwork nnet = NeuralNetwork.load("MyImageRecognition.nnet"); // load trained neural network saved with Neuroph Studio
	    // get the image recognition plugin from neural network
	    ImageRecognitionPlugin imageRecognition = (ImageRecognitionPlugin)nnet.getPlugin(ImageRecognitionPlugin.class); // get the image recognition plugin from neural network

	    try {
	         // image recognition is done here (specify some existing image file)
	        HashMap<String, Double> output = imageRecognition.recognizeImage(new File("someImage.jpg"));
	        System.out.println(output.toString());
	    } catch(IOException ioe) {
	        ioe.printStackTrace();
	    }
	 }
	}

El reconocimiento de imagen real se realiza con solo una llamada de método desde ImageRecognitionPlugin:

imageRecognition.recognizeImage(new File("someImage.jpg"));

ImageRecognitionPlugin proporciona una interfaz de reconocimiento de imágenes simple para la red neuronal. Puede reconocer imágenes de diversas fuentes, como Archivo, Imagen Buffered o URL. Por ejemplo:

imageRecognition.recognizeImage(new URL("http://www.example.com/someImage.jpg"));

Para obtener más información, consulte las clases en el paquete org.neuroph.contrib.imgrec.

Para usar clases de reconocimiento de imágenes, debe agregar una referencia a neuroph.jar en su proyecto (haga clic derecho en project> Properties > Libraries > Add JAR/Folder)

SOLUCIÓN DE PROBLEMAS

1. Escalar las dimensiones de la imagen utilizadas para el entrenamiento a las mismas dimensiones para evitar posibles problemas.
2. Use el mismo color y las dimensiones de imagen para entrenamiento y reconocimiento. Si el color no es importante para usar en blanco y negro ya que el entrenamiento es más rápido.
3. Si se queda sin memoria, las excepciones para imágenes más grandes aumentan el tamaño de la JVM con las opciones -Xms y -Xmx.

 

MÁS INFORMACIÓN

Redes neuronales en el procesamiento de imágenes http://www.egmont-petersen.nl/Journal-papers/Egmont-PR-Review2002.pdf
Muchas otras redes neuronales y documentos relacionados con el procesamiento de imágenes http://www.egmont-petersen.nl/nn -review.html

Gracias Michael Egmont-Petersen por esta contribución.