¿Cómo utilizar el algoritmo genético para la reconstrucción de imágenes?

Estás leyendo la publicación: ¿Cómo utilizar el algoritmo genético para la reconstrucción de imágenes?

El algoritmo genético está inspirado en la evolución biológica de los cromosomas y se utiliza principalmente en la selección de características óptimas para varios tipos de problemas. El algoritmo genético básicamente sigue el enfoque de los algoritmos heurísticos para encontrar la mejor solución posible cercana a la solución óptima. Este algoritmo tiene una variedad de aplicaciones en todos los campos, la mayoría en problemas de optimización. También se puede utilizar para la reconstrucción de imágenes para obtener las imágenes en su forma original. Este artículo está enfocado en aplicar el algoritmo genético para esta interesante aplicación de reconstrucción de imágenes.

Tabla de contenido

  1. Una introducción a los algoritmos genéticos.
  2. ¿Qué es la reconstrucción de imágenes?
  3. Reconstrucción de imágenes mediante algoritmos genéticos
  4. Resumen

Una introducción a los algoritmos genéticos.

Los algoritmos genéticos se utilizan básicamente en tareas de optimización donde estos algoritmos siguen el enfoque metaheurístico para obtener la mejor solución óptima entre todas las soluciones candidatas. Los algoritmos genéticos operan en la jerarquía de los cromosomas biológicos y el algoritmo intenta obtener la solución más adecuada para pasar a la siguiente generación.

¿Está buscando un repositorio completo de bibliotecas de Python utilizadas en ciencia de datos, echa un vistazo aquí.

Los algoritmos genéticos operan inicialmente en un grupo de las mejores soluciones posibles llamado población inicial donde el clúster contiene la mejor solución posible al problema. Cada una de las soluciones en el grupo se clasifica por ciertos parámetros y se denominan genes en los algoritmos genéticos, los genes del algoritmo genético se clasificarán según los parámetros establecidos. Los genes que tienen todas las habilidades establecidas se pasarán a una función de aptitud para determinar la aptitud de las mejores soluciones posibles seleccionadas del grupo de soluciones candidatas al problema. Si la mejor solución posible tiene la capacidad de heredar toda la funcionalidad de la función de aptitud, esa solución se transmitirá al siguiente conjunto de generaciones. La operación general de los algoritmos genéticos ocurre en tres niveles: selección, mutación y cruce. Tratemos de entender estas terminologías estándar de algoritmos genéticos.

Selección

La selección en algoritmos genéticos es una terminología estándar utilizada para seleccionar la mejor solución posible entre las soluciones candidatas. La selección juega un papel importante en los algoritmos genéticos, ya que sería responsable de seleccionar las mejores soluciones posibles, que se transmitirían a las siguientes generaciones para su posterior proceso. Entonces, la fase de selección en los algoritmos genéticos es una fase muy importante en los algoritmos genéticos.

Transversal

La fase de cruce del algoritmo genético es básicamente responsable de establecer un cierto umbral en lugares aleatorios en Genes y el cruce se encargará de intercambiar genes entre las dos soluciones aleatorias obtenidas en la fase de Selección. Por lo tanto, la información debe transmitirse a través de las soluciones individuales hasta que se alcance el cruce de los genes.

🔥 Recomendado:  Una guía para el análisis discriminante regularizado en python

Mutación

La fase de mutación en los algoritmos genéticos garantiza que se produzca un cruce con una mayor probabilidad aleatoria dentro de los genes. Entonces, la mutación será responsable de establecer valores de umbral aleatorios más altos en los genes, de modo que la información que se transmite entre las soluciones sea considerable y la fase de mutación también sea necesaria para mantener la diversidad entre las mejores soluciones posibles seleccionadas para el problema.

¿Qué es la reconstrucción de imágenes?

La reconstrucción de imágenes es un proceso iterativo de evolución a través de varios píxeles de imágenes y un intento de obtener la imagen original a través de la evolución. La reconstrucción de imágenes encuentra sus principales aplicaciones en tareas de imágenes médicas, imágenes inversas y restauración de imágenes originales.

De manera similar, se pueden usar algoritmos genéticos para la reconstrucción de imágenes en los que el algoritmo intenta reconstruir la imagen cerca de la imagen original. Los algoritmos genéticos básicamente siguen un enfoque basado en metaheurísticas y el algoritmo itera sobre las mejores formas posibles de reconstruir la imagen cerca de la imagen original. Pygad es una de esas bibliotecas de algoritmos genéticos que está estructurada y diseñada para reconstruir imágenes cercanas a la imagen original.

Reconstrucción de imágenes usando Algoritmo Genético

La reconstrucción de imágenes en algoritmos genéticos se puede realizar utilizando la biblioteca Pygad, que está especialmente diseñada para la reconstrucción de imágenes utilizando los principios del algoritmo genético.

Entonces, veamos cómo llevar a cabo la reconstrucción de imágenes usando Pygad.

Primero instalemos la biblioteca e importemos la biblioteca al entorno de trabajo.

!pip instalar pygad importar pygad

A medida que la biblioteca se importa al entorno de trabajo, visualicemos la imagen original utilizando la biblioteca matplotlib.

importar matplotlib.pyplot como plt img=plt.imread(‘/content/drive/MyDrive/Colab notebooks/GA_Img_reconstruction/tiger.jpeg’) plt.imshow(img) plt.show()

La imagen debe reducirse a escala estándar para pasar la imagen original al algoritmo genético. Así que escalamos la imagen usando la biblioteca numpy.

img = np.asarray(img/255, dtype=np.float)

Una vez escalada la imagen tendremos que usar una librería llamada GARI [Genetic Algorithm for Reproducing Image] que es una biblioteca diseñada para descomponer la imagen original en cromosomas y también remodelar la imagen original en consecuencia, se puede pasar a los algoritmos genéticos. Por lo tanto, se puede decir que GARI es uno de los submódulos de Pygad y debe estar disponible en el entorno de trabajo mediante la clonación en el repositorio Github respectivo.

🔥 Recomendado:  ¿Cómo visualizar el rendimiento del modelo ML usando Scikit-Plot?

!git clone ‘https://github.com/ahmedfgad/GARI’ %cd /content/drive/MyDrive/Colab notebooks/GA_Img_reconstruction/GARI import gari

Entonces, una vez que la biblioteca gari se importa al entorno de trabajo, la biblioteca debe usarse para descomponer la imagen en cromosomas que estarán en el grupo de la población inicial de la mejor imagen posible para reconstruir cerca de la imagen original. Entonces, veamos cómo descomponer la imagen original en un conjunto de posibles imágenes de reconstrucción.

destino_cromosoma = gari.img2cromosoma(img)

Entonces, aquí se debe usar la función “img2chromosome” para descomponer la imagen original en las mejores imágenes de reconstrucción posibles. Entonces, una vez que se reconstruye la imagen original, tendremos que crear una función de aptitud para producir solo las soluciones más adecuadas que se puedan pasar a la instancia de Pygad para reconstruir la imagen. Entonces, creemos una función de aptitud que considere la diferencia máxima entre la imagen original y la imagen reconstruida para que la imagen reconstruida sea similar a la imagen original.

def fitness_fun(solución, solution_idx): fitness = np.sum(np.abs(target_chromosome-solution)) fitness = np.sum(target_chromosome) – fitness return fitness

Así que aquí se usa una función definida por el usuario para crear una función de aptitud que será responsable de producir una puntuación de aptitud que se utiliza para realizar una validación cruzada de la puntuación de aptitud entre las soluciones candidatas en la población y las soluciones que pasan la puntuación de aptitud serán considerada para la mutación para reconstruir la imagen.

Ahora creemos una instancia de algoritmo genético usando Pygad con ciertos parámetros declarados para una optimización eficiente y para reconstruir la imagen cerca de la imagen original.

ga_instance = pygad.GA(num_generaciones=15000, num_parents_mating=4, fitness_func=fitness_fun, sol_per_pop=10, num_genes=img.size, init_range_low=0.0, init_range_high=1.0, mutación_porcentaje_genes=0.01, mutación_tipo=”aleatorio”, mutación_por_reemplazo=Verdadero, mutación_aleatoria_min_val=0.0, mutación_aleatoria_max_val=1.0)

Aquí se está creando una instancia de algoritmo genético usando la biblioteca Pygad donde en ciertos parámetros como el número de generaciones que el algoritmo tiene que evolucionar mediante el uso de las soluciones candidatas presentes en la población, el número de padres que se aparean representa el conjunto de soluciones que serán responsable de compartir información (mutación) hasta que se alcanza el punto de cruce y todas las soluciones que se mutarán deben pasar los parámetros impuestos en la función de aptitud y muchos más. Entonces, con la creación de una instancia de algoritmo genético, la instancia debe iterarse utilizando el principio subyacente de los algoritmos heurísticos y, en el proceso de iteración, la instancia intenta encontrar la mejor solución posible, lo que implica que la imagen se reconstruye más cerca de la imagen original.

ga_instancia.run()

El puntaje de aptitud aumenta con un aumento en el número de generaciones y lo mismo se puede visualizar usando la función incorporada “plot_result”.

🔥 Recomendado:  ¿Cómo crear modelos de aprendizaje automático rápidos y reproducibles con steppy?

ga_instance.plot_result() plt.show()

La puntuación de aptitud aumenta con el aumento del número de generaciones porque las soluciones candidatas intentarán evolucionar con respecto a varios factores declarados en la función de aptitud e intentarán reproducir la mejor solución óptima que se pueda transmitir para la mutación.

La mejor solución que se produce cerca de la solución óptima se puede visualizar mediante la instancia de Pygad. Aquí, la imagen que se está reconstruyendo se puede visualizar utilizando la función incorporada “chromosome2img” de la biblioteca GARI, como se muestra a continuación.

solution, solution_fitness, solution_idx = ga_instance.best_solution() print(“Valor de aptitud de la mejor solución = {solution_fitness}”.format(solution_fitness=solution_fitness)) print(“Índice de la mejor solución: {solution_idx}”.format(solution_idx =solution_idx)) if ga_instance.best_solution_generation != -1: print(“Mejor valor de fitness alcanzado después de {best_solution_generation} generaciones”.format(best_solution_generation=ga_instance.best_solution_generation)) result = gari.chromosome2img(solution, img.shape) plt .imshow(resultado) plt.title(“PyGAD y GARI para reproducir imágenes”) plt.show()

Aquí podemos ver que después de iterar a través de las 15000 soluciones candidatas, la instancia de Pygad ha intentado reconstruir la imagen cerca de la imagen original como se muestra arriba.

Comparación de la imagen reconstruida y la imagen original

Aquí podemos ver claramente cómo el algoritmo genético intenta reconstruir la imagen más cerca de la imagen original. La imagen reconstruida será mejor con el aumento del número de generaciones y con el aumento del número de mutaciones. Esto se debe a que el algoritmo itera a través de todas las soluciones candidatas en el grupo y las soluciones más aptas que se aprobarán para la mutación serán más. Esto hace que el algoritmo reconstruya la imagen más cerca de la imagen original.

Resumen

Los algoritmos genéticos se utilizan principalmente para la optimización de varios problemas y en este artículo hemos visto cómo se pueden reconstruir imágenes utilizando algoritmos genéticos. Más el número de generaciones y más el número de mutaciones óptimo es la solución proporcionada por el algoritmo. El proceso de optimización de los algoritmos genéticos requiere mucho tiempo y es por eso que encuentra su mayor uso en los algoritmos evolutivos, donde la solución óptima es el principal requisito para los algoritmos evolutivos.

Referencias