|
from core.controllers.pages_controller import Page |
|
from core.controllers.main_process import Generador |
|
|
|
|
|
class Home(Page): |
|
variables_globales = { |
|
"prompt": "cat,fish,dog", |
|
"img_bytes": None, |
|
"img_src": None, |
|
"settings": { |
|
"model": str("CIDAS/clipseg-rd64-refined"), |
|
"tokenizer": str("CIDAS/clipseg-rd64-refined"), |
|
}, |
|
"img_output": None, |
|
"predicciones": None, |
|
"fuentes": [ |
|
{"titulo": "Papper", |
|
"url": "https://arxiv.org/abs/2112.10003"}, |
|
{"titulo": "Transformers", |
|
"url": "https://huggingface.co/docs/transformers/v4.32.1/en/index"}, |
|
{"titulo": "Modelo CIDAS/ClipSeg-rd64-refined", |
|
"url": "https://huggingface.co/CIDAS/clipseg-rd64-refined"}, |
|
{"titulo": "Repositorio", |
|
"url": "https://huggingface.co/CIDAS/clipseg-rd64-refined"}, |
|
{"titulo": "Material Apoyo", |
|
"url": "https://github.com/NielsRogge/Transformers-Tutorials/blob/master/CLIPSeg/Zero_shot_image_segmentation_with_CLIPSeg.ipynb"}, |
|
{"titulo": "IO", |
|
"url": "https://pypi.org/project/io/"}, |
|
{"titulo": "PIL", |
|
"url": "https://pypi.org/project/Pillow/"}, |
|
{"titulo": "requests", |
|
"url": "https://pypi.org/project/requests/"}, |
|
{"titulo": "timm", |
|
"url": "https://pypi.org/project/timm/"}, |
|
{"titulo": "matplotlib", |
|
"url": "https://pypi.org/project/matplotlib/"}] |
|
} |
|
|
|
archivos_css = ["main", |
|
"home"] |
|
|
|
def __init__(self, title=str("Bienvenido"), icon=str("🖼️"), init_page=False): |
|
super().__init__() |
|
if init_page: |
|
self.new_page(title=title, |
|
icon=icon) |
|
self.init_globals(globals=self.variables_globales) |
|
for archivo in self.archivos_css: |
|
self.cargar_css(archivo_css=archivo) |
|
self.about() |
|
|
|
def about(self): |
|
self.builder().sidebar.markdown(unsafe_allow_html=False, |
|
help=None, |
|
body=""" |
|
## Tema |
|
|
|
La segmentación de imágenes es el proceso de dividir una imagen en segmentos o regiones significativas. |
|
|
|
Puede ser de diferentes tipos, como la segmentación semántica (asignación de etiquetas de clase a píxeles) o la segmentación basada en contornos (división de una imagen en áreas definidas por bordes). |
|
|
|
Esta técnica es ampliamente utilizada en visión por computadora para analizar y comprender imágenes. |
|
|
|
## Recursos |
|
""") |
|
|
|
for fuente in self.get_global('fuentes'): |
|
self.builder().sidebar.markdown( |
|
unsafe_allow_html=False, |
|
help=None, |
|
body=f""" |
|
* **{fuente.get('titulo')}** - {fuente.get('url')} |
|
""" |
|
) |
|
self.builder().sidebar.markdown( |
|
unsafe_allow_html=False, |
|
help=None, |
|
body=""" |
|
###### Es **importante** mencionar que esta **compilación** se encuentra en proceso de **construcción**. |
|
|
|
*Si deseas **participar**, eres **bienvenido** de aportar en el repositorio oficial:* |
|
|
|
https://github.com/coder160/cuadernos/ |
|
""") |
|
|
|
def obtener_bytes(self, archivo): |
|
self.set_global(key='img_src', |
|
value=archivo) |
|
|
|
def actualizar_modelo_tokenizer(self, modelo, tokenizer): |
|
self.set_global(key='settings', |
|
value={'model': modelo, |
|
'tokenizer': tokenizer}) |
|
|
|
def procesar_imagen(self, prompt): |
|
proceso = Generador(configuraciones=self.get_global('settings')) |
|
proceso.generar_prediccion( |
|
imagen_bytes=self.imgg.open( |
|
self.get_global('img_src')).convert("RGB"), |
|
new_prompt=prompt |
|
) |
|
self.set_global(key='predicciones', value=proceso.prediccion) |
|
|
|
def expander_instrucciones(self, placeholder): |
|
instrucciones = placeholder.expander(expanded=False, |
|
label="Instrucciones") |
|
instrucciones.markdown(unsafe_allow_html=False, |
|
help=None, |
|
body=""" |
|
1. **Cargue su Imagen Base**: |
|
|
|
Elija cualquiera de las dos opciones para cargar su imagen: |
|
|
|
* **Desde su Galería**: cargue la imagen desde la galería de su teléfono o computadora. |
|
|
|
* **Desde su Cámara**: cargue la imagen directamente desde la cámara de su teléfono o computadora. |
|
|
|
|
|
2. **Detectar / Predecir**: |
|
|
|
Realice la **detección de objetos** con base a las predicciones realizadas por el **modelo** pre-entrenado seleccionado. |
|
|
|
A partir del dataset con el que fue pre-entrenado el modelo, tratará de predecir cuales son los objetos en la imagen cargada. |
|
|
|
|
|
* **Configuraciones Avanzadas**: |
|
|
|
*Elija un modelo y procesador de la lista disponible, o elija uno directamente de la base de modelos disponible en HuggingFace.* |
|
""") |
|
|
|
def expander_imagen_base(self, placeholder): |
|
imagen_base = placeholder.container() |
|
imagen_base.markdown(unsafe_allow_html=False, |
|
help=None, |
|
body=""" |
|
**Cargue su Imagen Base**: |
|
""") |
|
archivo_expander = imagen_base.expander(expanded=False, |
|
label="Desde su Galería") |
|
_archivo = archivo_expander.file_uploader(label="Galería", |
|
on_change=None, |
|
accept_multiple_files=False, |
|
label_visibility="visible") |
|
if (archivo_expander.button(label="Cargar Archivo", type="secondary", use_container_width=True, |
|
help="Suba un archivo.") and _archivo is not None): |
|
self.obtener_bytes(_archivo) |
|
|
|
camara_expander = imagen_base.expander(expanded=False, |
|
label="Desde su Cámara") |
|
_captura = camara_expander.camera_input(label="Cámara", |
|
on_change=None, |
|
label_visibility="visible") |
|
if (camara_expander.button(label="Cargar Captura", type="secondary", use_container_width=True, |
|
help="Tome una fotografía.") and _captura is not None): |
|
self.obtener_bytes(_captura) |
|
|
|
def expander_configuraciones(self, placeholder): |
|
configuraciones = placeholder.expander( |
|
expanded=False, label="Configuraciones Avanzadas") |
|
modelo = configuraciones.text_input( |
|
label="MODELO", on_change=None, label_visibility="visible", |
|
value=self.get_global('settings').get('model')) |
|
tokenizer = configuraciones.text_input( |
|
label="TOKENIZER", on_change=None, label_visibility="visible", |
|
value=self.get_global('settings').get('tokenizer')) |
|
|
|
if configuraciones.button(label="Configurar", type="secondary", use_container_width=True, |
|
help="Actualice configuraciones"): |
|
self.actualizar_modelo_tokenizer(modelo, tokenizer) |
|
|
|
def resultados(self, placeholder): |
|
resultados = placeholder.container() |
|
|
|
if self.get_global('img_src', None) is not None: |
|
resultados.image( |
|
image=self.get_global('img_src').getvalue(), |
|
caption="Su resultado", |
|
use_column_width="auto", |
|
channels="RGB", |
|
output_format="auto" |
|
) |
|
if self.get_global('predicciones', None) is not None: |
|
for i, predict in enumerate(self.get_global('predicciones', [])): |
|
resultados.image( |
|
image=predict, |
|
caption=f"Su predicción {i}", |
|
use_column_width="auto", |
|
channels="RGB", |
|
output_format="auto" |
|
) |
|
|
|
def agregar_card_base(self, columna): |
|
card_principal = columna.container() |
|
|
|
columna_inputs, columna_outputs = card_principal.columns( |
|
[0.3, 0.7], gap="small") |
|
|
|
self.expander_instrucciones(columna_inputs) |
|
self.expander_imagen_base(columna_inputs) |
|
self.expander_configuraciones(columna_inputs) |
|
columna_inputs.markdown(unsafe_allow_html=False, |
|
help=None, |
|
body=""" |
|
**Introduzca palabras de búsqueda**: |
|
""") |
|
prompt = columna_inputs.text_input( |
|
label="Prompt", on_change=None, label_visibility="visible", |
|
value=self.get_global('prompt')) |
|
if columna_inputs.button(label="Detectar / Predecir", help="Realizar Predicciones", |
|
type="secondary", use_container_width=True): |
|
self.procesar_imagen(prompt) |
|
self.resultados(columna_outputs) |
|
|
|
def build(self): |
|
|
|
columna_principal = self.get_body().columns(1, gap="small")[0] |
|
self.agregar_card_base(columna_principal) |
|
|
|
|
|
if __name__ == "__main__": |
|
Home(init_page=True).build() |
|
|