Aplicación de escritorio con inteligencia artificial ejecutada íntegramente en dispositivo.
Privacidad total. Sin dependencia de servidores. Sin costo por tamizaje. Empaquetada con Tauri v2.
Aviso importante: DIRD+ es un sistema de investigación y desarrollo. No está aprobado como dispositivo médico. No debe usarse como único criterio diagnóstico en entornos clínicos reales.
El Problema · La Solución · Diferenciadores · Mercado · Arquitectura · Referencias
- El Problema
- La Solución
- Diferenciadores frente al Mercado
- Arquitectura Técnica
- Funcionalidades
- Instalación y Despliegue
- Guías Clínicas Soportadas
- Hoja de Ruta
- Referencias Científicas
- Autor
La retinopatía diabética (RD) es la principal causa de ceguera en adultos en edad laboral (20-74 años) en países desarrollados (OMS, World Report on Vision, 2019). Más del 80% de esta ceguera es prevenible con detección temprana y tratamiento oportuno.
| Indicador | Cifra | Fuente |
|---|---|---|
| Adultos con diabetes en el mundo | 537 millones (2021) | IDF Diabetes Atlas, 10ª ed. |
| Proyección para 2045 | 783 millones | IDF, 2021 |
| Prevalencia de RD entre diabéticos | 22-35% | Teo et al., Ophthalmology, 2021; Yau et al., Diabetes Care, 2012 |
| Personas con algún grado de RD | ~103 millones (2020) | Teo et al., 2021 |
| RD que amenaza la visión | 6-10% de diabéticos | Yau et al., 2012 |
| Casos de ceguera por RD | ~860,000 | GBD 2020, Lancet Global Health |
| Diabéticos sin diagnóstico | ~240 millones | IDF, 2021 |
Sin tratamiento, aproximadamente el 50% de los pacientes con RD proliferativa quedan legalmente ciegos en 5 años (National Eye Institute, NIH).
Chile enfrenta una situación particularmente crítica:
| Indicador | Cifra | Fuente |
|---|---|---|
| Prevalencia de diabetes en adultos | 12.3% (~1.7 millones de personas) | Encuesta Nacional de Salud 2016-2017, MINSAL |
| Sospecha de diabetes (incl. no diagnosticados) | 15.8% | ENS 2016-2017 |
| Prevalencia en mayores de 65 años | >30% | ENS 2016-2017 |
| Diabéticos con algún grado de RD estimados | 425,000 - 595,000 | Programa de Salud Cardiovascular, MINSAL |
| Diabéticos que reciben tamizaje oftalmológico oportuno | Solo 15-30% | Programa de Salud Cardiovascular, MINSAL |
| Oftalmólogos en el país | ~1,100 - 1,300 | Sociedad Chilena de Oftalmología |
| Concentrados en Región Metropolitana | 60-65% | Superintendencia de Salud |
| Densidad en regiones extremas | <3 por 100,000 hab. | Registro de Prestadores, Superintendencia de Salud |
La Retinopatía Diabética está incluida en las Garantías Explícitas en Salud (GES) desde 2006, obligando al Estado a garantizar acceso a tamizaje y tratamiento. Sin embargo, las listas de espera GES para oftalmología superan los plazos garantizados en múltiples regiones, y la distribución inequitativa de especialistas deja a regiones como Aysén, Magallanes, Atacama y la Araucanía con cobertura insuficiente.
La OMS y la ADA recomiendan exámenes de fondo de ojo al menos cada 1-2 años para todo diabético. La realidad es otra:
| País/Región | Tasa de tamizaje oportuno | Fuente |
|---|---|---|
| Países de altos ingresos | 50-70% | Piyasena et al., PLoS ONE, 2019 |
| Países de bajos/medianos ingresos | 10-30% | Piyasena et al., 2019 |
| Chile (APS pública) | 15-30% | MINSAL |
Barreras principales:
- Escasez de especialistas: Déficit mundial estimado de >200,000 oftalmólogos (Resnikoff et al., BJO, 2020)
- Costo: Examen con oftalmólogo: USD 50-200 en Latinoamérica
- Acceso geográfico: Concentración urbana de especialistas
- Tiempos de espera: 6-12 meses en sistema público chileno
- Conectividad: 40-60% de establecimientos rurales con internet limitado (ITU, 2022)
DIRD+ es una plataforma de doble distribución que ejecuta modelos de visión artificial para detección de retinopatía diabética íntegramente en el dispositivo del usuario mediante ONNX Runtime (WebAssembly):
- Aplicación de escritorio (Linux/Windows/macOS, empaquetada con Tauri v2) — distribución principal, con historial persistente, base de datos local y operación 100% offline tras la instalación.
- Demo web (misma base de código corriendo en el navegador) — sin instalación, útil para pruebas, docencia y evaluación.
Las imágenes de fondo de ojo se procesan localmente en ambos modos — los datos del paciente nunca abandonan el dispositivo.
| Aspecto | Qué ofrece DIRD+ | Por qué importa |
|---|---|---|
| Privacidad total | Inferencia IA en el dispositivo (escritorio o navegador). Cero transmisión de datos a servidores externos | Cumplimiento con Ley 21.096 y regulaciones de datos de salud sin esfuerzo adicional |
| Costo cero de operación | Sin licencias, sin pago por tamizaje, sin hardware propietario | Viable para CESFAM rurales con presupuesto limitado |
| Funciona offline | Modelos descargados una vez, cacheados localmente. Historial y pacientes en IndexedDB (persistente tanto en app desktop como en navegador) | Operativo en zonas sin conectividad estable |
| Guías clínicas adaptables | Sistema pluggable: ICDR 2024 (internacional), MINSAL Chile 2017. Agregar nuevas guías sin modificar código | Adaptable a protocolos locales GES sin depender de proveedor extranjero |
| Código abierto | Código fuente completo auditable. Algoritmos, umbrales y criterios verificables | Transparencia para reguladores, investigadores y clínicos |
| Portabilidad | Formato .dird (ZIP) para exportar/importar pacientes completos |
Interoperabilidad entre instalaciones sin vendor lock-in |
1. CAPTURA 2. CARGA 3. ANÁLISIS IA 4. REVISIÓN
Retinógrafo → Subir imágenes → Detección automática → Canvas interactivo
(cualquier cámara) a la app/navegador de lesiones (ONNX) multicapa con
OD / OI + Segmentación herramientas de
anotación
5. CLASIFICACIÓN 6. INFORME 7. EXPORTACIÓN
Severidad según → PDF configurable → Formato .dird
guía clínica con conclusiones portable entre
(ICDR/MINSAL) y recomendaciones instalaciones
Todo ocurre en el dispositivo — app de escritorio o navegador. Sin servidor. Sin internet (después de la primera carga).
DIRD+ incluye un motor de clasificación clínica agnóstico a la guía, una capacidad que ningún otro sistema de tamizaje de RD ofrece. Mientras todos los competidores (DART, IDx-DR, EyeArt, Google ARDA) implementan un criterio de clasificación fijo y cerrado — generalmente un resultado binario "referir / no referir" — DIRD+ permite que cualquier guía clínica sea cargada como un archivo JSON sin modificar código.
| Capacidad | Impacto |
|---|---|
| Guías como datos, no como código | Agregar la guía de un nuevo país es crear un JSON y registrarlo. Sin desarrollo, sin esperar al proveedor |
| Clasificación detallada por severidad | No solo "referir/no referir": DIRD+ clasifica en 5+ niveles (sin RD → leve → moderada → severa → proliferativa), con tratamientos, urgencia y plazo de seguimiento específicos por nivel |
| Análisis espacial por cuadrante | Distribución de lesiones en 4 cuadrantes + centro macular. Evalúa la Regla 4-2-1 (criterio ICDR para RDNP severa) automáticamente |
| Múltiples guías simultáneas | Clasificar la misma imagen según ICDR (internacional) y MINSAL (Chile) para comparar criterios. Útil en investigación y docencia |
| Protocolos de tratamiento integrados | Cada nivel de severidad define acciones clínicas, urgencia (rutina/acelerada/urgente) e intervalo de seguimiento en días |
| Mapeo de clases IA → clínica | Traduce las detecciones del modelo (microaneurysm, hemorrhage, cotton_wool_spot...) a categorías clínicas de la guía (microaneurismas, hemorragias, exudados...) |
| Corrección humana preservada | El clínico puede modificar la clasificación generada. El sistema marca manuallyModified: true para trazabilidad |
| Validación automática | Al cargar una guía, el sistema valida estructura, coherencia de niveles, reglas y protocolos. Reporta errores y advertencias |
| Guía | Origen | Uso |
|---|---|---|
| ICDR 2024 | International Council of Ophthalmology | Estándar internacional de referencia |
| MINSAL Chile 2017 | Ministerio de Salud de Chile | Protocolo GES nacional chileno |
Para agregar la guía de cualquier otro país (ej. México, Colombia, España):
- Crear
public/clinical-guidelines/mi_guia.jsoncon niveles de severidad, reglas de clasificación, protocolos de tratamiento y mapeo de clases - Registrar en
public/clinical-guidelines/index.json - La aplicación la detecta automáticamente al recargar
No requiere conocimiento de programación — solo conocimiento clínico para definir los criterios.
Este diseño convierte a DIRD+ en una plataforma, no solo una herramienta. Cada país, servicio de salud o grupo de investigación puede adaptar la clasificación a sus protocolos locales sin depender del desarrollador. Esto es especialmente relevante para:
- Escalamiento regional: Una misma plataforma sirve para Chile (MINSAL), Perú, Colombia, México — cada uno con su guía
- Investigación: Comparar cómo diferentes guías clasifican los mismos hallazgos
- Docencia: Enseñar a residentes las diferencias entre criterios internacionales y locales
- Evolución clínica: Cuando una guía se actualiza, basta actualizar el JSON — sin esperar una nueva versión del software
Un principio de diseño fundamental de DIRD+ es la separación estricta entre clasificación clínica y generación de texto narrativo:
┌──────────────────────────────────────────────────────────────────────┐
│ CLASIFICACIÓN (local, determinista) │
│ │
│ Detecciones IA → Motor de Guía Clínica → Severidad + Tratamiento │
│ (ONNX local) (JSON pluggable) + Urgencia + Seguimiento │
│ │
│ La GUÍA CLÍNICA decide. Reglas explícitas, auditables, │
│ reproducibles. Sin IA generativa. Sin caja negra. │
└──────────────────────────┬───────────────────────────────────────────┘
│
▼ datos estructurados ya clasificados
┌──────────────────────────────────────────────────────────────────────┐
│ NARRACIÓN (remota, opcional) │
│ │
│ Datos de clasificación → LLM externo → Texto de conclusión clínica │
│ (severidad, lesiones, (vía backend) narrativo para el informe │
│ tratamientos, urgencia) │
│ │
│ El LLM NARRA. Recibe la decisión ya tomada por la guía y la │
│ redacta como texto clínico legible. No clasifica. No diagnostica. │
│ El clínico puede editar el texto antes de finalizar el informe. │
└──────────────────────────────────────────────────────────────────────┘
¿Por qué esta separación importa?
| Aspecto | Sin separación (otros sistemas) | DIRD+ |
|---|---|---|
| Trazabilidad | "La IA dijo esto" — ¿qué IA? ¿qué criterio? | Clasificación trazable a reglas explícitas de la guía. El JSON es auditable |
| Reproducibilidad | Misma imagen → diferentes resultados según el prompt | Misma imagen + misma guía = mismo resultado, siempre |
| Regulación | Difícil demostrar que el LLM no alucina un diagnóstico | La clasificación no depende de IA generativa. El LLM solo redacta |
| Offline | Si el LLM no está disponible, no hay conclusión | Sin LLM: la clasificación completa funciona igual. Solo falta el texto narrativo |
| Sesgo | El LLM puede introducir sesgos en la clasificación | El LLM no tiene influencia sobre la severidad ni el tratamiento |
| Edición humana | ¿El clínico edita la clasificación o el texto? | Clasificación y texto editables por separado. manuallyModified preserva trazabilidad |
El LLM externo es un servicio opcional de redacción. DIRD+ funciona completamente sin él — la clasificación, severidad, tratamientos, urgencia y seguimiento se determinan localmente por la guía clínica.
| Característica | DART (TeleDx, Chile) | IDx-DR (Digital Diagnostics) | Google ARDA | EyeArt (Eyenuk) | Phelcom Eyer (Brasil) | DIRD+ |
|---|---|---|---|---|---|---|
| Procesamiento | Cloud | Cloud | Cloud | Cloud | Cloud | Edge (desktop/navegador) |
| Datos salen del dispositivo | Sí (cloud TeleDx) | Sí (USA) | Sí (Google Cloud) | Sí (USA) | Sí (Brasil) | No |
| Funciona offline | No | No | No | No | No | Sí |
| Hardware requerido | Retinógrafo + internet | Topcon NW400 (~USD 15-25K) | Cámara de mesa (~USD 5-15K) | Cámara compatible (~USD 5-15K) | Smartphone + adaptador (~USD 3-5K) | Cualquier cámara existente |
| Costo por tamizaje | Licencia por volumen (MINSAL) | ~USD 40-55 | No disponible comercialmente | ~USD 8-15 | Suscripción | USD 0 |
| Código abierto | No | No | Parcial (papers) | No | No | Sí |
| Idioma español nativo | Sí | No | No | No | Portugués/Inglés | Sí |
| Multi-guía clínica | No | No (resultado binario) | No | No | No | Sí (ICDR, MINSAL, extensible) |
| Clasificación detallada | Riesgo (sí/no) | Binario (referir/no) | 5 niveles | Referir/no | Referir/no | 5+ niveles por guía, con cuadrantes |
| Canvas de revisión/anotación | No | No | No | No | No | Sí (multicapa, mediciones) |
| Aprobación regulatoria | Validación clínica publicada (Eye) | FDA De Novo, CE | CE, Thai FDA | FDA 510(k), CE | ANVISA | En desarrollo |
| Soberanía de datos | Parcial (cloud en Chile) | No (USA) | No (Google) | No (USA) | No (Brasil) | Sí (100% local) |
| Despliegue en Chile | 170 establecimientos, >350K exámenes | No | No | No | No | En desarrollo |
No existe otra plataforma que combine edge-computing (desktop y navegador) + funcionamiento offline + código abierto + soporte multi-guía clínica para tamizaje de RD.
DART (TeleDx) es la plataforma de tamizaje de RD con IA desplegada por el MINSAL en Chile. Es el sistema más maduro en el país:
- Cobertura: 170+ establecimientos públicos, >350,000 exámenes analizados
- Rendimiento: Sensibilidad 94.6%, especificidad 74.3% (validación publicada en Eye)
- Modelo: Cloud — imágenes se suben a la plataforma para análisis IA + teleinformes por oftalmólogos remotos
- Adquisición MINSAL: Licencia por 200,000 casos (2018)
- Impacto: Reduce necesidad de revisión por oftalmólogo en 50%, aumenta capacidad de atención 2-4x
DART demostró que el tamizaje con IA funciona en Chile. Sin embargo, su arquitectura cloud presenta limitaciones que DIRD+ aborda:
| Aspecto | DART | DIRD+ |
|---|---|---|
| Conectividad | Requiere internet para cada examen | Funciona offline |
| Privacidad | Imágenes se transmiten al cloud | Procesamiento 100% local |
| Resultado | Clasificación de riesgo (sí/no) | Severidad detallada por cuadrante según guía clínica |
| Revisión de hallazgos | No tiene canvas de anotación | Canvas multicapa con herramientas de medición |
| Código | Propietario (TeleDx) | Open source auditable |
| Costo | Licencia por volumen | Gratuito |
| Dependencia | Depende de TeleDx como proveedor | Sin vendor lock-in |
DIRD+ no busca reemplazar DART sino complementarlo: DART cubre la red pública con teleinformes centralizados; DIRD+ habilita tamizaje en establecimientos sin conectividad, proporciona herramientas de análisis detallado para el clínico, y ofrece una alternativa open source sin dependencia de proveedor.
Las soluciones comerciales de IA para RD existen desde 2018 (IDx-DR fue la primera con aprobación FDA). Sin embargo, la brecha de tamizaje persiste, especialmente en países de ingresos medios como Chile:
| Barrera | Cómo afecta | Cómo DIRD+ la resuelve |
|---|---|---|
| Dependencia de internet | 95%+ de las soluciones requieren cloud. Las zonas rurales donde más se necesita screening son las de peor conectividad. Caso documentado: Google ARDA en Tailandia falló en clínicas rurales por problemas de red (Beede et al., CHI, 2020) | Funciona 100% offline tras primera carga |
| Costo por tamizaje | USD 8-55 por screening se acumula. Para 1.7M de diabéticos chilenos: USD 13-93 millones/año solo en licencias de software | USD 0 por tamizaje |
| Hardware propietario | IDx-DR exige cámara Topcon NW400 (~USD 25K). Crea vendor lock-in | Compatible con cualquier imagen de fondo de ojo |
| Idioma | Mayoría de soluciones solo en inglés. Personal de APS chilena no domina inglés técnico | Interfaz y reportes en español nativo |
| Soberanía de datos | Imágenes retinales (datos biométricos) enviadas a servidores en EE.UU., China o Singapur | Datos nunca abandonan el dispositivo |
| Adaptabilidad clínica | Resultado binario (referir/no referir) sin adaptación a protocolos locales | Multi-guía: clasificación según MINSAL Chile, ICDR, o guías personalizadas |
| Vendor lock-in | Si el proveedor sube precios o desaparece, el hospital pierde capacidad de screening | Open source. Datos exportables en formato abierto |
La arquitectura edge-computing de DIRD+ otorga una ventaja regulatoria estructural que los competidores cloud no pueden replicar fácilmente:
- Chile — Ley 21.096: Consagra la protección de datos personales como derecho constitucional. Los datos biométricos (imágenes retinales) son categoría especial.
- Chile — Ley 21.719 (2024): Nuevo marco de protección de datos personales con requisitos más estrictos para datos de salud, alineado con GDPR europeo.
- GDPR (Europa): Clasifica datos de salud como "categoría especial" con restricciones de transferencia transfronteriza (Art. 9, 44-49).
- Tendencia global: Múltiples países adoptan legislación de soberanía de datos que exige procesamiento local de datos de salud (Vayena & Blasimme, JLME, 2018).
DIRD+ cumple con todas estas regulaciones por diseño: no hay datos que proteger en tránsito porque nunca salen del dispositivo.
Proyección comparativa para tamizaje a escala nacional en Chile (~1.7 millones de diabéticos):
| Solución | Costo software/año | Hardware inicial | Total Año 1 |
|---|---|---|---|
| IDx-DR | ~USD 68-93M | ~USD 25K × N cámaras | >USD 70M |
| EyeArt | ~USD 13-25M | ~USD 10K × N cámaras | >USD 15M |
| DIRD+ | USD 0 | Usa cámaras existentes | ~USD 0 |
Estudios de costo-efectividad respaldan el tamizaje con IA:
- Reducción del 40-60% en costos vs. evaluación manual por graders (Tufail et al., Ophthalmology, 2017)
- Costo por tamizaje con IA: USD 2-15 vs. USD 50-200 con oftalmólogo presencial (Xie et al., Lancet Digital Health, 2020)
- En Inglaterra, el programa nacional de tamizaje (ENSPDR) logró que la RD dejara de ser la primera causa de ceguera en edad laboral por primera vez en 2010 (Liew et al., BMJ Open, 2014)
┌─────────────────────────────────────────────────────────────────┐
│ DISPOSITIVO DEL USUARIO (Desktop Tauri o Web) │
│ │
│ ┌────────────────┐ ┌───────────────────┐ ┌───────────────┐ │
│ │ React 18 │ │ ONNX Runtime Web │ │ IndexedDB │ │
│ │ TypeScript │ │ (WebAssembly) │ │ (Dexie v4) │ │
│ │ │ │ │ │ │ │
│ │ ┌──────────┐ │ │ Modelos ONNX: │ │ 9 tablas: │ │
│ │ │ Canvas │ │ │ - Detección │ │ - patients │ │
│ │ │ Konva │◄─┼──┤ - Segmentación │ │ - sessions │ │
│ │ │ multicapa│ │ │ │ │ - images │ │
│ │ └──────────┘ │ │ Análisis: │ │ - detections │ │
│ │ │ │ - Clasificador DR │ │ - segments │ │
│ │ ┌──────────┐ │ │ - Cuadrantes │ │ - reports │ │
│ │ │ PDF │ │ │ - Edema macular │ │ - measures │ │
│ │ │ jsPDF │ │ │ - Copa/disco │ │ - classif. │ │
│ │ └──────────┘ │ │ │ │ - contrib. │ │
│ │ │ │ OpenCV.js (CDN) │ │ │ │
│ │ ┌──────────┐ │ │ Refinam. disco │ │ 16 versiones │ │
│ │ │ Guías │ │ │ óptico │ │ de migración │ │
│ │ │ Clínicas │ │ │ │ │ │ │
│ │ │ ICDR │ │ │ Optimizaciones: │ │ Export: │ │
│ │ │ MINSAL │ │ │ - SIMD │ │ .dird (ZIP) │ │
│ │ └──────────┘ │ │ - Multi-thread │ │ │ │
│ └────────────────┘ │ - CPU profiles │ └───────────────┘ │
│ │ (Intel/AMD/ARM) │ │
│ └───────────────────┘ │
│ │
│ Toda la inferencia IA ocurre aquí ▲ │
└─────────────────────────────────────────────────────────────────┘
│ (opcional)
▼
┌─────────────────────┐
│ Backend PHP │
│ - Gestión tokens │
│ - Contribuciones │
│ - Administración │
│ - Mensajería │
└─────────────────────┘
| Tecnología | Versión | Rol |
|---|---|---|
| Tauri | v2 | Shell nativo multiplataforma (Rust + WebView) |
| WebKitGTK | 4.1 | Webview en Linux |
| Rust | 1.93+ | Backend nativo del shell |
| Tecnología | Versión | Rol |
|---|---|---|
| React | 18.3 | Framework UI |
| TypeScript | 5.7 | Tipado estático (strict mode) |
| Vite | 6.0 | Build tool + HMR dev server |
| Tailwind CSS | 3.4 | Sistema de estilos utilitarios |
| Radix UI | — | Primitivas accesibles (Dialog, Tabs, Select, Switch, Slider) |
| React Router | 6 | Navegación SPA |
| Zustand | 5.0 | Estado global (configuración, canvas, tokens, pacientes) |
| Framer Motion | 11 | Animaciones y transiciones |
| i18next | 24.2 | Internacionalización (español/inglés) |
| Vitest + happy-dom | 4.1 | Suite de tests |
| Tecnología | Versión | Rol |
|---|---|---|
| ONNX Runtime Web | 1.23 | Motor de inferencia WebAssembly |
| Modelos ONNX | — | Detección (bounding boxes) + Segmentación (máscaras de píxeles) |
| OpenCV.js | — | Refinamiento del disco óptico (CDN) |
| Tecnología | Versión | Rol |
|---|---|---|
| Konva | 10 | Motor canvas 2D de alto rendimiento |
| React-Konva | 18.2 | Bindings declarativos React-Konva |
| Tecnología | Versión | Rol |
|---|---|---|
| Dexie | 4.0 | Wrapper IndexedDB con 16 migraciones versionadas |
| JSZip | 3.10 | Formato .dird (ZIP portable con datos de paciente) |
| Tecnología | Versión | Rol |
|---|---|---|
| jsPDF | 2.5 | Generación de PDF en cliente |
| jspdf-autotable | 3.8 | Tablas clínicas en PDF |
El procesamiento de imágenes sigue un pipeline de 6 etapas ejecutado completamente en WebAssembly:
Imagen retinal (cualquier cámara)
│
▼
1. PREPROCESAMIENTO
Redimensionar a 640×640, normalizar valores de píxeles
│
▼
2. INFERENCIA ONNX
Modelo de detección → bounding boxes con clase y confianza
Modelo de segmentación → máscaras de píxeles por lesión
(Optimizado: SIMD habilitado, perfiles CPU Intel/AMD/ARM)
│
▼
3. POST-PROCESAMIENTO
Non-Maximum Suppression (IoU threshold: 0.45)
Filtrado por umbral de confianza configurable
│
▼
4. ANÁLISIS ESPACIAL
Distribución por cuadrantes (4 zonas + centro)
Detección de edema macular (patrón de exudados)
Análisis de microaneurismas, hemorragias
Relación copa/disco óptico (con OpenCV.js)
Calibración espacial desde disco óptico
│
▼
5. CLASIFICACIÓN CLÍNICA
Aplicar guía seleccionada (ICDR 2024 / MINSAL 2017)
Mapear lesiones detectadas → criterios de la guía
Evaluar Regla 4-2-1 para RD severa
Generar: severidad, tratamientos, seguimiento, urgencia
│
▼
6. ALMACENAMIENTO
Guardar en IndexedDB: detecciones, segmentaciones,
clasificación, mediciones
Clases detectables: Microaneurismas, hemorragias (dot/blot), exudados duros, exudados blandos (cotton wool spots), neovascularización, disco óptico, fóvea.
Niveles de severidad (ICDR 2024): Sin RD → RDNP leve → RDNP moderada → RDNP severa → RD proliferativa
DIRD+ implementa un motor de clasificación agnóstico a la guía clínica. Las guías son archivos JSON independientes que definen:
{
"guideline_id": "icdr_2024",
"metadata": {
"name": "ICDR International 2024",
"country": "International",
"language": "en",
"status": "official"
},
"severity_levels": [
{
"id": "no_dr",
"name_es": "Sin RD Aparente",
"order": 0,
"color": "#22c55e"
},
{
"id": "mild_npdr",
"name_es": "RDNP Leve",
"order": 1,
"color": "#84cc16"
}
],
"classification_rules": [
{
"severity": "mild_npdr",
"conditions": ["microaneurysms_only"],
"logic": "AND",
"priority": 1
}
],
"rule_421": {
"enabled": true,
"criteria": [
"extensive_hemorrhages_4q",
"venous_beading_2q",
"irma_1q"
]
},
"treatment_protocols": [
{
"severity": "severe_npdr",
"urgency": "accelerated",
"actions": ["referral_ophthalmology", "retinal_imaging"],
"followup_interval_days": 30
}
],
"class_mapping": {
"microaneurysms": ["microaneurysm", "microhemorrhages"],
"hemorrhages": ["hemorrhage"],
"hardExudates": ["hard_exudate"],
"softExudates": ["cotton_wool_spot"],
"neovascularization": ["neovascularization"]
}
}Para agregar una nueva guía clínica:
- Crear archivo JSON en
public/clinical-guidelines/siguiendo el esquema - Registrar en
public/clinical-guidelines/index.json - La aplicación la detectará automáticamente — sin modificar código fuente
IndexedDB local con 9 tablas y 16 versiones de migración:
| Tabla | Campos clave | Propósito |
|---|---|---|
| patients | patientId, name, diabetes (tipo/duración), HTA, DLP, medicamentos | Datos demográficos y clínicos |
| sessions | patientId, date, modelVersions, locked, type (normal/combined) | Visitas clínicas |
| images | sessionId, eyeType (OD/OI), originalBlob, order | Imágenes de fondo de ojo |
| detections | imageId, type (ai/manual), bbox, class, confidence | Bounding boxes de lesiones |
| segmentations | imageId, type (ai/manual), maskData, class, opacity | Máscaras de segmentación |
| imageClassifications | imageId, severity, guideline, treatments[], followupDays, urgency, rationale, manuallyModified | Clasificación DR por guía clínica |
| reports | sessionId, type (preview/final), pdfBlob, evaluatorNotes, conclusionEdited | Informes PDF generados |
| measurements | imageId, origin, destination, distancePixels, distanceDD | Mediciones calibradas |
| pendingContributions | type (image/conclusion), referenceId, status | Contribuciones al dataset compartido |
src/
├── components/
│ ├── canvas/ # Canvas de anotación multicapa (Konva)
│ │ └── advanced-editor/ # Editor avanzado con herramientas especializadas
│ ├── patients/ # Gestión de pacientes, export/import
│ ├── upload/ # Carga de imágenes, galería, vista de sesión
│ ├── reports/ # Generación de informes PDF
│ ├── settings/ # Configuración (modelos, procesamiento, apariencia)
│ ├── admin/ # Panel de administración protegido
│ ├── contribution/ # Contribución de datos al dataset compartido
│ ├── academy/ # Contenido educativo
│ ├── demo/ # Paciente demo y pantalla de carga
│ └── ui/ # Primitivas UI reutilizables (Radix + Tailwind)
├── lib/
│ ├── ai/ # InferenceService, ONNXModelManager, ModelDownloader
│ ├── analysis/ # ImageDRClassifier, QuadrantCalculator, EdemaDetector,
│ │ # HemorrhageDetector, MicroaneurysmDetector,
│ │ # OpticDiscCuppingDetector, SpatialCalibrator
│ ├── clinical-guidelines/ # GuidelineLoader, MultiGuidelineClassifier
│ ├── db/ # Esquema Dexie, migraciones, paciente demo
│ ├── export/ # DirdExporter, DirdImporter (formato .dird ZIP)
│ ├── pdf/ # Motor de renderizado de informes PDF
│ ├── classes/ # ClassManager (metadatos de clases del modelo)
│ └── api/ # TokenService, AdminService
├── stores/ # Estado global Zustand
│ ├── config-store.ts # Configuración persistida (modelos, reportes, apariencia)
│ ├── canvas-store.ts # Estado del canvas (herramienta, clase, undo/redo)
│ ├── token-store.ts # Tokens disponibles para informes
│ └── patient-store.ts # Paciente actual seleccionado
├── i18n/ # Internacionalización (español/inglés)
├── hooks/ # Custom hooks (useImageUploader, useMessagePolling)
├── types/ # Interfaces TypeScript
└── App.tsx # Router principal + inicialización paralela
- Crear, editar, archivar y buscar pacientes por nombre o ID
- Datos clínicos: diabetes (tipo, duración), HTA, dislipidemia, medicamentos
- Sesiones como visitas clínicas: duplicar, editar, cerrar
- Paciente demo precargado para evaluación del sistema
- Sesiones combinadas para análisis longitudinal
- Modelos duales: Detección (bounding boxes) + Segmentación (máscaras de píxeles)
- Ejecución local: ONNX Runtime (WebAssembly) con SIMD y multi-thread, idéntico en desktop Tauri y en navegador
- Descarga progresiva: Modelos desde GitHub
Debaq/dird_models, cacheados localmente - Sensibilidad configurable: Umbral de confianza ajustable por modelo
- Optimización por CPU: Perfiles para Intel, AMD y ARM
- Procesamiento batch: Todas las imágenes de una sesión en una ejecución
- Historial de rendimiento persistente: Métricas de tiempo por inferencia (preprocess/inference/postprocess/NMS/total) guardadas localmente, exportables a JSON. Persisten entre sesiones tanto en desktop como en navegador
- 5 capas: Imagen original, detecciones IA, segmentaciones IA, anotaciones manuales, mediciones
- Herramientas: Selección, dibujo libre, polígono, medición (distancia/área), zoom, pan
- Controles por capa: Visibilidad, opacidad, bloqueo
- Overlays clínicos: Cuadrantes retinales, zona macular, área del disco óptico
- Corrección humana: Modificar, ocultar o agregar detecciones sobre los resultados IA
- Clasificación de severidad según guía clínica seleccionada
- Análisis por cuadrante (4 zonas + centro) con distribución de lesiones
- Detectores especializados: hemorragias, microaneurismas, edema macular, copa/disco
- Evaluación de Regla 4-2-1 para RD severa
- Resultado: severidad, tratamientos, plazo de seguimiento, nivel de urgencia, rationale
- El clínico puede ajustar manualmente la clasificación generada
- Preview: Borrador sin consumir token. Final: Informe definitivo
- Secciones configurables: datos del paciente, galería, estadísticas, conclusión
- Galería personalizable: imágenes originales/anotadas, con/sin cuadrantes y mediciones
- Notas del evaluador, firma del profesional, edición de conclusión
- Campos del paciente ocultables (nombre, edad, ID) para privacidad
- Comparar estadísticas entre 2+ sesiones del mismo paciente
- Conteo de detecciones, severidad, análisis de tendencia temporal
- Sesiones combinadas con trazabilidad de origen
- Formato
.dird: ZIP con datos completos (paciente, sesiones, imágenes, detecciones, informes) - 3 niveles de exportación: Paciente completo, sesión individual, datos totales
- Mapeo de IDs: IDs se reasignan al importar, evitando conflictos
- Detección de colisiones: Solicita confirmación antes de sobrescribir sesiones existentes
- Subir imágenes y clasificaciones al dataset compartido
- Seguimiento de contribuciones pendientes y enviadas
- Mejora colaborativa de modelos
- Gestión de tokens por instalación
- Visualización de contribuciones recibidas
- Sistema de mensajería broadcast a instalaciones
- Monitoreo de beacons (instalaciones activas)
Sección educativa consultiva integrada en la aplicación, orientada a que el profesional de salud comprenda qué detecta la IA, cómo clasifica y qué guía clínica aplica:
- Escalas de clasificación de RD: Tres tabs comparativas con ICDR (internacional), MINSAL 2017 (Chile/GES) y ETDRS (investigación), con niveles de severidad, conducta clínica y links a guías oficiales
- Clases detectables: Catálogo visual de lesiones que el modelo detecta actualmente (microaneurismas, hemorragias, exudados duros/blandos, neovascularización) y clases en desarrollo (IRMA, arrosariamiento venoso, edema macular)
- Cómo funciona DIRD: Explicación del flujo de trabajo y la arquitectura de privacidad
- Documentación técnica: Acceso directo a revisión técnica del clasificador, roadmap de entrenamiento, mejoras sin reentrenar modelos, y guía clínica MINSAL 2017 (PDF original)
- Disclaimer clínico: Aviso de que es herramienta de apoyo, no reemplazo del criterio profesional
- Tutorial interactivo: Preparado para guía paso a paso (próximamente)
DIRD+ se distribuye como aplicación de escritorio (Linux, Windows, macOS) empaquetada con Tauri v2. El webview local embebido corre el frontend, sin servidor HTTP.
- Rust toolchain (via rustup)
- Node.js 20+ y pnpm (
npm i -g pnpm) - Dependencias de sistema WebKitGTK (Linux). En Arch:
En Debian/Ubuntu:
sudo pacman -S webkit2gtk-4.1 libayatana-appindicator librsvg patchelf
sudo apt install libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf
git clone https://github.com/Debaq/Dird.git
cd Dird
pnpm install# Abrir la app de escritorio con HMR
pnpm tauri:devPrimera compilación Rust toma ~2-3 min. Siguientes arranques son instantáneos (cache .cargo-target/).
# Compila frontend + Rust en modo release
pnpm tauri:buildEl binario queda en ./src-tauri/target/release/app (o ~/.cargo-target/release/app si CARGO_TARGET_DIR está seteado). No se generan AppImage/deb/rpm por defecto (bundle.active=false en src-tauri/tauri.conf.json).
Para generar paquetes de distribución: cambiar bundle.active a true y correr con NO_STRIP=true pnpm tauri:build (evita el bug de strip + .relr.dyn en Arch moderno).
pnpm test # run (30 tests)
pnpm test:watch # modo watch
pnpm test:ui # UI VitestCobertura: pipeline ONNX (NMS, postprocess), motor de guías clínicas (ICDR 2024 integración, regla 4-2-1), validador de guías.
| Variable | Descripción | Ejemplo |
|---|---|---|
VITE_API_BASE_URL |
URL absoluta del backend PHP (contribuciones + admin) | https://tmeduca.org/dird/backend |
Definidas en .env.development (dev remoto) y .env.production (bundle final).
| Guía | País | Descripción | Referencia |
|---|---|---|---|
| ICDR 2024 | Internacional | International Clinical Diabetic Retinopathy Disease Severity Scale | International Council of Ophthalmology |
| MINSAL Chile 2017 | Chile | Guía Clínica de Retinopatía Diabética — Ministerio de Salud | GES Problema #31 |
El sistema de guías es extensible. Nuevas guías se agregan como archivos JSON sin modificar código.
- Evaluación del pipeline sobre APTOS 2019 (Kaggle) — ~3,600 imágenes, escala ICDR 0-4
- Evaluación sobre IDRiD — anotaciones a nivel de lesión para validar detecciones individuales
- Benchmarks de rendimiento de inferencia por dispositivo (desktop, laptop, tablet, móvil)
- Comparación de tiempos de inferencia ONNX con SIMD habilitado vs deshabilitado
- Estudio de validación con 200-500 imágenes evaluadas por oftalmólogos chilenos
- Medición de sensibilidad/especificidad contra gold standard
- Piloto en CESFAM rural sin oftalmólogo presencial
- Detección completa de IRMA y arrosariamiento venoso (criterios Regla 4-2-1)
- Integración con cámaras retinales vía protocolo DICOM
- Aplicación de escritorio con Tauri v2 — implementada (Linux/Windows/macOS); demo web se mantiene en paralelo desde la misma base de código
- Aprendizaje federado para mejora de modelos preservando privacidad
- Preparación de dossier para ISP Chile (dispositivo médico software)
- Alineación con marco FDA SaMD (Software as a Medical Device)
Las referencias completas que sustentan el contexto epidemiológico, clínico y técnico de este proyecto están disponibles en REFERENCES.md.
Nicolás Baier Quezada
Reportes de bugs y contribuciones vía issues y pull requests en este repositorio.
DIRD+ es software de código abierto bajo licencia MIT. Las contribuciones son bienvenidas.