Aproximación Pseudo-Óptima de Imágenes por Polígonos Mediante el Uso de un Algoritmo Genético

Universidad Técnica Federico Santa María. Departamento de Electrónica.
Diseño y Programación Orientada a Objetos - ELO329.
Boris Vidal, Guillermo Becerra, Constanza Lorca y Felipe Arriagada.

Contenidos

  1. Descripciónl del Problema
  2. Análisis del Problema
  3. Implementación
  4. Resultados

Descripción del Problema

Por varias razones, de las cuales no es la menos importante la competitividad del mercado, en ingeniería no solo se buscan soluciones que trabajen a cierto nivel nominal, si no que sean también de cierta manera la mejor solución. O en otras palabras, en ingeniería se enfrentan frecuentemente problemas de optimización.

En el presente trabajo se busca solucionar un problema de optimización particular: La aproximación de imágenes mediante polígonos coloreados. Para esto, el problema será enfrentado desde el marco de los los llamados algortimos genéticos, algoritmo que en este caso será diseñado utilizando las guías provistas por la programación orientada a objetos.

       
Figura 1: ¿Cómo aproximar la imagen de la izquierda mediante una imagen como la de la derecha?

Análisis del Problema

Formulación del problema de optimización

El primer paso para formular un problema de optimización es caracterizar los resultados factibles y el costo que va a representar la elección de cada resultado. En esta caso, se tiene una imagen objetivo IobjI_{obj} a aproximar, por lo cual cualquier aproximación tentativa IappI_{app} forma parte del espacio de factibilidad. Las aproximaciones solo podrán ser imágenes construidas mediante la superposición de polígonos transparentes. Además, en esta caso consideraremos como aproximaciones válidas  solo aquellas imágenes con las mismas dimensiones de la imagen objetivo.

Se considerará el error el aproximación somo un error cuadrático medio de los pixeles, esto es

Error(Iobj,Iapp)=i,j(pixi,jobj-pixi,japp)2,Error\left(I_{obj},I_{app}\right) = \sum_{i,j} \left(pix^{obj}_{i,j}-pdonde pixi,jobjpix^{obj}_{i,j} corresponde al pixel en la posición (i,j)(i,j) de la imágen objetivo, y pixi,japppix^{app}_{i,j} al pixel en la posición (i,j)(i,j) de la aproximación.

Los pasos siguientes en la formulación del problema corresponden normalmente a agregar restricciones. Si bien en esta formulación no se considerarán explícitamente restricciones, en la subsección de casos de uso se analizarán las distintas limitaciones intrinsecas al computo de la solución.

Diseño del algoritmo genético

Un algoritmo genético es un método heurístico inspirado por el proceso de selección natural, y utlizado comunmente en la generación de soluciones de alta calidad a problemas de optimización  y busqueda. En el caso del presente trabajo, es utilizado un modelo genético como el mostrado en la Figura 2. En él, un individuo (superviviente) genera un descendiente (nueva generación) afectado por mutaciones. Luego, el individuo que sobrevivirá será aquel que presente un menor error de aproximación, abriendo la posibilidad de ejecutar una nueva iteración.

Cada individuo es caracterizado por su propia cadena de ADN, la cual describe la disposición y el color de los polígonos necesarios para construir la imagen. Así mismo, las mutaciones afectan aleatoria y directamente al ADN del individuo, donde cada mutación válida tiene su propia probabilidad de ocurrencia.



Figura 2: Modelo evolutivo utilzado.

Casos de uso

Implementación

El código del algoritmo fue programado en lenguage python. Además, con el fin de facilitar la interacción con el usuario, el programa se implementó en el entorno Jupyter.

El algoritmo genético es implementado en tres clases: Polygon, ADN y History. La función de cada clase se explica a continuación:

En la Figura 3 se muestra el diagrama de clases resultante.


Figura 3: Diagrama de clases de la implementación

Resultados

La imagen objetivo utilizada es aquella en la izquierda de la Figura 1. Se realizaron principalmente tres simulaciones del algortimo. La primera consideró solo el uso de triángulos y mutaciones sue solo afectaron triángulos. La segunda admitió el uso de polígonos con más de tres verticas, y mutaciones que permitieron variar el número de vértices a un polígono. Finalmente, la tercera agregó la posibilidad de mutar cada vértice por separado.

La evolución de las similaciones realizadas se muestra en la Animación 1. La Animación 1 permite comparar como afecta cada cambio en la evolución perceptual del algoritmo.

     
Animación 1: Resultado obtenido en cada una de las tres pruebas realizadas. A la izquerda, se muestra el resultado de aproximar con triángulos. Al centro se muestra el resultado de agregar polígonos. A la derecha se muestra el resultado de agregar la mutación de cada vértice.
Las dificultades encontradas durante el desarrollo del proyecto fueron principalmente el tiempo de duración de las simulaciones. Aun así, el desarrollo incremental realizado permitió optimizar el algoritmo, llevando el tiempo de ejección de 16 horas a 8 horas, y finalmente a 3 horas para llegar a un resultado aceptable.

El otro problema presentado fue el que se aprecia en la animación central de la Animación 1. Se observa la aparición de manchas en la imagen. El problema fue debido a un bug simple, el cual para la tercera prueba ya estaba solucionado.