Skip to content

Instantly share code, notes, and snippets.

@Daniel-Eriberto-ZB
Created February 28, 2024 06:17
Show Gist options
  • Save Daniel-Eriberto-ZB/dc113f599f9d51509a2e13b3e585f29d to your computer and use it in GitHub Desktop.
Save Daniel-Eriberto-ZB/dc113f599f9d51509a2e13b3e585f29d to your computer and use it in GitHub Desktop.
Clases: Aplicación para la Creación de Arte Generativo con Redes Neuronales

Clases: Aplicación para la Creación de Arte Generativo con Redes Neuronales 🎨

Zacarias Bartolon Daniel Eriberto #20210653

Patrones de diseño de software

Ing. Sistemas Computacionales

Diagrama de clases (General)

image

Codigo (General):

classDiagram
    class ObraDeArte {
        -id: int
        -autor: string
        -fechaCreacion: date
        -estilo: string
        -tecnica: string
        -imagen: image
        +ObraDeArte(id: int, autor: string, fechaCreacion: date, estilo: string, tecnica: string, imagen: image)
        +obtenerId(): int
        +obtenerAutor(): string
        +obtenerFechaCreacion(): date
        +obtenerEstilo(): string
        +obtenerTecnica(): string
        +obtenerImagen(): image
    }

    class RedNeuronal {
        -modelo: ModeloRedNeuronal
        +RedNeuronal()
        +cargarModelo(rutaModelo: string): void
        +entrenar(datosEntrenamiento: DataSet): void
        +generarObraDeArte(): ObraDeArte
    }

    class Usuario {
        -id: int
        -nombreUsuario: string
        -correoElectronico: string
        -contrasena: string
        +Usuario(id: int, nombreUsuario: string, correoElectronico: string, contrasena: string)
        +obtenerId(): int
        +obtenerNombreUsuario(): string
        +obtenerCorreoElectronico(): string
        +obtenerContrasena(): string
        +iniciarSesion(nombreUsuario: string, contrasena: string): boolean
        +generarObraDeArte(): ObraDeArte
    }

    class InterfazUsuario {
        -ventanaPrincipal: VentanaPrincipal
        +InterfazUsuario()
        +mostrarVentanaPrincipal(): void
        +manejarEntradaUsuario(): void
        +mostrarObraDeArte(obraDeArte: ObraDeArte): void
    }

    class BaseDatos {
        -conexion: ConexionBaseDatos
        +BaseDatos()
        +guardarObraDeArte(obraDeArte: ObraDeArte): void
        +recuperarObraDeArte(id: int): ObraDeArte
        +guardarUsuario(usuario: Usuario): void
        +recuperarUsuario(id: int): Usuario
    }

    ObraDeArte <-- RedNeuronal
    Usuario "1" --> "*" ObraDeArte
    InterfazUsuario <-- Usuario
    BaseDatos <-- Usuario

Justificacion

  1. ObraDeArte: Representa una obra de arte digital generada por la aplicación.

  2. RedNeuronal: Representa la red neuronal utilizada para generar las obras de arte.

  3. Usuario: Representa a los usuarios de la aplicación.

  4. InterfazUsuario: Maneja la interacción entre el usuario y la aplicación.

  5. BaseDatos: Gestiona el almacenamiento y recuperación de datos sobre obras de arte, usuarios y otros datos relevantes.

  6. GeneradorObrasDeArte: Coordina el proceso de generación de obras de arte utilizando la red neuronal.

  7. EntrenadorRedNeuronal: Se encarga del entrenamiento y ajuste de la red neuronal.

  8. PreprocesadorDatos: Realiza la preparación y preprocesamiento de los datos antes del entrenamiento de la red neuronal.

  9. VisualizadorObrasDeArte: Proporciona herramientas para visualizar y mostrar las obras de arte generadas.

  10. Autenticador: Maneja la autenticación y seguridad de los usuarios.

  11. GestorSesiones: Administra las sesiones de los usuarios en la aplicación.

  12. Logger: Registra y gestiona los registros de actividad y eventos en la aplicación.

  13. Configuración: Administra la configuración y ajustes de la aplicación.

  14. Servidor: Maneja la comunicación entre la aplicación y los usuarios, así como las operaciones de red.

  15. Controlador: Coordina las acciones y operaciones dentro de la aplicación.

  16. ValidadorDatos: Valida y verifica la integridad de los datos ingresados por los usuarios.

  17. MotorGráfico: Proporciona capacidades gráficas para renderizar y mostrar las obras de arte generadas.

  18. AdministradorContenido: Gestiona el contenido de la aplicación, como nuevas técnicas artísticas o estilos disponibles.

  19. AnalizadorFeedback: Analiza el feedback de los usuarios para mejorar el rendimiento y la calidad de las obras de arte generadas.

  20. PlanificadorTareas: Programa y gestiona tareas de fondo, como entrenamiento de la red o mantenimiento de la base de datos.

Lenguajes de programacion

Java

image

  • Plataforma Android: Java es el lenguaje de programación principal para el desarrollo de aplicaciones Android. Android Studio, el entorno de desarrollo integrado (IDE) más utilizado para crear aplicaciones Android, está optimizado para Java y ofrece una amplia gama de herramientas y bibliotecas específicas para el desarrollo en esta plataforma.

  • Amplia adopción y documentación: Java es uno de los lenguajes de programación más populares y ampliamente utilizados en el mundo del desarrollo de software. Como resultado, cuenta con una gran comunidad de desarrolladores y una amplia cantidad de recursos de aprendizaje y documentación disponibles en línea. Esto facilita el aprendizaje y la resolución de problemas durante el desarrollo de tu proyecto.

  • Ecosistema maduro: Java tiene un ecosistema maduro y bien establecido que incluye numerosas bibliotecas y frameworks para una variedad de propósitos, incluyendo el desarrollo de aplicaciones móviles. Puedes aprovechar estas bibliotecas y frameworks para acelerar el desarrollo de tu proyecto y agregar funcionalidades avanzadas, como la integración con bases de datos, la autenticación de usuarios y la comunicación en red.

  • Rendimiento y estabilidad: Java es conocido por su rendimiento sólido y su estabilidad. Esto es especialmente importante para aplicaciones móviles, donde la eficiencia y la fiabilidad son fundamentales para brindar una experiencia de usuario satisfactoria. Además, Java ofrece mecanismos como la gestión automática de la memoria a través del recolector de basura, lo que ayuda a evitar fugas de memoria y otros problemas comunes.

  • Portabilidad: Aunque estás desarrollando una aplicación para Android en este proyecto, es posible que en el futuro desees portar tu aplicación a otras plataformas, como iOS o incluso aplicaciones de escritorio. Java es conocido por su portabilidad, lo que significa que el código que escribas en Java es más fácil de adaptar y reutilizar en diferentes plataformas, lo que te brinda flexibilidad y opciones a largo plazo.

Python

image

  • Amplio soporte para aprendizaje automático y redes neuronales: Python es ampliamente reconocido por su excelente soporte para la inteligencia artificial, el aprendizaje automático y las redes neuronales. Cuenta con una amplia gama de bibliotecas y frameworks especializados en este campo, como TensorFlow, PyTorch, Keras, scikit-learn y muchos más. Estas bibliotecas facilitan la implementación y el entrenamiento de modelos de redes neuronales para generar obras de arte digitales.

  • Facilidad de aprendizaje y uso: Python es conocido por su sintaxis clara y legible, lo que lo hace especialmente fácil de aprender para los principiantes y también agradable de trabajar para los desarrolladores experimentados. Su sintaxis simple y concisa permite un desarrollo rápido y eficiente, lo que puede ser beneficioso para un proyecto que implica la experimentación con diferentes modelos y técnicas de generación de arte.

  • Gran comunidad y abundante documentación: Python cuenta con una comunidad activa y comprometida de desarrolladores en todo el mundo. Esto significa que hay una abundancia de recursos en línea, tutoriales, documentación y foros de discusión disponibles para ayudarte en cada etapa de tu proyecto. Además, la comunidad de código abierto ha contribuido a una gran cantidad de bibliotecas y herramientas que pueden acelerar el desarrollo y la implementación de tu aplicación.

  • Interfaz de usuario y desarrollo web: Aunque Python es más conocido por su uso en el ámbito de la ciencia de datos y el aprendizaje automático, también ofrece opciones sólidas para el desarrollo de interfaces de usuario y aplicaciones web. Por ejemplo, puedes usar bibliotecas como Tkinter, PyQt, Kivy o Django para crear una interfaz de usuario para tu aplicación de generación de arte digital. Además, si deseas crear una versión web de tu aplicación, Python junto con frameworks como Flask o Django puede ser una excelente opción.

  • Portabilidad y escalabilidad: Aunque inicialmente estás desarrollando una aplicación de arte digital, Python es altamente portable y escalable, lo que significa que si en el futuro deseas expandir tu proyecto a otras plataformas o agregar más funcionalidades, Python puede adaptarse fácilmente a tus necesidades cambiantes. Además, las bibliotecas de Python para aprendizaje automático están optimizadas para ejecutarse en una amplia gama de hardware, desde computadoras de escritorio hasta servidores en la nube y dispositivos móviles.

Patrones de diseño

Patrón de diseño Modelo-Vista-Controlador (MVC):

Modelo: Representaría la lógica de negocio de tu aplicación, como la generación de obras de arte y la manipulación de datos. Vista: Manejaría la presentación de la interfaz de usuario, mostrando las obras de arte generadas y permitiendo la interacción del usuario. Controlador: Actuaría como un intermediario entre el modelo y la vista, gestionando las acciones del usuario y actualizando el modelo en consecuencia.

Patrón de diseño Singleton:

Aplicar este patrón para garantizar que ciertas clases, como aquellas que manejan la configuración de la aplicación o la gestión de recursos compartidos (como una conexión a la base de datos), tengan solo una instancia en toda la aplicación.

Patrón de diseño Factory Method o Abstract Factory:

Estos patrones podrían ser útiles si necesitas crear objetos de diferentes tipos de manera dinámica. Por ejemplo, podrías tener una fábrica de modelos de redes neuronales que genera instancias de modelos específicos según las necesidades de tu aplicación.

Patrón de diseño Observer:

Este patrón podría utilizarse para implementar un sistema de notificación en el que los diferentes componentes de la aplicación puedan suscribirse para recibir actualizaciones cuando ocurran eventos importantes, como la finalización de la generación de una obra de arte.

Patrón de diseño Strategy:

Se puede aplicar este patrón para definir diferentes estrategias de generación de arte (por ejemplo, diferentes algoritmos o modelos de redes neuronales) y permitir que el usuario elija entre ellas.

Patrón de diseño Builder:

Este patrón podría ser útil si estás construyendo objetos complejos paso a paso. Por ejemplo, si estás creando un objeto que representa una obra de arte, podrías utilizar un constructor para facilitar la configuración de sus atributos.

Patrón de diseño Proxy:

Se puede utilizar este patrón para controlar el acceso a objetos costosos en recursos o que requieren una inicialización compleja. Por ejemplo, podrías utilizar un proxy para manejar el acceso a modelos de redes neuronales pre-entrenados.

Patron de diseño principal

Dado el tipo de proyecto que se esta realizando, donde necesitas manejar la generación de obras de arte digitales mediante el uso de redes neuronales, así como la interacción con el usuario a través de una interfaz de usuario, el patrón de diseño que mejor se adapta es el Modelo-Vista-Controlador (MVC).

Implementacion de patron (Java)

Modelo(Model)

public class GeneradorArteModelo {
    public ObraDeArte generarObraDeArte() {
        // Lógica para generar una obra de arte utilizando redes neuronales
        return obraDeArteGenerada;
    }
}

Vista(View)

import java.awt.*;
import javax.swing.*;

public class GeneradorArteVista {
    private JFrame frame;
    private JButton generarObraDeArteButton;
    private JLabel obraDeArteLabel;

    public GeneradorArteVista() {
        // Inicializar la interfaz de usuario
        frame = new JFrame("Generador de Arte");
        generarObraDeArteButton = new JButton("Generar Obra de Arte");
        obraDeArteLabel = new JLabel("Aquí se mostrará la obra de arte generada");
        
        frame.setLayout(new BorderLayout());
        frame.add(generarObraDeArteButton, BorderLayout.NORTH);
        frame.add(obraDeArteLabel, BorderLayout.CENTER);

        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public JButton getGenerarObraDeArteButton() {
        return generarObraDeArteButton;
    }

    public void mostrarObraDeArte(ObraDeArte obraDeArte) {
        // Mostrar la obra de arte en la interfaz de usuario
        obraDeArteLabel.setIcon(new ImageIcon(obraDeArte.getImagen()));
    }
}

Controlador(Controller)

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class GeneradorArteControlador {
    private GeneradorArteModelo modelo;
    private GeneradorArteVista vista;

    public GeneradorArteControlador(GeneradorArteModelo modelo, GeneradorArteVista vista) {
        this.modelo = modelo;
        this.vista = vista;

        vista.getGenerarObraDeArteButton().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // Manejar el evento de generar una obra de arte
                ObraDeArte obraDeArteGenerada = modelo.generarObraDeArte();
                vista.mostrarObraDeArte(obraDeArteGenerada);
            }
        });
    }
}

Implementacion de patron (Python)

Modelo(Model.py)

class GeneradorArteModelo:
    def generar_obra_de_arte(self):
        # Lógica para generar una obra de arte utilizando redes neuronales
        return obra_de_arte_generada

Vista(View.py)

import tkinter as tk
from PIL import ImageTk, Image

class GeneradorArteVista:
    def __init__(self):
        self.root = tk.Tk()
        self.frame = tk.Frame(self.root)
        self.generar_obra_de_arte_button = tk.Button(self.frame, text="Generar Obra de Arte")
        self.obra_de_arte_label = tk.Label(self.frame, text="Aquí se mostrará la obra de arte generada")
        
        self.frame.pack()
        self.generar_obra_de_arte_button.pack()
        self.obra_de_arte_label.pack()

    def mostrar_obra_de_arte(self, obra_de_arte):
        # Mostrar la obra de arte en la interfaz de usuario
        image = Image.open(obra_de_arte.imagen)
        photo = ImageTk.PhotoImage(image)
        self.obra_de_arte_label.configure(image=photo)
        self.obra_de_arte_label.image = photo

    def iniciar_aplicacion(self):
        self.root.mainloop()

Controlador(Controller.py)

class GeneradorArteControlador:
    def __init__(self, modelo, vista):
        self.modelo = modelo
        self.vista = vista
        self.vista.generar_obra_de_arte_button.bind("<Button-1>", self.generar_obra_de_arte)

    def generar_obra_de_arte(self, event):
        # Manejar el evento de generar una obra de arte
        obra_de_arte_generada = self.modelo.generar_obra_de_arte()
        self.vista.mostrar_obra_de_arte(obra_de_arte_generada)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment