{"id":26409280,"url":"https://github.com/bautista225/line_braik","last_synced_at":"2025-03-17T19:19:51.448Z","repository":{"id":43901459,"uuid":"458922878","full_name":"bautista225/line_brAIk","owner":"bautista225","description":"Estimation of reading speed with Keras and OpenCV","archived":false,"fork":false,"pushed_at":"2022-02-18T21:19:18.000Z","size":86437,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2023-06-14T07:29:58.563Z","etag":null,"topics":["keras-tensorflow","opencv-python","reading-comprehension"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bautista225.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-02-13T20:26:48.000Z","updated_at":"2022-12-07T11:48:18.000Z","dependencies_parsed_at":"2022-09-24T23:03:13.605Z","dependency_job_id":null,"html_url":"https://github.com/bautista225/line_brAIk","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bautista225%2Fline_brAIk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bautista225%2Fline_brAIk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bautista225%2Fline_brAIk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bautista225%2Fline_brAIk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bautista225","download_url":"https://codeload.github.com/bautista225/line_brAIk/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244094268,"owners_count":20397020,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["keras-tensorflow","opencv-python","reading-comprehension"],"created_at":"2025-03-17T19:19:50.824Z","updated_at":"2025-03-17T19:19:51.432Z","avatar_url":"https://github.com/bautista225.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Line BrAIk | Creación de un modelo para la estimación de la velocidad de lectura\n\n\u003cimg height=\"28px\" src=\"http://ForTheBadge.com/images/badges/built-with-love.svg\"\u003e \u003ca href=\"https://medium.com/@danibagan13/creaci%C3%B3n-de-un-modelo-para-la-estimaci%C3%B3n-de-la-velocidad-de-lectura-19e456eff73a\"\u003e\u003cimg height=\"28px\" src=\"https://img.shields.io/badge/Medium-12100E?style=for-the-badge\u0026logo=medium\u0026logoColor=white\"\u003e\u003c/a\u003e\n\n## Autores\n* Daniel Bagán Martinez\n* Aarón García Pitarch\n* Ketevan Javakhishvili\n* Juan Bautista García Traver\n\n## Objetivo\n\nCon este proyecto se pretende crear una herramienta de soporte al estudio o a la lectura, que ayude a estimar cuáles son las horas del día y los periodos en que el estudiante rinde más, así como la longitud de los intervalos de tiempo en que no baja su concentración, o los momentos en los que el estudiante/lector no está concentrado o está bajando su productividad y debería tomar alguna medida o tomarse un periodo de descanso.\n\nEn concreto, la parte del proyecto que se presenta en este repositorio contine el proceso para crear el **modelo encargado de estimar la productividad** del estudiante, usando como magnitud la **tasa de líneas leídas por unidad de tiempo**.\n\n![1_yPQVddKPoXzGLWD3e7PqFA](https://user-images.githubusercontent.com/25453699/154657495-a4b3e848-bea8-4d7a-92a2-f7fb540823ea.gif)\n\n## Partes del proyecto\n\n### Preprocesamiento de datos\n\nMódulo `procesar_video_ojo.py`\n\nA partir de un conjunto de videos, crea una carpeta para cada video, una subcarpeta para cada segundo y almacena las 10 imágenes (frames) del ojo.\n\n```python\n# Datos de entrada.\ncarpeta_video = f\"videos{os.path.sep}\"                # Ruta con los vídeos a procesar\n\nvideos_a_analizar = [\n   (f\"{carpeta_video}v_persona_01.mp4\",   \"I\", True), # \"I\" indica que debe procesar el ojo izquierdo.\n   (f\"{carpeta_video}v_persona_02.mp4\",   \"I\", True), # True indica forzar a que siempre se detecten dos ojos,\n   (f\"{carpeta_video}v_persona_03.mp4\",   \"I\", True), # en otro caso, cogerá el ojo del frame anterior.\n   (f\"{carpeta_video}v_persona_04.mp4\",   \"D\", True), # \"D\" indica que debe procesar el ojo derecho.\n]\n```\n\n### Generación de Dataset\n\nMódulo `crear_conjuntos_entrenamiento.ipynb`\n\nA partir de las imágenes creadas, almacena el conjunto de datos y las etiquetas en ficheros numpy array .npy\n\n```python\n# Datos de entrada\n\n# Indicamos la carpeta de la que obtener los vídeos.\nparent_folder = \"/Users/equipo-ojo/Documents/OJO/video_inputs/*\"\n\n# Las subcarpetas deberán contener un fichero .csv con el nombre del vídeo\n# (v_persona_01.csv) donde se encuentren el valor de las etiquetas \"y\" para cada\n# conjunto de 10 frames (1 si hay salto de línea o 0 si no lo hay).\n\n```\n\n### Entrenamiento del modelo\n\nDebido a las limitaciones de hardware en Tensorflow para ejecutar modelos con el formato de entrada NHWC (n_samples, height, width, channels) solamente en entornos GPU Nvidia CUDA, se ha desarrollado la generación de los modelos según su formato de entrada.\n\n#### Entorno con GPU\n\nMódulo `train_model_line_braik_channels_last.ipynb`\n\n\u003e Éste modelo necesitará su ejecución en un entorno GPU debido a la arquitectura de entrada utilizada: \n\u003e NHWC (n_samples, height, width, channels) la cual sólo es compatible con entornos GPU Nvidia CUDA.\n\u003e Para utilizar el modelo mediante CPU, utilizar el módulo `train_model_line_braik_channels_first.ipynb`\n\u003e que utiliza la arquitectura NCHW (n_samples, channels, height, width).\n\nCarga el dataset, crea y entrena el modelo, y muestra resultados.\n\n```python\n\n# Datos de entrada\n\n# Cargamos el conjunto de datos de entrenamiento desde un fichero npy.\nx_set_r = load('/path/Saturdays AI - Equipo ojo/dataset/x_set_right.npy') # Dataset del ojo derecho.\ny_set_r = load('/path/Saturdays AI - Equipo ojo/dataset/y_set_right.npy') # Etiquetas del ojo derecho.\nx_set_l = load('/path/Saturdays AI - Equipo ojo/dataset/x_set_left.npy')  # Dataset del ojo izquierdo.\ny_set_l = load('/path/Saturdays AI - Equipo ojo/dataset/y_set_left.npy')  # Etiquetas del ojo izquierdo.\n\n```\n\n#### Entorno sin GPU\n\nMódulo `train_model_line_braik_channels_first.ipynb`\n\n\u003e Este entorno produce una modificación en el conjunto de entrada\n\u003e para pasar el input de la arquitectura NHWC (n_samples, height, width, channels)\n\u003e a la arquitectura NCHW (n_samples, channels, height, width)\n\u003e ya que la primera posee limitaciones de hardware (sólo compatible con entornos GPU Nvidia CUDA).\n\nCarga el dataset, crea y entrena el modelo, y muestra resultados.\n\n```python\n\n# Datos de entrada\n\n# Cargamos el conjunto de datos de entrenamiento desde un fichero npy.\nx_set_r = load('/path/Saturdays AI - Equipo ojo/dataset/x_set_right.npy') # Dataset del ojo derecho.\ny_set_r = load('/path/Saturdays AI - Equipo ojo/dataset/y_set_right.npy') # Etiquetas del ojo derecho.\nx_set_l = load('/path/Saturdays AI - Equipo ojo/dataset/x_set_left.npy')  # Dataset del ojo izquierdo.\ny_set_l = load('/path/Saturdays AI - Equipo ojo/dataset/y_set_left.npy')  # Etiquetas del ojo izquierdo.\n\n```\n\n### Demo detección de saltos de línea con vídeo local\n\nMódulo `demo_line_braik_localvideo.ipynb`\n\nA partir de un video, detecta los saltos de línea y estima la velocidad de lectura.\n\n```python\n\n# Datos de entrada\n\n# Fecha de guardado del vídeo de salida.\nnow = datetime.now()\n\nvideo_path = \"/path/Saturdays AI - Equipo ojo/Videos/v_persona_01.mp4\"  # Ruta al vídeo a procesar.\nai_model_path = '/path/Saturdays AI - Equipo ojo/modeloEntrenado'       # Ruta al modelo entrenado.\nvideo_output_path = f'/path/Saturdays AI - Equipo ojo/video_results/video_output-{now.strftime(\"%d-%m-%Y_%H-%M-%S\")}.mp4'\n\n```\n\n### Demo detección de saltos de línea en tiempo real con webcam\n\nMódulo `demo_line_braik_realtime.py`\n\nA partir de la webcam, detecta los saltos de línea y estima la velocidad de lectura en tiempo real.\n\n```python\n\n# Datos de entrada\nai_model_path = '/path/Saturdays AI - Equipo ojo/modeloEntrenado'       # Ruta al modelo entrenado.\n\n```\n\n### Descarga de modelos entrenados\n\nModelos entrenados en formato channel_first (input shape 10,80,80) y channel_last (input shape 80,80,10):\n\n[Enlace a Google Drive para la descarga de modelos](https://drive.google.com/drive/folders/1P7QrJeB2OshOMQR-j8c7Xke0S11CuLtb?usp=sharing)\n\nDebido a limitaciones de hardware en Tensorflow, el modelo channel_first solo funciona en entornos con GPU nvidia CUDA, mientras que el modelo channel_last funciona en cualquier entorno.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbautista225%2Fline_braik","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbautista225%2Fline_braik","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbautista225%2Fline_braik/lists"}