Logo Studenta

Informe - Trabajo final -Marcos R IS corregido

¡Este material tiene más páginas!

Vista previa del material en texto

Aplicación web para gestión y detección
de retinopatía diabética
Proyecto Final de Carrera Ingeniería de Sistemas de la Universidad
Nacional del Centro de la Provincia de Buenos Aires
Alumno
Roberto David Marcos
Director
Ignacio Larrabide
22 de Marzo de 2023
1
Resumen
Las personas con diabetes pueden tener una enfermedad ocular llamada retinopatía
diabética. Esta enfermedad ocurre debido a que los niveles altos de azúcar en la
sangre causan daño a los vasos sanguíneos en la retina.
La retinopatía diabética es la principal causa de ceguera prevenible e irreversible en
adultos en edad laboral. Su detección temprana es esencial para iniciar el tratamiento
a tiempo y prevenir que avance hacia la ceguera irreversible.
Dada esta problemática, se propuso Retinar, una plataforma de telemedicina que
posee un algoritmo de inteligencia artificial que se utiliza para asistir de manera remota
los diagnósticos de retinopatía diabética. Por lo tanto surgió este proyecto, el cual es
una interfaz web a partir de un maquetado, que funciona como intermediario entre los
distintos actores en el flujo de análisis de la retinopatía diabética.
Este trabajo final de carrera contribuye al proyecto Retinar, otorgándole un medio por
el cual intercambiar datos entre cliente y servidor, siendo el cliente los distintos
usuarios (retinologo, técnicos de captura de imagen, admins, pacientes) y el servidor
los distintos nodos donde se encuentra desplegado un back-end para recibir peticiones
e interactuar con la inteligencia artificial.
2
3
Índice
Resumen 2
Índice 4
Capítulo 1: Introducción 4
1.1 Descripción de la problemática 8
1.2 Propuesta de solución 10
1.3 Vinculación con contenido académico 10
1.4 Organización del trabajo 11
Capítulo 2: Estado del arte 11
Capítulo 3: Contexto 13
3.1 Órganos y patología 13
3.1.1 Los ojos y el cerebro 13
3.1.2 Diabetes 13
3.1.3 Retinopatía diabética 14
3.2 Apartado técnico 15
3.2.1 Aplicación web 16
3.2.2 Algoritmos 16
3.2.3 Inteligencia artificial 16
3.2.4 Algoritmo de Inteligencia Artificial 17
3.2.5 Algoritmo de Retinar 17
Capítulo 4: Alcance y aporte del proyecto 17
4.1 Alcance del proyecto 17
4.2 Necesidad de Retinar 18
4.3 Aporte de este trabajo final a Retinar 19
4.4 Principales desafíos 19
Capítulo 5: Herramientas e interfaz 21
5.1 Figma 21
5.2 HTML, CSS, Javascript 22
5.3 React 24
5.3.1 Flujo de información 24
4
5.3.2 JSX 25
5.3.3 React respecto a otras librerías 26
5.4 Vercel 27
5.5 Arquitectura 28
5.5.1 Orientado a que usuario 28
5.5.2 Estructura de carpetas 30
5.5.3 Manejo de estado: Redux y useState 30
5.5.4 Navegación 31
5.5.5 Autenticación 33
5.5.6 Código semántico 33
5.5.7 Despliegue automatizado 34
Capítulo 6: Flujos de trabajo 35
6.1 Técnico de captura de imágenes 36
6.2 Oftalmólogo 39
6.3 Administrador 39
6.4 Paciente 40
Capítulo 7: Implementación y resultados 40
7.1 Vistas 41
7.1.1 Login 42
7.1.2 Home 42
7.1.3 Ficha paciente 45
7.1.4 Listado de estudios 45
7.1.5 ABM de técnicos 46
7.1.6 Nuevo estudio - Paso 1 - Búsqueda 46
7.1.7 Nuevo estudio - Paso 2 - Datos personales 47
7.1.8 Nuevo estudio - Paso 3 - Diagnóstico IA 48
7.1.9 Nuevo estudio - Paso 4 - Finalizar 50
7.2 Componentes relevantes 51
7.2.1 Header 52
7.2.2 Menú para cambiar de roles 52
7.2.3 Selector de acción 53
5
7.2.4 Stepper 54
7.2.5 Gestor y visor de imágenes 54
7.2.6 Modal 55
7.2.7 Inputs 55
Capítulo 8: Conclusión 56
Bibliografía 58
6
7
Capítulo 1: Introducción
La diabetes es una patología cada vez más común, cuya característica principal es la
elevada concentración de glucosa, muchas veces de manera crónica, debido a una
baja producción de insulina por parte de un individuo, o bien por la resistencia del
mismo al accionar de la insulina. También existen situaciones menos favorables en las
cuales pueden darse ambos casos simultáneamente [1].
La retinopatía diabética es una complicación ocular, producto de la diabetes, que está
causada por el deterioro de los vasos sanguíneos que irrigan la retina. Si se producen
daños en los vasos sanguíneos de la retina entonces puede ocurrir que estos sufran
una fuga de sangre o fluido. Si la enfermedad avanza, con el tiempo se producirá el
deterioro progresivo de la visión, culminando en una ceguera irreversible en adultos en
edad laboral [2].
Actualmente las imágenes médicas contribuyen a un gran avance en cuanto a
estudios. Estas son un conjunto de técnicas y procesos utilizados para crear imágenes
del cuerpo humano, o parte del mismo.
Las ya mencionadas imágenes médicas se han vuelto fundamentales en la actualidad
para poder realizar diferentes tipos de estudios. Además estas contribuyen a aumentar
el grado de exactitud y confianza con las cuales son las causas de determinadas
patologías.
Es posible, entonces, utilizar las imágenes médicas aplicadas en algoritmos
exhaustivamente elaborados, para así obtener análisis completos y detallados de una
determinada patología, y de esta manera aumentar el índice de éxito detectando estas
enfermedades.
Las imágenes médicas son un conjunto de técnicas y procesos utilizados para crear
imágenes del cuerpo humano o partes del mismo, con propósitos clínicos o bien para
ciencia médica [11].
Existen distintos tipos de imágenes médicas, que se realizan con distintos métodos y
para distintos fines. Algunos ejemplos son:
8
● Fluoroscopia
● Imagen de resonancia magnética
● Medicina nuclear
● Tomografía
● Radiografía
● Retinografía
Esta última es la de interés en este proyecto. La retinografía es una técnica que se
utiliza en medicina para obtener imágenes de la retina del paciente, es decir, de la
parte posterior del ojo [12].
9
1.1 Descripción de la problemática
Retinar es una plataforma de telemedicina que utiliza inteligencia artificial para asistir
al diagnóstico remoto de la retinopatía diabética.
Esta plataforma conecta redes de captura de imágenes con oftalmólogos y
especialistas en tratamiento, para brindar diagnósticos, informes detallados y
asesoramiento médico asistencial [5].
Actualmente Retinar posee un algoritmo de inteligencia artificial el cual se encarga de
realizar análisis y diagnóstico basado en imágenes de entrada.
Retinar conecta redes de captura de imágenes con oftalmólogos y especialistas en
tratamientos para brindar diagnósticos e informes detallados, y asesoramientos
médico/asistenciales.
Actualmente esta plataforma de telemedicina no posee una interfaz la cual le permita
interactuar entre los distintos actores del proceso de análisis de fondo de ojo. Esto
implica que los procesos para comunicarse entre estos es lento, manual y poco
escalable para quienes se encuentran relacionados.
Los técnicos de captura de imágenes tienen que generar las mismas y enviarlas de
alguna forma a quien esté a cargo de utilizar el algoritmo de inteligencia artificial. Estos
últimos deben correr el algoritmo, cargando las imágenes de entrada, generar la salida
y luego enviarla a quienes correspondan, pero esto solamente si el proceso fue
exitoso. En caso de que las imágenes tengan algún defecto, se debe comunicar a los
técnicos de lo sucedido y comenzar nuevamente el proceso. Luego el diagnóstico
automatizado es enviado al oftalmólogo encargado del caso. Finalmente, luego de
analizar el caso y comprobar los resultados del software mencionado, el oftalmólogo
comunica al paciente los resultados, y cómo debe proseguir.
Es posible que alguno de estos pasos falle y haya que reiniciar el proceso en
cualquiera de sus puntos. Por lo tanto es necesario algún medio por el cual
automatizar todos estos procesos y agilizar la comunicación y entrega de
documentación entre los distintos actores.
10
1.2 Propuesta de solución
La propuesta para la problemática abordada es una interfaz web, que cumpliria el rol
de conectar los distintos actores, de manera tal que el flujo pueda efectuarse de una
manera dinámica y sin necesidad de realizar cada uno de los procedimientos de
maneramanual, ganando así tiempo y fiabilidad, dada la automatización de las tareas
tanto de envío de datos, como de análisis de los mismos, asignación de un
oftalmólogo y, finalmente, el envío del informe para notificar a los pacientes.
1.3 Vinculación con contenido académico
Durante el desarrollo del proyecto, se aplicaron diversos contenidos aprendidos a lo
largo de la carrera. Entre ellos se puede mencionar un desarrollo de código
estructurado, modularizado y con funciones específicas como se vió en Programación
Orientada a Objetos, Introducción a la programación 1 y 2. También se aplicaron
expresiones regulares para los distintos inputs en los formularios de la aplicación y se
utilizó lógica avanzada para ciertas condiciones que requieren mayor complejidad,
vistos estos temas en Ciencias de la Computación 1 y 2 respectivamente.
El desarrollo constantemente se vio influenciado por metodologías ágiles vistas en el
ámbito laboral y en cátedras como lo son Metodologías de Desarrollo de Software y la
optativa Métodos Ágiles Para el Desarrollo de Software.
Distintas estructuras de datos fueron utilizadas para cada caso particular, ya sean
mapas de hash para un acceso eficiente a datos o arreglos de datos para un conjunto
de los mismos que se acceden de manera secuencial. La teoría de estas estructuras
fueron vistas en Estructura de Datos y Análisis y Diseño de Algoritmos 1. También, el
análisis de datos y el recorrido de estructura de datos se diseñó teniendo en cuenta la
complejidad espacial y temporal de las mismas, buscando minimizar los parámetros
mencionados. Este contenido fue profundizado en Análisis y Diseño de Algoritmos 1 y
2.
Si bien la aplicación está orientada a usuarios que posean dispositivos con banda
ancha, se pensó de antemano una solución para ahorrar el consumo de red lo más
posible, y evitar así tener que realizar solicitudes extras con información que sería
redundante. Esta mejora temprana se gestionó teniendo en consideración los
11
conceptos aprendidos en Comunicación de datos 1 y 2. Es un punto importante a tener
en cuenta para conseguir una buena experiencia de usuario, y también para el futuro
si la aplicación estuviese orientada a dispositivos móviles, ahorrando lo más posible
los datos móviles.
1.4 Organización del trabajo
En el presente trabajo se organiza el informe a través de capítulos, que abordan los
siguientes temas:
En el capítulo 2 se expone el estado del arte, explicando y detallando los conceptos
necesarios.
El capítulo 3 brinda distintas definiciones a tener en cuenta respecto a la diabetes y a
la retinopatía diabética.
En el capítulo 4 se detalla brevemente el alcance del proyecto, el aporte del mismo
hacia Retinar y los principales desafíos que se presentaron durante la elaboración del
trabajo final.
El capítulo 5 describe el modo de trabajo. Herramientas utilizadas para el desarrollo,
para entregas continuas e iterativas, para la visualización del objetivo de la interfaz,
buenas prácticas de desarrollo, entre otros.
En el capítulo 6 se detalla el flujo completo que se espera tener una vez finalizado el
front-end, haciendo énfasis en que acciones lleva a cabo cada rol, brindando así un
mayor y más claro contexto de la contribución e importancia del proyecto.
En el capítulo 7 se muestran los resultados del desarrollo; las distintas pantallas
terminadas, el flujo de datos, los formularios.
Finalmente, en el capítulo 8, se detallan las conclusiones del proyecto, posibles
mejoras sobre el trabajo realizado y una retrospectiva sobre lo aprendido.
12
Capítulo 2: Estado del arte
La aplicación desarrollada para Retinar es una muy específica. Si bien existen
aplicaciones de gestión de datos de uso genérico, como puede ser Google Sheets,
también existen aplicaciones de gestión de datos más genéricas que es posible
adaptar a distintos usuarios.
En el mundo del desarrollo web, es muy común desarrollar una sola aplicación que
luego pueda adaptarse a diferentes clientes / usuarios de manera tal de ahorrar tiempo
de desarrollo y poder reutilizar la aplicación. De esta forma, es posible reducir costos
de mano de obra, tiempo de desarrollo, y además permite unificar varios clientes
dentro de un mismo esquema, logrando luego un fácil mantenimiento de la aplicación.
Este concepto de reutilizar el mismo software para distintos usuarios se denomina
Tenencia múltiple [28].
Estas aplicaciones reutilizables, si bien podrían haber sido un buen acercamiento, el
software desarrollado requirió de características muy específicas que daban lugar a
una aplicación única para Retinar.
Entre las características que hacen único a este software, se encuentran:
● Vistas de usuario basadas en roles
● Estadísticas de usuarios para determinados roles
● Exportación de fichas de usuarios en formato PDF
● Visualización y almacenamiento de imágenes
● Analisis de imagenes con análisis de las mismas mediante inteligencia artificial
● Alta, baja y modificación de usuarios
● Formularios con datos específicos
● Comunicación con el backend específico de Retinar que posee el algoritmo de
inteligencia artificial capaz de analizar las imágenes de entrada
Si bien hay aplicaciones que gestionan estos requerimientos por separado, en su
conjunto no existe una aplicación que reúna todas estas características, y por
supuesto tampoco que esté relacionado con el dominio de interés. Por lo tanto el
software desarrollado puede considerarse único.
13
Capítulo 3: Contexto
En este capítulo se brinda información y contexto respecto a la patología de interés, al
algoritmo utilizado por Retinar y al ambiente web.
El capítulo se dividirá en dos secciones, una con el contenido relativo a la patología de
interés y los órganos implicados, y por otro lado se describirán aspectos técnicos
relacionados a la solución propuesta.
3.1 Órganos y patología
A continuación se detalla el padecimiento de interés, se explica en que consiste, los
órganos relacionados, su gravedad y estadísticas en la población.
3.1.1 Los ojos y el cerebro
La vista es uno de los sentidos más fundamentales de los seres humanos, y esta
actúa mediante un sistema constituido que tiene como ejes fundamentales a los ojos y
al cerebro.
Los ojos son los responsables de enfocar la luz y luego convertirla en impulsos
eléctricos, que posteriormente serán enviados hacia el cerebro. Por otro lado, este
último es el responsable de interpretar los impulsos recibidos y convertirlos en
imágenes [3].
3.1.2 Diabetes
La diabetes sacarina o diabetes mellitus (normalmente denominada “diabetes”) es una
enfermedad crónica que se presenta cuando el páncreas no secreta suficiente insulina
o cuando el organismo no utiliza eficazmente la insulina que produce. La insulina es
una hormona que regula la concentración de glucosa en la sangre, es decir, la
glucemia. Un efecto común de la diabetes no controlada es la hiperglucemia (es decir,
la glucemia elevada), que con el tiempo daña gravemente muchos órganos y sistemas
del cuerpo, sobre todo los nervios y los vasos sanguíneos.
14
En 2014, un 8,5% de los mayores de 18 años padecían diabetes. En 2019, esta
afección fue la causa directa de 1,5 millones de defunciones y, de todas las muertes
por diabetes, un 48% tuvo lugar antes de los 70 años de edad.
Entre 2000 y 2016, las tasas de mortalidad prematura, es decir previos a tener 70
años, por diabetes aumentó en un 5%. En los países de ingresos altos, esta tasa de
mortalidad disminuyó entre 2000 y 2010, pero luego repuntó entre ese año y 2016. En
los países de ingresos bajos o medianos, dicha tasa aumentó en ambos períodos.
En cambio, entre 2000 y 2016, la probabilidad de morir entre los 30 y los 70 años de
edad por alguna de las cuatro principales enfermedades no transmisibles
(enfermedades cardiovasculares, cáncer, enfermedades respiratorias crónicas o
diabetes) se redujo en un 18% a escala mundial [1].
La diabetes de tipo 1 (denominada anteriormente diabetes insulinodependiente,
juvenilo de inicio en la infancia) se caracteriza por una producción deficiente de
insulina y requiere la administración diaria de esta hormona.
Entre los síntomas de esta diabetes se incluyen la excreción excesiva de orina
(poliuria), sed (polidipsia), hambre constante, pérdida de peso, trastornos visuales y
cansancio. Existe la posibilidad de que los síntomas aparezcan de forma súbita [1].
La diabetes de tipo 2 se debe a una utilización ineficaz de la insulina por el
organismo. Más de un 95% de las personas con diabetes presentan la de tipo 2, que
se debe en gran medida al exceso de peso y a la inactividad física.
Los síntomas pueden parecerse a los de la diabetes de tipo 1, pero son a menudo
menos intensos, por lo que puede ocurrir que la enfermedad sea diagnosticada varios
años después de que se manifiesten los primeros síntomas, cuando ya han surgido
complicaciones [1].
3.1.3 Retinopatía diabética
Las personas con diabetes pueden desarrollar una enfermedad ocular llamada
retinopatía diabética. Esta enfermedad ocurre porque los niveles altos de azúcar en la
sangre causan daño a los vasos sanguíneos en la retina. Estos vasos sanguíneos
pueden hincharse y tener fugas de líquido. También pueden cerrarse e impedir que la
sangre fluya. A veces, se generan nuevos vasos sanguíneos anormales en la retina.
15
Todos estos cambios pueden hacerle perder la visión. La retinopatía diabética puede
separarse en dos grandes etapas: Retinopatía diabética no proliferativa (NPDR) y
Retinopatía diabética proliferativa (PDR).
La Retinopatía diabética no proliferativa es la etapa temprana de la enfermedad
ocular diabética. Muchas personas con diabetes la tienen. Cuando tiene NPDR,
muchos vasos sanguíneos pequeños sufren pérdidas y hacen que la retina se hinche.
Cuando se hincha la mácula, se denomina edema macular. Esta es la razón más
común por la que la gente con diabetes pierde la visión. Además, los vasos
sanguíneos en la retina pueden cerrarse. Esto se llama isquemia macular. Cuando eso
sucede, la sangre no puede llegar a la mácula. En algunos casos, se pueden formar
pequeñas partículas en la retina, llamadas exudados. Estas partículas también pueden
afectar la visión. En esta etapa de la patología, la visión del afectado será borrosa.
La etapa Retinopatía diabética proliferativa es la etapa más avanzada de la
enfermedad ocular diabética. Se produce cuando la retina comienza a desarrollar
nuevos vasos sanguíneos. Esto se denomina neovascularización. Estos vasos nuevos
frágiles a menudo sangran hacia el vítreo. Si sólo sangran un poco, quizá vea unas
cuantas moscas volantes oscuras. Si sangra mucho, puede que bloqueen toda la
visión. Estos vasos sanguíneos nuevos pueden desarrollar cicatrices. El tejido
cicatrizante puede causar problemas con la mácula o derivar en un desprendimiento
de retina. La retinopatía diabética proliferativa es muy grave y puede hacerle perder
tanto la visión central como la periférica (lateral) [2].
3.2 Apartado técnico
A continuación se detalla brevemente en qué consiste una aplicación web y por qué es
una solución viable. A su vez, se describe que es un algoritmo, que es la inteligencia
artificial y, finalmente, como la propuesta de trabajo final conecta con el algoritmo de
inteligencia artificial desarrollado por Retinar.
3.2.1 Aplicación web
Una aplicación web es un software que se ejecuta en los navegadores, tanto de
escritorio como de dispositivos móviles. Estos navegadores pueden ser Google
Chrome, Firefox, Safari, Microsoft Edge, entre otros.
16
Este tipo de aplicaciones es utilizada principalmente cuando se busca utilizar un
software el cual no requiere ser instalado en un dispositivo y que, normalmente,
consume pocos recursos a la hora de ejecutarse [9].
Las aplicaciones web también se caracterizan por tener una interfaz e interacción muy
amenas, siendo sencillas de comprender y utilizar.
A su vez, existen múltiples asistentes de desarrollo que ayudan a la construcción de la
aplicación, dando indicaciones de como estructurar el programa de tal forma que
cumpla con ciertos estándares que permiten que más usuarios puedan utilizar el
software independientemente de las capacidades psíquicas y motrices del usuario,
como es el caso del daltonismo, movilidad reducida, ceguera, sordera, entre otras [10].
3.2.2 Algoritmos
Actualmente cualquier software, como aplicaciones web o aplicaciones para
dispositivos móviles, está basado en algoritmos. Estos se describen como cualquier
procedimiento computacional bien definido que toma uno o más valores de entrada y
produce uno o más valores de salida. Por lo tanto, un algoritmo es una secuencia de
pasos computacionales que transforman entradas en salidas. También se puede ver a
un algoritmo como una herramienta para resolver un cálculo bien especificado [7].
En este caso particular, todo el flujo de datos está basado en el procesamiento de
información, que está constituido por diferentes algoritmos.
3.2.3 Inteligencia artificial
La inteligencia artificial nació en la década de 1950, como respuesta respecto a si las
computadoras podían "pensar" preguntas cuyas alternativas todavía están siendo
exploradas hoy en día. Una definición concisa de IA sería: el esfuerzo por automatizar
tareas intelectuales que normalmente son realizadas por humanos. Como tal, la IA es
un campo general que abarca el aprendizaje automático (machine learning) y el
aprendizaje profundo (deep learning) [8].
3.2.4 Algoritmo de Inteligencia Artificial
A partir de las definiciones previamente dadas, podemos definir un algoritmo de
inteligencia artificial como un subconjunto del aprendizaje automático que le dice a la
17
computadora cómo aprender a operar por sí misma. A su vez, el software continúa
adquiriendo conocimientos (entrenando) para mejorar los procesos y ejecutar las
tareas de manera más eficiente.
3.2.5 Algoritmo de Retinar
El proceso de diagnóstico y análisis manual de las imágenes de fondo de ojo
constituye en sí mismo una tarea costosa. Es por esto que Retinar posee su propio
conjunto de algoritmos para poder llevar a cabo esta tarea de manera automatizada
[41].
Estos algoritmos mencionados se crearon para su utilización en el aprendizaje
automático y el aprendizaje profundo. De esta manera se podrían solventar las tareas
de clasificación de imágenes y detección de elementos de interés de manera más
sencilla, con una alta tasa de precisión y mayor robustez respecto a la fidelidad de los
resultados [41].
A continuación se listan los diferentes algoritmos de inteligencia artificial utilizados por
Retinar:
● Fundus Vessel Segmentation - TBME: Versión modificada del algoritmo
publicado por los mismos autores, en IEE TBME 2016. Permite realizar la
segmentación de vasos sanguíneos en imágenes de fondo de ojos a color
[42][43].
● Overfeat Glaucoma: Algoritmo para la detección automática de glaucoma
(enfermedad que genera pérdida de visión) a partir de redes neuronales
específicas (OverFeat y VGG-S) [42][44].
● Red Lesion Detection: Algoritmo utilizado para la detección de lesiones rojas,
como son los microaneurismas y las hemorragias. [42][45].
18
Capítulo 4: Alcance y aporte del
proyecto
A continuación se explica brevemente el alcance y aporte del proyecto. También se
detallan, sin entrar en detalles técnicos, los desafíos que se presentaron en el
transcurso del trabajo final.
4.1 Alcance del proyecto
El proyecto en sí es una interfaz web, para que los distintos usuarios puedan
interactuar con la información que es brindada desde el lado del servidor. Se procuró
crear un front-end completo, para luego poder delegar el código a las personas
encargadas de realizar la conexión con el back-end y mantener el front-end.
Durante todo el proyecto también fue requerido tener constantemente desplegada en
la web una versión del proyecto para, de esta manera, poder mostrar continuamente
los cambios realizados y tener un feedback constante.
El proyecto se almacenó en un repositoriode Github, una plataforma para alojar
archivos destinada al trabajo colaborativo entre equipos [4]. De esta forma, el código
fuente del proyecto estaría disponible a todo momento para quienes tuviesen permisos
para visualizarlo y/o editarlo, en este caso las personas a cargo de Retinar y los
desarrolladores que posteriormente tomarían la responsabilidad del proyecto.
4.2 Necesidad de Retinar
Esta plataforma surge ante la necesidad de agilizar los diagnósticos relacionados con
la retinopatía diabética. Por lo tanto, esta misma propone un sistema completo para
poder lidiar con ciertas complicaciones que han detectado que aletargan todo el flujo
de análisis de los pacientes. Ejemplos de lo ya mencionado es la gran demanda de
oftalmólogos respecto a los pocos que se encuentran disponibles, o bien el elevado
número de etapas por la cual transita un paciente hasta que finalmente obtiene sus
resultados con un diagnóstico real [5].
19
Además, la necesidad de este software también surge de las características tan
propias que fueron solicitadas por Retinar. Como se expuso en el capítulo 2, una
aplicación de propósitos general no alcanza a cubrir todas las necesidades y
características que se necesitan.
4.3 Aporte de este trabajo final a Retinar
Este proyecto final de carrera aportó la interfaz necesaria para poder conectar los
distintos actores alrededor de los objetivos de la organización. Es decir, la aplicación
web es el intermediario entre la IA, los oftalmólogos, los pacientes y el servidor.
La aplicación permite, entonces, que los procesos puedan ser automatizados en
mayor medida. Las imágenes de fondo de ojos son entregadas a los oftalmólogos
mediante la plataforma web, y estos mismos tienen la opción de visualizar las
imágenes como fueron tomadas y tambien una version ya analizada por la IA,
generando así una mayor certeza para los oftalmólogos en sus análisis, lo cual implica
diagnósticos con mayor grado de certeza para los pacientes.
También, dada la estructura del proyecto, se deja abierta la posibilidad de añadir
nuevas características a la aplicación en el futuro. Esto puede ser, por ejemplo, nuevas
funciones para usuarios administradores, otra herramienta interna para la visualización
de imágenes, nuevas vistas que impliquen nuevo flujos de datos, la posibilidad de
importar datos de pacientes directamente desde documentos con extensión .csv o
similar, entre otras.
4.4 Principales desafíos
Durante el desarrollo de la maquetación se encontraron varios desafíos que valen la
pena resaltar:
● Fidelidad al diseño realizado por los diseñadores gráficos: La aplicación
fue realizada en base a mocks realizados por diseñadores y alojados en Figma.
Al realizar el desarrollo, cada componente tenía que ser lo más fiel posible
respecto al realizado por las personas profesionales encargadas del diseño.
Esto llevó a un desarrollo un poco más tardado dados los detalles de las
20
pantallas, las distancias, los tamaños, las fuentes, entre otros.
● Código comprensible / escalable: Desde un principio el proyecto estuvo
destinado a quedar en manos de otros desarrolladores. Esto es dado que el
proyecto de grado solo sentaría las bases de la interfaz web. Por lo tanto, estas
bases se hicieron de la manera más escalable y comprensible posible, para
que quienes tuviesen que seguir con el proyecto pudieran hacerlo sin que esto
requiriera un esfuerzo extra [6], agilizando así el desarrollo y finalización de la
interfaz web.
● Vistas privadas: Tan solo una de las vistas de la aplicación es pública, es
decir, que es accesible sin necesidad de estar logueado en la app. Se realizó
un logueo maquetado para poder desarrollar la interfaz gráfica sin necesidad
de un back-end con un flujo real de autenticación, pero de igual manera fue un
obstáculo que pudo superarse es generar una lógica para permitir el acceso al
resto de las vistas solo a usuarios que estuviesen autentificados.
Esto también aplica para vistas las cuales solo son accesibles dado
determinado rol, es decir que las vistas para realizar informes solo estuviesen
disponibles para oftalmólogos, o las vistas de alta / baja / modificación
estuviesen solo para admins.
● Manejo de imágenes: Un gran desafío fue el implementar la lógica e interfaz
para el manejo de imágenes. Ejemplo de esto es la herramienta para subir las
imágenes, las opciones para alternar entre los distintos modos (normal, con
primer diagnóstico de IA, con segundo diagnóstico de IA), el informe con
respecto a qué imágenes se subieron exitosamente.
● Minimizar el número de dependencias: Las dependencias se definen código
externo al proyecto principal, que se utiliza gracias a la funcionalidad o
funcionalidades que brinda [33]. Este se almacena en un fichero del proyecto
llamado “package.json” y queda almacenado allí para guardar la referencia a la
dependencia. Si bien estas son muy útiles, ya que es código que ya fue
refinado y testeado, el uso excesivo de las mismas incrementa el tamaño final
de la aplicación, haciendo de esta manera que el software sea cada vez más
21
costoso a la hora de ser cargado en los navegadores. Además, como su
nombre propiamente indica, estas dependencias están sujetas a los cambios
que realicen sus autores sobre ellas. Esto quiere decir que si son modificadas,
y en el proyecto principal nos traemos tales actualizaciones, estaremos sujetos
a los cambios realizados [34]. Si bien existen técnicas para solventar esta y
otras problemáticas, las dependencias siguen siendo muy útiles en su justa
medida. Por esto mismo se buscó utilizar el número mínimo e indispensable de
software externo para este proyecto.
22
Capítulo 5: Herramientas e interfaz
A continuación se detallan las herramientas utilizadas, y cómo las mismas contribuyen
a la creación de la aplicación web en sus distintas etapas de desarrollo.
5.1 Figma
El desarrollo de plataforma estuvo apoyado por un diseño otorgado por Retinar. El
mismo se alojó en Figma, una plataforma para la creación de interfaces gráficas,
orientado al trabajo colaborativo entre diseñadores y desarrolladores.
Figura 1: diseños en figma de la aplicación
Gracias a esta herramienta se pudieron replicar de manera minuciosa los distintos
detalles plasmados en el diseño, como son tamaños de fuente, familias de las mismas,
colores, márgenes, alineamiento, entre otros.
Esta herramienta, además, es útil no solo para desarrolladores, sino también para
quien esté destinada la aplicación, ya que es posible ver una preview del software a
realizar y pueden realizarse cambios bajo demanda. A su vez Figma permite montar
un flujo de datos con componentes interactivos, como botones y desplegables, para
que todo tipo de usuarios puedan conocer cómo son las interacciones esperadas con
la aplicación [31].
23
Otra característica a resaltar de este software es la capacidad de generar
documentación de manera alternativa. Nos referimos de manera alternativa al hecho
de poder dejar anotaciones, especificaciones y detalles a tener en cuenta en las
mismas pantallas en donde se encuentran los diseños para maquetar.
5.2 HTML, CSS, Javascript
Estos tres lenguajes son, normalmente, los pilares para crear una aplicación web.
HTML permite crear los cimientos de la aplicación, definiendo metadata necesaria para
el sitio, y creando un punto de entrada que, posteriormente, usará el framework
utilizado para montar el resto del software [13]. Este lenguaje de etiquetado es
fundamental para los sitios web porque puede ser que una aplicación sea montada
simplemente con este lenguaje o, también, puede utilizarse simplemente como punto
de entrada y que otras librerías trabajen en base a esta.
Definimos como “punto de entrada” a una plantilla mínima necesaria para que otra
librería pueda ejecutarse cómodamente dado un punto de partida, en este caso el
punto de entrada, como puede ser una etiqueta sencilla con un identificador.
Figura 2: ejemplo de punto de entrada por defecto deuna aplicación React
CSS es el lenguaje que permite modificar los elementos web, ya sea en tamaño, color,
o cualquier otra propiedad que sea necesaria cambiar [14]. Este lenguaje es
indispensable para lograr una interfaz de usuario amena, sencilla de utilizar, de
comprender, e indispensable para lograr diseñar a nivel código lo plasmado en el
Figma.
24
Finalmente Javascript es el lenguaje que permite darle interactividad a la aplicación, y
el que se utiliza en conjunto con el framework React [15]. Es el principal actor a la hora
de realizar lógica en la aplicación, ya sea envío de formularios, escuchar eventos
(clicks, drag, drop), navegar entre vistas de manera imperativa, fetching de datos,
entre otros. Si bien es una herramienta opcional, se utiliza en la mayoría de los casos.
También se utiliza de manera implícita, ya que hay librerías como React que las
utilizan por debajo para lograr sus características.
5.3 React
React es una librería para la creación de interfaces de usuario, orientada a
componentes reutilizables. Esta utiliza un punto de entrada configurado con HTML que
luego, a partir de este, todo el resto de la aplicación es renderizada [16] [17]. Por lo
tanto la aplicación es, normalmente casi en toda su totalidad, dinámica.
Figura 3: flujo de datos en React
Principalmente React fue utilizado dado el conocimiento previo con esta tecnología
respecto a otras alternativas.
Además, esta librería permite la creación de vistas y componentes muy rápidamente
dada su sencillez a la hora de importar dependencias dentro del mismo proyecto.
25
También su estructura de carpetas normalmente es sencilla de gestionar, por lo tanto
esta característica también aporta a una rápida escalabilidad del proyecto.
5.3.1 Flujo de información
A diferencia de otras librerías para gestión de UI como Angular, React posee un flujo
de datos unidireccional [21]. Esto quiere decir que los componentes padres envían
datos a sus descendientes, pero estos últimos no poseen comunicación directa con
sus predecesores. Por lo tanto en React se trabaja mucho con eventos y callbacks.
Los eventos son acciones generadas por una acción disparada por un usuario desde
la interfaz gráfica o, también, disparada por el sistema mismo [22]. Por medio del
burbujeo, propagación de un evento desde un componente hacia sus ancestros, los
componentes padres sabrán que una acción se disparó, siendo esta acarreada hasta
la raíz.
Los callbacks son funciones pasadas por parámetros [23]. Estas son especialmente
utilizadas en React ya que, como mencionamos, los padres envían datos a sus hijos, y
esta data puede ser por ejemplo uno o más callbacks.
5.3.2 JSX
JSX (JavaScript XML) es un syntactic sugar que se utiliza en conjunto con React para
facilitar el desarrollo del código, ya que este se asemeja a la sintaxis de XML [18]. El
syntactic sugar se define como una sintaxis más amena para cualquier lenguaje de
programación, que permite un trabajo de desarrollo más fluido al tener ciertas
funciones o features del lenguaje expresados de manera sencilla o, también, de
manera más abstracta logrando así una mejoría en la calidad del código [38].
Hoy en día prácticamente cualquier proyecto escrito en React utiliza esta sintaxis dado
su entendimiento y similitud con, por ejemplo, HTML. En equipos profesionales de
trabajo es, sin dudas, la mejor opción para desarrollar con este framework.
26
Figura 4: Ejemplo de JSX utilizado en repositorio popular de código abierto. Link:
https://github.com/sanyuan0704/react-cloud-music/blob/master/src/App.jsx
Como se mencionó, JSX es un agregado y React podría utilizarse de manera pura sin
ningún problema; llamando funciones de creación de nodos, especificando el tipo de
elemento, su contenido, sus props [24]. Se definen como “props” a aquellos datos que
son asignados a un componente de manera dinámica; los componentes se sirven
estos datos para conocer cuándo deben volver a renderizar, es decir, cuando deben
actualizar los datos que deben ser mostrados en la interfaz gráfica [35].
27
Figura 5: Sintaxis básica de React, sin JSX
5.3.3 React respecto a otras librerías
El uso de librerías para el desarrollo de aplicaciones web es algo opcional, aunque en
la mayoría de los casos se utilizan. Se pueden identificar ciertos pros y contras en el
uso de estas:
Pros:
● Desarrollo más ágil
● Gestión de componentes
● Gestión de eventos
Contras:
● Overhead por dependencias de librería
● Curva de aprendizaje
● Diferencias sustanciales entre librerías
En las etapas más tempranas del proyecto hubo que decidir si se iba a utilizar una
librería, y si fuese así, cuál de todas las que hay actualmente para desarrollar un
front-end. Las principales alternativas fueron React y Vue. Esta última fue
recomendación por parte del director de este trabajo, dado que quienes luego
tomarían el ownership del proyecto y terminarían con el resto de pendientes, son
desarrolladores con experiencia en Vue. Sin embargo, para agilizar el proceso de
28
desarrollo y realizar un código de calidad, finalmente se optó por React, dada la
experiencia previa y actual con esta tecnología.
Otra opción viable era Angular, librería de front-end para la creación de interfaces
gráficas altamente escalables con un flujo de datos bidireccional, a diferencia de React
que posee un flujo unidireccional [25]. Si bien en escalabilidad y gestión de carpetas
Angular posee cierta ventaja sobre React, esta última siguió siendo mejor opción dado
el dominio sobre la misma.
5.4 Vercel
Vercel es una plataforma que permite el despliegue de aplicaciones front-end [19].
Esta fue utilizada para mantener actualizado el proyecto a medida que se añadían
nuevas características y/o vistas, logrando así mantener un constante feedback con
Retinar.
Figura 6: login de la aplicación desplegado en Vercel
Adicional a lo mencionado, fue utilizada por su sencillez, dado que basta con
configurar un usuario en esta plataforma con la rama principal de un proyecto en un
29
repositorio, y automáticamente Vercel se encarga de dejar una configuración interna
por defecto, que realiza despliegues a medida que se generan merge entre ramas [20],
un proceso automatizado que es un muy solicitado y necesario en la industria.
Esta plataforma permite el despliegue de aplicaciones con un “nivel” gratuito, lo que lo
hace ideal para prototipos de proyectos, ya que no hay gastos de servidores y posee
una performance muy alta, permitiendo despliegues a demanda cuando se realiza un
merge contra ciertas ramas.
5.5 Arquitectura
Para tener un mayor control y organización del proyecto, se planificó y realizó una
arquitectura con librerías, organización de carpetas y buenas prácticas ya utilizadas en
el ámbito laboral.
5.5.1 Orientado a que usuario
La aplicación está basada completamente en sesiones. Esto implica que la gran
mayoría de las vistas son privadas al público y solamente quienes posean
credenciales de usuario podrán acceder a la plataforma.
Los tipos de usuario hasta el día de la fecha son: técnico de captura, oftalmólogo,
administrador y paciente. Independientemente del número de vistas/pantallas a la
cada usuario pueda acceder, todos tendrán en común que necesitan mantener una
sesión para poder navegar a través de la aplicación web.
Como se mencionó anteriormente, la aplicación en su mayoría es constantemente una
aplicación “privada”. Por lo tanto, esto permite un desarrollo sencillo con React. Esta
librería tiene como desventaja la construcción de vistas que no pueden ser
encontradas por los rastreadores de Google, por lo tanto, el SEO (Search Engine
Optimization) se ve duramente afectado. Sin embargo, como ya se aclaró con
anterioridad, el objetivo de Retinar no es atraer público a la aplicación, así que se ve
solventada la desventaja de React gracias al negocio de Retinar.
Los rastreadores de Google son robots que permiten indexar páginas web y poder
otorgarles un “puntaje”, que luego seusa como referencia para aparecer en las
búsquedas utilizadas en el buscador de esta empresa [37]. Coloquialmente se define
30
como SEO a un conjunto de prácticas que permiten a una aplicación web obtener un
buen posicionamiento, entre los resultados de Google, cuando se realiza una
búsqueda con temas relacionados con la misma [38].
5.5.2 Estructura de carpetas
La estructura de carpetas se mantuvo simple, centrada principalmente en el directorio
src que contiene los componentes que constituyen a las vistas y sus subcomponentes.
En otros escenarios, el proyecto contiene más ficheros que contribuyen, por ejemplo, a
procesos de CI/CD (continuous integration, continuous delivering), configuración de
Docker, variables de entorno, entre otros.
Figura 7: estructura de carpetas de la aplicación web desarrollada para Retinar
Existen muchas otras maneras de generar estructuras de carpetas, dependiendo del
enfoque que se quiera dar o del objetivo del proyecto. Una alternativa popular podría
haber sido utilizar Atomic Design, generando así una estructura más modularizada con
componentes subdivididos.
Atomic Design es una metodología para el diseño de sistemas, principalmente
orientada maximizar la subdivisión de las piezas del código, agrupando así fragmentos
del mismo en grupos bien definidos, otorgándoles una semántica similar en cuanto a
granularidad de cada fichero [40]. Si bien es un diseño que puede ser adaptado a la
31
necesidad de cada equipo de trabajo, comúnmente se dividen en: átomos, moléculas,
organismos, templates y páginas.
Figura 8: diseño general de Atomic Design
5.5.3 Manejo de estado: Redux y useState
Las aplicaciones de front-end que utilizan React se basan fuertemente en estados;
estos son datos que se persisten internamente por la aplicación y notifican a los
componentes para que estos vuelvan a renderizar la UI cuando sea necesario.
Por un lado se manejan estados locales con useState, una utilidad de React que se
utiliza para gestionar estados en componentes y los subcomponentes del mismo.
Figura 9: flujo de datos de Redux
Por otro lado se utiliza Redux, una librería de Javascript para mantener el estado de
forma global, que normalmente se usa para gestionar los estados de varios
componentes que en vez de ser descendiente uno del otro, son “primos” o “hermanos”.
Esta decisión de diseño fue a causa de los distintos pasos que hay a la hora de
registrar pacientes y cargar datos.En la figura 9 se puede ver como el flujo de datos
32
está constantemente cambiando pero siempre siguiendo una misma dirección o una
misma idea. Es por eso que, finalmente, se optó por gestionar los datos de manera
global. Esto también contribuye a un código más “limpio”, ya que la lógica relacionada
con datos es movida a un lugar independiente del resto de código, facilitando así la
búsqueda de estos fragmentos de lógica, separando archivos, evitar mezclar ideas
dentro de los mismos ficheros, entre otras mejoras.
5.5.4 Navegación
La navegación de la aplicación se manejó utilizando el concepto de Single Page
Application (SPA), utilizando la librería React Router Dom.
Una SPA es una aplicación web la cual provee una navegación más fluida entre vistas,
simulando que fuese una aplicación como las de escritorio, que poseen sus vistas ya
cargadas desde el inicio [26]. Las SPA, entonces, permiten una navegación más
amena para el usuario y también permite el ahorro de recursos, evitando llamados
HTTP innecesarios para volver a cargar recursos que ya fueron solicitados con
anterioridad.
React Router Dom es una librería que permite construir single page applications. Este
paquete se utiliza de la mano de React para levantar las interfaces web, suministrando
a los desarrolladores múltiples utilidades (entre ellas componentes, hooks, funciones)
para su uso [27].
Si bien el uso de SPA es un agregado interesante, no es obligatorio. La navegación
podría solventar muy fácilmente utilizando anchors [32], lo que supondría un menor
tiempo de desarrollo de software y también disminuiría el tamaño final de la aplicación.
Como contra de esta alternativa, todos los recursos deberían cargarse nuevamente,
aumentando el tiempo de navegación entre vistas y, también, el ancho de banda final
consumido.
Se definen como “anchors” a aquellos elementos HTML que se utilizan como links, y
permiten abrir una nueva pestaña, o navegar sobre la pestaña activa, o bien permite la
descarga de documentos como PDF, imágenes, entre otros.
33
5.5.5 Autenticación
Como el desarrollo de la interfaz gráfica fue independiente del sistema de
autenticación por parte del back-end, se utilizó una bandera almacenada en el
navegador web para simular una sesión real. De esta forma se dejaría lista la
posibilidad de cambiar esta “bandera” en el futuro y reemplazarla por el mecanismo de
autenticación que sea más conveniente de acuerdo a las necesidades que surjan.
El término “bandera” hace alusión a un dato que haga de identificador para un
proceso, en este caso se utiliza para saber si el usuario se encuentra logueado o no.
Un mecanismo adecuado para la autenticación de usuarios podría ser el uso de JSON
Web Token (JWT). Este es un mecanismo de estándar libre para el cifrado de
información, que permite que tanto el cliente como el servidor se comuniquen de
manera segura gracias a que estos tokens llevan una firma que puede ser corroborada
[29].
Figura 10: cómo está conformado un JWT
Podría ser interesante agregar un mecanismo de encriptado de datos, de manera que
todas las peticiones posean sus datos seguros, hasta el token de autenticación.
5.5.6 Código semántico
El código utilizado para manejar la interfaz fue escrito utilizando Styled-Components,
una librería para escribir código de manera más semántica, facilitando así la
34
compresión del proyecto trabajando de manera colaborativa que, utilizado de manera
correcta, permite transmitir explícitamente lo que se busca realizar en la vista.
Figura 11: ejemplo de código semántico orientado al trabajo colaborativo
Figura 12: Este es un ejemplo, extraído de MDN Web Docs, de cómo es un HTML básico
En la figura 12 se puede notar que sin conocimientos del lenguaje de etiquetado, se
dificulta la comprensión del contenido que se está creando. El código semántico,
35
previo a ser procesado por navegadores, permite transmitir las ideas que se expresan
en el código de manera sencilla.
5.5.7 Despliegue automatizado
Como se mencionó con anterioridad, el despliegue fue gestionado utilizando Vercel.
Esto se realizó con una configuración externa a los ficheros del proyecto, evitando así
tener configuraciones en el mismo y a su vez gestionando desde otra plataforma de
manera automática e incremental.
El principal beneficio de esta plataforma, es la sencillez con la que se puede lograr un
despliegue. Toma como fuente un repositorio y el resto lo hace la misma aplicación.
Además Vercel posee configuraciones que le permite estar “escuchando” a los “merge”
que son realizados en las ramas de los repositorios [36]. De esta forma el despliegue
solamente depende de lo realizado en el repositorio, en este caso de Github,
facilitando la visualización de las nuevas características del proyecto a Retinar.
El merge es la acción de fusionar ramas, logrando así un resultado final con los
cambios de una rama, o la otra, o una mezcla/fusión de ambas. Pueden producirse
conflictos cuando se realiza esta acción por lo que es necesario gestionar, en algunos
casos, manualmente estas fusiones.
Existen otras opciones como Netlify o Heroku, las cuales son plataformas para el
despliegue de aplicaciones, pero Vercel fue considerada la mejor opción dada su
facilidad de uso y su interfaz gráfica que resulta ser muy intuitiva para su manejo.
36
Figura 13: interfaz gráfica de Vercel para la aplicación web de Retinar.
37
Capítulo 6: Flujos de trabajo
La aplicación en sí misma posee un objetivo general: ser un medio por el cual, los
distintosactores del proceso del análisis de imágenes de fondo de ojo, puedan cumplir
su función de la manera más rápida y sencilla posible.
Figura 14: roles dentro de la aplicación, y acciones que pueden realizar
A su vez, dentro del mismo software existen distintas funcionalidades, dependiendo
del rol de cada usuario y que se desee hacer, dependiendo de este rol mencionado. A
continuación se listan los roles que existen dentro de la plataforma, y qué acciones o
flujos puede realizar cada uno.
Figura 15: distintos roles de la aplicación, seleccionables gracias a un widget personalizado
38
6.1 Técnico de captura de imágenes
Los técnicos de captura de imágenes son aquellos usuarios encargados de subir las
imágenes de fondo de ojo en la plataforma, para que luego los oftalmólogos lleven a
cabo su diagnóstico. Los técnicos tienen acceso a dos flujos de trabajo, estos son:
● Listar los estudios realizados anteriormente: como su nombre lo indica, lista
los estudios realizados con anterioridad. Sirve como un histórico para llevar
cuenta de que pacientes han sido cargados, en que fecha, que tipo de estudio
(monocular izquierdo, derecho o binocular), si existe un informe asociado al
estudio y finalmente, el estado en el cual se encuentra tal estudio.
● Realizar nuevo estudio: este flujo permite realizar un nuevo estudio a partir de
un paciente que se encuentre ya cargado en la base de datos o no. Este paso
se realiza al principio del proceso, buscando por DNI y género. En el caso de
que el paciente se encuentre realizado, se pasa al siguiente paso, caso
contrario el mismo es cargado junto con los datos correspondientes; nombre
completo, fecha de nacimiento, correo, localidad, seguridad social.
En la siguiente etapa se registran los datos asociados a la nueva consulta,
independientemente si el paciente se encontraba registrado o no, junto con los
datos necesarios para generar el histórico, como son la fecha del estudio,
domicilio actual del paciente, su peso y altura actual, el tipo de examen e
información adicional si así se requiriese.
Luego de registrar la información del caso, se cargan las diferentes imágenes
de fondo de ojo que fueron capturada con anterioridad por el técnico. Estas
imágenes son previamente analizadas antes de permitir una visualización,
indicando si poseen la calidad adecuada para ser analizadas por la inteligencia
artificial y así asistir al diagnóstico médico. Finalmente, las imágenes son
enviadas al backend y se visualiza un pequeño mensaje de paciente referible o
paciente no referible, indicando una respuesta inmediata por parte de la IA
respecto al estudio. Este resultado no es definitivo, pero ayuda a los técnicos a
dar un resultado preliminar que puede servir para distintos motivos, según cada
laboratorio lo requiera.
39
6.2 Oftalmólogo
Los oftalmólogos poseen similitudes y diferencias con las acciones que puede tomar
un técnico. Comparten el acceso al listado de estudios realizados, pero además
poseen una opción adicional, que es evaluar un nuevo estudio.
● Evaluar un nuevo estudio: Esta opción permite tomar un caso que fue
anteriormente cargado por un técnico, y llevar a cabo un análisis del mismo. Al
oftalmólogo pertinente se le facilitan las imágenes que fueron cargadas por los
especialistas junto con las imágenes analizadas por la inteligencia artificial,
para asi el oftalmologo finalmente pueda proporcionar un resultado en base a
lo que este observa, y adición a lo que la IA le ofrece como resultado de su
propio análisis. Es posible generar un archivo con extensión pdf luego de
finalizar el estudio, para que este sea luego archivo y enviado al paciente.
Dependiendo de ciertas circunstancias, puede ocurrir la situación en la que el
oftalmólogo sea penalizado, y así de esta manera tenga restricciones a la hora
de tomar casos, y que no los tome sin control alguno.
6.3 Administrador
Respecto a los accesos que poseen los administradores, estos pueden generar altas,
bajas y modificaciones de distintos recursos, como son otros usuarios
(administradores, técnicos, oftalmólogos), de nodos, de centros de atención
registrados, entre otros. Es decir, la función principal de este rol, es poder gestionar los
recursos dentro de la aplicación.
En la figura 15 se puede observar los distintos estados que puede poseer un
administrador.
Para estas secciones se facilitó solamente la vista para la gestión de otros
administradores. Existe la posibilidad de que el ABM (alta / baja / modificación) del
resto de los recursos posea una estructura similar.
40
La creación de un primer administrador, una vez que la aplicación se encuentre
productiva, se deberá hacer manualmente desde la base de datos del software, para
así luego poder gestionar nuevos administradores.
Figura 16: vista de ABM de administradores, desplegado en Vercel.
6.4 Paciente
Aquellos usuarios que sean pacientes poseen la versión más “reducida” de la
aplicación. Puede navegar solo en su “home” personalizada, que es una vista muy
similar a la del oftalmólogo cuando revisa algún estudio, pero en este caso sería una
vista de solo lectura con el informe del profesional. Adicional a esto puede ver un
historial con la lista de estudios que el paciente ha tenido, muy similar a la lista de
estudios recientes que pueden ver el oftalmólogo y el técnico de captura.
La idea es que el paciente pueda visualizar la información de una manera clara y
accesible. Si bien se le envía un pdf al paciente, indicando los resultados con las
imágenes adjuntas, el tener también la interfaz web ayuda a comprender de manera
más interactiva el resultado de sus análisis.
41
Capítulo 7: Implementación y
resultados
La aplicación ya finalizada posee diferentes vistas. Estas, a su vez, poseen diferentes
funciones, características y formas de interactuar. También existen usuarios con
distintos roles, los cuales pueden causar que el comportamiento de una vista cambie,
se habilitan o deshabilitan ciertas características, que algunas vistas sean totalmente
inaccesibles, entre otras variantes.
A continuación se listan brevemente las distintas vistas, para poder tener una visión
más clara de cómo está conformada la plataforma:
● Login
● Home
● Ficha paciente
● Listado de estudios
● ABM de técnicos
● Nuevo estudio - Paso 1 - Búsqueda
● Nuevo estudio - Paso 2 - Datos personales
● Nuevo estudio - Paso 3 - Diagnóstico IA
● Nuevo estudio - Paso 4 - Finalizar
Existen además más vistas pendientes pero que no fueron añadidas en el diseño, por
lo tanto no fueron maquetadas. Estas serían:
● ABM de retinólogos
● ABM de admins
● ABM de tratamientos
● ABM de nodos
● ABM de estudios
● ABM de centros de tratamientos
● ABM de pacientes
Si bien las vistas faltantes en esencia son similares dada la funcionalidad de “alta -
baja - modificación”, es prudente realizarlas siguiendo los lineamientos de un diseño,
para evitar realizar vistas que pueden no coincidir con lo que el diseñador y Retinar
42
buscan reflejar con la interfaz gráfica.
En la figura 14 se puede observar los diferentes roles y las acciones que puede
realizar cada uno. Algunas acciones son compartidas entre roles y otras son
específicas para cada tipo de usuario.
A continuación se detallan las vistas maquetadas, mostrando una comparativa del
diseño en Figma comparado con el resultado final desplegado. También se adjuntan
los enlaces del repositorio desplegado para que pueda ser accedido y examinado si
así se requiriese.
7.1 Vistas
Una vista es una pantalla completa que muestra toda la información disponible en la
actual URL de la aplicación, y se considera el conjunto de todos sus elementos [40]. A
su vez la vista, normalmente, se subdivide en componentes más pequeños, que
veremos más adelante en este capítulo. A continuación se detallan las vistas
trabajadas a partir de los diseños provistos por Retinar, en Figma.
7.1.1 Login
Esta es la pantalla que sirve como punto de entrada de la aplicación. Su principalfunción es poder permitir que un usuario ingrese sus credenciales y obtenga acceso al
resto de las vistas. Es la página por defecto al ingresar por primera vez a la
plataforma. Dado que el software desplegado no está conectado con un backend,
basta con seleccionar el botón para ingresar, y el usuario será redirigido a la Home.
43
Figura 17: login de la aplicación desde Figma
Figura 18: login de la aplicación desplegada en Vercel.
44
7.1.2 Home
La home es la pantalla en donde la plataforma permite al usuario navegar entre las
demás vistas. Como oftalmólogo o técnico solo hay disponibles un par de opciones,
pero como administrador es posible entrar a diferentes tipos de vistas ABM. Se puede
considerar la página principal del software una vez que el usuario se encuentra
logueado.
En capítulos anteriores se mencionó que dentro de la aplicación existen roles. Estos
permiten a la aplicación poder dar diferentes experiencias de usuario dependiendo del
mismo.
Para un técnico, las opciones disponibles son visualizar el listado de evaluaciones o
realizar un nuevo estudio.
Un oftalmólogo puede mirar también el listado de evaluaciones, o bien evaluar un
nuevo caso. Aquí entra en juego también las acciones realizadas con anterioridad del
oftalmólogo, ya que si este revisó un caso pero no concluyó con el flujo del mismo, es
decir no brindó un análisis o resolución sobre este, entonces tendrá otra opción, que
es continuar el caso. Dadas ciertas reglas del negocio, si el oftalmólogo no cumple con
determinados requisitos en sus análisis, este será penalizado, no puede generar
análisis y reportes por un determinado tiempo. Finalmente, pasado cierto tiempo y
concluida la penalización, el oftalmólogo podrá seguir utilizando el software y
analizando casos.
Figura 19: vistas de la home del oftalmólogo, desplegadas en Vercel, para evaluar un nuevo
estudio y continuar con otro, respectivamente
45
Figura 20: home del administrador, desplegado en Vercel, donde se pueden ver todas las
opciones de ABM
El usuario administrador posee una home con más opciones. Todas ellas relacionadas
con el ABM de entidades.
Figura 21: vistas de la home del oftalmólogo, desplegadas en Vercel, donde este se haya
bloqueado y luego con la posibilidad de habilitar el módulo de informes de nuevo,
respectivamente
Finalmente el usuario con rol “paciente” no posee una página de home como las vistas
anteriormente. A continuación se detalla el caso del paciente, ya que su
comportamiento y accesos es muy distinto al de un profesional de Retinar.
46
7.1.3 Ficha paciente
En contraste con la home del resto de los roles, la home para el rol de paciente posee
una estructura más orientada a una “ficha”, además accede inmediatamente a una
vista que muestra los resultados del último estudio que usuario obtuvo. Esto da lugar a
una experiencia de usuario más destinada a la “solo lectura”, ya que es el tipo de
usuario que menos permisos posee sobre la plataforma, siendo esta solo una
herramienta informativa para el paciente.
Figura 22: home del paciente, desplegada en Vercel
En este caso se utiliza el layout de la vista para cargar imágenes y realizar su análisis
de calidad, que será explicado más adelante. El detalle a resaltar es la reutilización de
una vista que su función es la carga de imágenes, para luego ser usada para una
sección de solo lectura.
7.1.4 Listado de estudios
Esta vista tiene como principal objetivo reflejar un histórico de los estudios, ya sean
propios en el caso de los pacientes, o los realizados en el caso de técnicos de captura
u oftalmólogos. Existen pequeñas variaciones entre vistas, aunque en esencia es el
mismo componente.
47
Figura 23: listado de estudios para técnicos u oftalmólogos
Figura 24: listado de estudios para pacientes
7.1.5 ABM de técnicos
El alta / baja / modificación de técnicos de captura se realiza en una vista solamente
accesible para usuarios administradores.
48
Figura 25: vista de ABM de administradores
7.1.6 Nuevo estudio - Paso 1 - Búsqueda
Los técnicos de captura de imágenes es el único tipo de usuario que puede acceder a
esta vista. La misma forma parte del conjunto de pasos para almacenar o recuperar
información de un determinado paciente, y posteriormente cargar las imágenes de
fondo de ojo que fueron tomadas en el momento.
En esta etapa se buscan coincidencias de usuarios ya registrados con el DNI del
paciente junto con su género. A partir de aquí puede suceder que el paciente se
encuentre en las bases de datos de Retinar o no. En el caso de que se encuentre, se
continúa con el paso siguiente, recuperando los datos que ya se encuentran
almacenados. Caso contrario, se dejan los formularios vacíos, listos para rellenar con
la información del paciente a tratar.
49
Figura 26: primer paso de la vista de nuevo estudio
7.1.7 Nuevo estudio - Paso 2 - Datos personales
A partir del paso anterior, pueden suceder dos situaciones:
1. El paciente se encuentra registrado, por lo que los formularios son
autocompletados, para luego ser confirmados por el técnico, o bien realizar
modificaciones de ser necesario, para luego continuar con el paso siguiente.
Esta funcionalidad se encuentra desactivada en Vercel dada la ausencia de
una base de datos real.
2. El paciente es uno nuevo, por lo que los formularios están vacíos, listos para
completarse con los datos del usuario.
Una vez situados efectivamente en el paso 2, hay una serie de datos que deben ser
completados. Estos pueden variar o no entre estudios, siendo algunos más dinámicos
que otros.
50
Figura 27: segundo paso de la creación de un estudio: datos del usuario
Figura 28: segundo paso de la creación de un estudio: datos de consulta
7.1.8 Nuevo estudio - Paso 3 - Diagnóstico IA
Esta vista es la que permite cargar las imágenes previamente tomadas, para enviarlas
al backend y analizarlas. Esta pantalla es la que más lógica posee a nivel código, y
esto es dado el propósito que tiene.
51
En esta las imágenes al ser cargadas en el frontend, en un principio son analizadas
para corroborar si cumplen con un criterio de calidad mínima. De ser así, las imágenes
tendrán una pequeña circunferencia verde, denotando que poseen la suficiente calidad
para ser enviadas. Caso contrario, la imagen poseerá una circunferencia roja, dando a
entender que necesitan cargar otra imagen. En el frontend desplegado, esta
funcionalidad fue reemplazada con una función la cual, de manera pseudoaleatoria,
indica si la imagen pasó o no el criterio.
La cantidad de imágenes a cargar dependerá del tipo de estudio a realizar. En la figura
28 se puede observar un apartado para el tipo de estudio, que puede ser monocular o
binocular. Esta opción determina la cantidad de imágenes a cargar en esta etapa.
Adicional a los componentes para la carga de imágenes, la vista también posee datos
del paciente y la consulta misma, permitiendo así que el técnico tenga todos los datos
necesarios disponibles a todo momento del proceso de carga.
Figura 29: creación de estudio, carga de imágenes desplegado en Vercel
7.1.9 Nuevo estudio - Paso 4 - Finalizar
Como paso final en el proceso de creación de un estudio, toda la información
previamente cargada es enviada al backend y rápidamente las imágenes son
52
sometidas a un examen preliminar. El backend, entonces, devuelve una posible
respuesta de entre dos, “referible” o “no referible”.
La primera opción es el resultado de un análisis con resultados negativos, mientras
que la segunda opción denota un resultado positivo. Siempre estos resultados son
preliminares, y no es el análisis definitivo del examen.
Figura 30: Pantalla final del proceso de creación de estudio, desplegado en Vercel
7.2 Componentes relevantes
La aplicación está conformada por distintos y muy variados elementos. Algunos de
ellos se utilizan de forma repetida, mientras que otros pertenecen a una determinada
vista y solo son utilizados allí. React favorece la componentización,dando una sintaxis
y herramientas que permiten que este proceso se lleve a cabo con fluidez [35].
Durante el desarrollo del proyecto, este proceso fue esencial para lograr el diseño final
alcanzado. A continuación se listan los componentes más relevantes de la aplicación.
7.2.1 Header
El header es un componente clásico de cualquier aplicación web, y otorga un acceso
rápido a las distintas opciones más habituales que necesita el usuario, normalmente,
53
para la navegación del sitio. En este caso, el mismo es utilizado para navegar a través
de las opciones disponibles, para cerrar la sesión actual, o bien para cambiar el rol
actual, aunque este último es un agregado solo para la versión de desarrollo de la
aplicación.
Este componente está presente a todo momento cuando el usuario se encuentra
logueado, es decir es un componente transversal a casi todas las vistas. Se encuentra
fijo en la parte superior de las páginas.
Figura 31: componente header, con el menú lateral abierto
7.2.2 Menú para cambiar de roles
Este componente es un agregado que no estuvo presente en los diseños otorgados
por Retinar, pero que fue de utilidad a la hora de probar la aplicación. Como se aprecia
en la figura 15, este pequeño widget permite intercalar entre distintos roles, y a su vez
entre distintos estados dentro de cada rol, si este último lo permite, por ejemplo un
oftalmólogo que se encuentra en un estado penalizado.
Internamente, este elemento utiliza el estado global de la aplicación que se usa para
llevar a cabo un flujo de usuario u otro. Por lo tanto se reutilizo lógica que ya existía,
agregando simplemente una pequeña y sencilla interfaz gráfica que permitiese el
cambio de rol de manera rápida e intuitiva.
7.2.3 Selector de acción
En el menú principal de la aplicación se encuentran unos componentes comunes a
casi todos los roles, que permiten iniciar un flujo u otro. Estos son los selectores de
54
acciones, que poseen una imagen, un texto, y una redirección al flujo de trabajo
pertinente.
Estos elementos son completamente personalizables y cumplen su función, que es
que instintivamente el usuario sepa qué debe hacer click sobre ellos para ser
redirigidos a otra página.
Figura 32: componentes de selección de acción
En la figura 21 se puede ver que estos elementos también poseen un estado
deshabilitado de ser necesario, como es el caso de un oftalmólogo que se encuentra
con una penalización.
7.2.4 Stepper
Cuando se registra un nuevo estudio, se pasa por distintos pasos hasta que el mismo
es enviado y almacenado en la base de datos, como se puede observar de la sección
7.1.6 a la sección 7.1.9. Para mostrar al usuario en qué estado se halla en todo
momento, se creó el componente “stepper” que se encuentra en el header de la vista
para un nuevo estudio.
Este componente se caracteriza por mostrar el estado actual, los anteriores
completados y cuales son los que faltan, junto con un título descriptivo. Al momento
del desarrollo de la aplicación, este stepper es meramente informativo y no permite
55
volver atrás a pasos previos. Esta característica necesitaría una mayor cantidad de
lógica y un sistema para mantener la información consistente entre pasos.
Figura 33: componente stepper, visible desde la vista de un nuevo estudio
7.2.5 Gestor y visor de imágenes
Este es un componente fundamental de la aplicación, ya que permite que el técnico
cargue las imágenes tomadas con anterioridad, las visualiza, sean analizadas para
corroborar si cumplen con el control de calidad mínimo y finalmente son enviadas para
ser analizadas y almacenadas. Se puede observar este componente en la figura 29.
En la sección derecha se puede observar un log que le indica al usuario el estado de
cada imagen, adicional al pequeño círculo que se está junto con la miniatura de cada
imagen.
7.2.6 Modal
Otro componente fundamental es el modal. Este se configuró de tal manera que
permite que su contenido sea totalmente dinámico, dejando como características
transversales entre las instancias de este componente el fondo difuminado, la
superposición entre componentes para lograr darle prioridad al modal, la accesibilidad
del mismo permitiendo cerrarlo a través de la tecla de escape, y finalmente un padding
interior para poseer un espaciado homologado.
Figura 34: instancias del modal, en el caso de la izquierda advierte sobre una imagen de baja
calidad y permite accionar, y el caso de la derecha se utiliza para confirmar la cancelación del
estudio
56
7.2.7 Inputs
Para los inputs de datos se utilizó la misma plantilla en todos los casos. Excepto
ciertos casos específicos, como los input de búsqueda, los inputs de datos poseen
todos el mismo estilo, espaciado y comportamiento por defecto. Este es un caso ideal
para mostrar la potencia de React y la forma que incentiva a los desarrolladores a
trabajar; generar componentes reutilizables.
Figura 35: inputs de la pantalla de registrar un nuevo estudio
57
Capítulo 8: Conclusión
Muchas veces sucede que excelentes aplicaciones del lado del servidor no pueden
aprovecharse al máximo, dada una falta de interactividad. Esto es, la ausencia de una
interfaz que permita a los usuarios objetivos el uso indirecto de las aplicaciones del
backend.
Los desarrolladores de Retinar generaron el software de inteligencia artificial necesario
para poder analizar las imágenes que se toman en los centros de captura de
imágenes. Tanto el frontend como el backend no son del todo necesarios pero brindan
un flujo de trabajo el cual consigue que los procesos se agilicen, puedan
personalizarse, sean gestionables y puedan escalar de una manera correcta.
En un principio, se planificó que tanto el software del lado del cliente como del lado del
servidor fuese creado a la par para este proyecto. Se llevó a cabo un desarrollo
temprano del frontend basado en croquis suministrados por Retinar, y un backend
sencillo para cumplir con el flujo básico de la aplicación: registro de usuario, ingreso a
la plataforma y almacenamiento de imágenes.
A medida que se llevaba a cabo el desarrollo, las prioridades y objetivos de Retinar
cambiaron, dando lugar a lo que es ahora el proyecto: la base del frontend se
desarrolla en este proyecto para luego ser entregado a un equipo profesional, que se
encarga del desarrollo productivo de la aplicación de manera cross.
Los conocimientos previos adquiridos a lo largo de la carrera universitaria, junto con el
día a día en la industria del software, dieron lugar a un desarrollo rápido, ágil y
constante. Los conocimientos adquiridos en la carrera se pueden reflejar en la
performance, escalabilidad del código y en las distintas soluciones utilizadas para
distintos escenarios, ya que en distintas cátedras se vieron estos conceptos y más
aplicados a una gran cantidad de escenarios, desde programas sencillos ejecutables
desde la terminal, pasando por bases de datos y finalmente aplicaciones reales como
lo es un software para analisis de imagenes.
58
El ámbito laboral también fue un factor totalmente relevante. Fué la clave para realizar
un proyecto el cual pueda ser transferido a otro grupo de desarrolladores, minimizando
las dudas de estos y aplicando buenas prácticas en la medida de lo posible, para que
su comprensión del trabajo ajeno fuese lo más ameno posible.
Ambos sectores, el académico y el laboral, se complementan para enriquecer el
conocimiento de los desarrolladores, y otorgar habilidades y puntos de vista que son
necesarios para el día a día de un desarrollador profesional.
59
Bibliografía
1. World Health Organization. Diabetes. (16 de septiembre de 2022).
https://www.who.int/en/news-room/fact-sheets/detail/diabetes.
2. Boyd, K. (09 de septiembre de 2022). Retinopatía diabética: causas, síntomas,
diagnóstico, tratamiento.
https://www.aao.org/salud-ocular/enfermedades/retinopatia-diabetica
3. Color Atlas and Synopsis of Clinical Ophthalmology (Wills Eye Institute
Neuro-Ophthalmology. LippincottWilliams & Wilkins, 2012).
4. GitHub: Let 's build from here. Documentación de Github. (07 de Septiembre de
2022). https://github.com/
5. Retinar. (08 de Agosto de 2022). https://retinar.com.ar/
6. Martin, Robert C. (2008). Clean Code: A Handbook of Agile Software
Craftsmanship.
7. Cormen, Thomas H. (2011). Introduction to Algorithms.
8. Chollet, François. (2017). Deep Learning with Python.
9. La web y los estándares web | MDN. (29 de Noviembre de 2022).
https://developer.mozilla.org/es/docs/Learn/Getting_started_with_the_web/The_
web_and_web_standards
10. What is accessibility? - Learn web development | MDN. (23 de Febrero de
2023).
https://developer.mozilla.org/en-US/docs/Learn/Accessibility/What_is_accessibil
ity
11. Medical imaging - Wikipedia. (22 de Agosto de 2022).
https://en.wikipedia.org/w/index.php?title=Medical_imaging
12. Diagnostic tests - Retinography | IMO. (s.f).
https://www.imo.es/en/pruebas-diagnosticas/retinography
13. HTML: Lenguaje de etiquetas de hipertexto | MDN. (29 de Noviembre de 2022).
https://developer.mozilla.org/es/docs/Web/HTML
14. CSS | MDN. (08 de Enero de 2023).
https://developer.mozilla.org/es/docs/Web/CSS
15. JavaScript | MDN. (09 de Febrero de 2023).
https://developer.mozilla.org/es/docs/Web/JavaScript
16. JavaScript library for building user interfaces. Documentación de React.
https://reactjs.org/
17. Rendering Elements. Documentación de React.
https://reactjs.org/docs/rendering-elements.html
18. Introducing JSX. Documentación de React.
https://reactjs.org/docs/introducing-jsx.html
19. Introduction to Vercel. Documentación de Vercel. https://vercel.com/docs
20. How to Deploy a React Site with Vercel. Documentación de Vercel.
https://vercel.com/guides/deploying-react-with-vercel
21. Pensando en React. Documentación de React.
https://es.reactjs.org/docs/thinking-in-react.html
60
https://www.who.int/en/news-room/fact-sheets/detail/diabetes
https://www.aao.org/salud-ocular/enfermedades/retinopatia-diabetica
https://github.com/
https://retinar.com.ar/
https://developer.mozilla.org/es/docs/Learn/Getting_started_with_the_web/The_web_and_web_standards
https://developer.mozilla.org/es/docs/Learn/Getting_started_with_the_web/The_web_and_web_standards
https://developer.mozilla.org/en-US/docs/Learn/Accessibility/What_is_accessibility
https://developer.mozilla.org/en-US/docs/Learn/Accessibility/What_is_accessibility
https://en.wikipedia.org/w/index.php?title=Medical_imaging
https://www.imo.es/en/pruebas-diagnosticas/retinography
https://developer.mozilla.org/es/docs/Web/HTML
https://developer.mozilla.org/es/docs/Web/CSS
https://developer.mozilla.org/es/docs/Web/JavaScript
https://reactjs.org/
https://reactjs.org/docs/rendering-elements.html
https://reactjs.org/docs/introducing-jsx.html
https://vercel.com/docs
https://vercel.com/guides/deploying-react-with-vercel
https://es.reactjs.org/docs/thinking-in-react.html
22. Introduction to events - Learn web development | MDN. (26 de Febrero de
2023).
https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Eve
nts
23. Función Callback | MDN. (29 de Noviembre de 2022).
https://developer.mozilla.org/es/docs/Glossary/Callback_function
24. API de Alto Nivel de React. Documentación de React.
https://es.reactjs.org/docs/react-api.html#createelement
25. Getting started with Angular - Learn web development | MDN. (23 de Febrero
de 2023).
https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Client-side_J
avaScript_frameworks/Angular_getting_started
26. Single-page application - Wikipedia. (18 de Febrero de 2023).
https://en.wikipedia.org/wiki/Single-page_application
27. Tutorial v6.8.. Documentación de React Router.
https://reactrouter.com/en/main/start/tutorial
28. Tenencia múltiple - Wikipedia, la enciclopedia libre. (03 de Marzo de 2020).
https://es.wikipedia.org/w/index.php?title=Tenencia_m%C3%BAltiple
29. JSON Web Token Introduction - jwt.io. Documentación de JWT.
https://jwt.io/introduction
30. Syntactic sugar - Wikipedia. (30 de Enero de 2023).
https://en.wikipedia.org/w/index.php?title=Syntactic_sugar
31. Figma: the collaborative interface design tool. Documentación de Figma.
https://www.figma.com/
32. <a>: El elemento ancla - HTML: Lenguaje de etiquetas de hipertexto | MDN. (14
de Febrero de 2023).
https://developer.mozilla.org/es/docs/Web/HTML/Element/a
33. package.json. Documentación de Node Package Manager.
https://docs.npmjs.com/cli/v8/configuring-npm/package-json#dependencies
34. Versionado Semántico 2.0.0. Documentación del versionado semántico.
https://semver.org/lang/es/
35. Componentes y propiedades. Documentación de React.
https://es.reactjs.org/docs/components-and-props.html
36. Deploying Git Repositories with Vercel. Documentación de Vercel.
https://vercel.com/docs/concepts/git
37. Descripción general del rastreador de Google | Central de la Búsqueda de
Google | Documentación | Google Developers. (11 de Febrero 2023).
https://developers.google.com/search/docs/advanced/crawling/overview-google
-crawlers?hl=es-419
38. Guía de SEO para principiantes: conceptos básicos | Centro de la Búsqueda de
Google | Documentación | Google Developers. (17 de Febrero de 2023).
https://developers.google.com/search/docs/beginner/seo-starter-guide?hl=es
39. Frost, Brad. (10 de Junio de 2013). Atomic Design.
https://bradfrost.com/blog/post/atomic-web-design/
40. Chowdhury, Tamal. (15 de Mayo de 2018). What is a view in Web Application?.
Medium.
61
https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events
https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events
https://developer.mozilla.org/es/docs/Glossary/Callback_function
https://es.reactjs.org/docs/react-api.html#createelement
https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_getting_started
https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_getting_started
https://en.wikipedia.org/wiki/Single-page_application
https://reactrouter.com/en/main/start/tutorial
https://es.wikipedia.org/w/index.php?title=Tenencia_m%C3%BAltiple
https://jwt.io/introduction
https://en.wikipedia.org/w/index.php?title=Syntactic_sugar
https://www.figma.com/
https://developer.mozilla.org/es/docs/Web/HTML/Element/a
https://docs.npmjs.com/cli/v8/configuring-npm/package-json#dependencies
https://semver.org/lang/es/
https://es.reactjs.org/docs/components-and-props.html
https://vercel.com/docs/concepts/git
https://developers.google.com/search/docs/advanced/crawling/overview-google-crawlers?hl=es-419
https://developers.google.com/search/docs/advanced/crawling/overview-google-crawlers?hl=es-419
https://developers.google.com/search/docs/beginner/seo-starter-guide?hl=es
https://bradfrost.com/blog/post/atomic-web-design/
https://medium.com/front-end-weekly/what-is-a-view-in-web-application-6a2836
eed4eb
41. Castilla, Tomas. (2021). Algoritmos de aprendizaje profundo para soporte al
diagnóstico de la retinopatía diabética en fotografías de fondo de ojo. Proyecto
final de grado. UNICEN.
42. Orlando, Ignacio J. (2017). Aprendizaje automático para asistencia al
diagnóstico de enfermedades visuales basado en imágenes de fondo de ojo.
Tesis doctoral. UNICEN.
43. Orlando, Ignacio J. GitHub - ignaciorlando/fundus-vessel-segmentation-tbme.
(08 de Marzo de 2017).
https://github.com/ignaciorlando/fundus-vessel-segmentation-tbme
44. Orlando, Ignacio J. GitHub - ignaciorlando/overfeat-glaucoma. (27 de
Noviembre de 2017). https://github.com/ignaciorlando/overfeat-glaucoma
45. Orlando, Ignacio J. GitHub - ignaciorlando/red-lesion-detection. (21 de
Noviembre de 2019). https://github.com/ignaciorlando/red-lesion-detection
62
https://medium.com/front-end-weekly/what-is-a-view-in-web-application-6a2836eed4eb
https://medium.com/front-end-weekly/what-is-a-view-in-web-application-6a2836eed4eb
https://github.com/ignaciorlando/fundus-vessel-segmentation-tbme
https://github.com/ignaciorlando/overfeat-glaucoma
https://github.com/ignaciorlando/red-lesion-detection

Continuar navegando