Razón: Amazon y otros proveedores cloud no tienen servicios específicos para análisis de riesgo de conductores. Necesitas crear tu propio servicio especializado.
- Backend: Python/FastAPI o Node.js/Express
- Base de Datos: PostgreSQL + Redis (cache)
- ML/AI: TensorFlow/PyTorch o scikit-learn
- Deployment: Docker + AWS/GCP/Azure
- Monitoreo: CloudWatch/Grafana{
"driver_session": {
"session_id": "sess_12345",
"driver_id": "driver_001",
"vehicle_id": "vehicle_456",
"start_time": "2025-07-02T08:00:00Z",
"current_time": "2025-07-02T13:30:00Z"
},
"event_data": {
"timestamp": "2025-07-02T13:30:15Z",
"event_type": "fatigue_indicator",
"details": {
"yawn_detected": true,
"eyes_closed_duration": 2.5,
"head_position": "tilted_down",
"blink_frequency": 8,
"eye_closure_percentage": 75
}
},
"contextual_data": {
"time_of_day": "afternoon",
"driving_duration_minutes": 330,
"weather_condition": "sunny",
"road_type": "highway",
"speed_kmh": 85,
"location": {
"lat": 9.9281,
"lng": -84.0907
}
},
"environmental_factors": {
"ambient_light": "bright",
"temperature_celsius": 28,
"is_night": false
}
}{
"session_summary": {
"session_id": "sess_12345",
"driver_id": "driver_001",
"analysis_window_minutes": 60
},
"accumulated_events": [
{
"event_type": "yawn",
"count": 4,
"last_occurrence": "2025-07-02T13:25:00Z"
},
{
"event_type": "eyes_closed",
"count": 12,
"avg_duration": 1.8,
"max_duration": 3.2
},
{
"event_type": "head_nodding",
"count": 2,
"severity": "moderate"
}
]
}Propósito: Análisis en tiempo real de un evento individual
Request: Evento individual (JSON arriba)
Response: Riesgo instantáneo + recomendacionesPropósito: Análisis acumulativo de la sesión de manejo
Request: Resumen de sesión + eventos acumulados
Response: Nivel de riesgo global + alertas críticasPropósito: Historial de riesgo del conductor
Response: Patrones históricos + tendencias de riesgoESTADO PRE-CONDUCCIÓN LOGIFIT (30% del riesgo total)
Evaluación de Aptitud Preventiva:
1. sleep_aptitude_status - Peso: 0.40
- APTO: Factor 1.0 (riesgo base)
- NO_APTO: Factor 2.5 (riesgo crítico aumentado)
- SIN_EVALUACION: Factor 1.3 (riesgo por incertidumbre)
2. sleep_quality_metrics - Peso: 0.35
- Análisis multivariable encapsulado en APTO/NO_APTO
- Incluye: REM, sueño profundo, fragmentación
3. sleep_timing_validity - Peso: 0.25
- Evaluación <2 horas antes: Factor 1.0 (válida)
- Evaluación 2-4 horas antes: Factor 1.2 (degradación)
- Evaluación >4 horas antes: Factor 1.5 (dudosa validez)
Protocolo Override (NO_APTO pero conduce):
- Monitoreo intensificado: análisis cada 30 segundos
- Umbral de alerta reducido en 30%
- Notificación automática a central de control
- Combinaciones críticas tienen peso 2xCOMBINACIONES CRÍTICAS AUTOMÁTICAS:
Alerta Crítica Inmediata (Score = 95-100):
1. NO_APTO + fatigueDriving (SEVERO)
2. NO_APTO + makeCalls (TELÉFONO_EN_MANO) + noche
3. fatigueDriving (SEVERO) + distractedDriving + >4 horas manejo
4. abnormalDrivingBehavior + fatigueDriving (MODERADO) + lluvia/noche
5. 3+ comportamientos simultáneos en ventana de 15min
6. makeCalls (TELÉFONO_EN_MANO) + fatigueDriving + >6 horas manejo
7. driverAnomaly (SEVERO) + cualquier otro comportamiento
**NUEVAS - Factores Operativos:**
8. MATERIALES_PELIGROSOS + fatigueDriving (cualquier nivel)
9. TRANSPORTE_PASAJEROS (>30) + distractedDriving + noche
10. Régimen día 19-21 + NO_APTO + cualquier DMS
11. >600km/día + fatigueDriving (MODERADO) + régimen crítico
12. Lluvia + noche + materiales peligrosos + cualquier DMSAlerta Alta (Score = 80-94):
1. APTO + fatigueDriving (MODERADO) + >3 horas manejo
2. distractedDriving >12 eventos/hora
3. makeCalls (MANOS_LIBRES) + fatigueDriving + noche
4. abnormalDrivingBehavior + >5 horas manejo
5. 2 comportamientos consistentes >30min
6. NO_APTO sin otros comportamientos detectados
**NUEVAS - Factores Operativos:**
7. TRANSPORTE_PASAJEROS + régimen días 15-18
8. >400km/día + fatigueDriving (LEVE) + día crítico roster
9. Materiales peligrosos + noche + >4 horas manejo
10. Caminos mineros + régimen crítico + distractedDriving
11. >6 viajes/día + fatigueDriving + cualquier roster críticoALERTAS ESPECÍFICAS POR INDUSTRIA:
Minería (Alertas Especiales):
- Régimen 21-7 días 19-21: Monitoreo cada 15 minutos
- Caminos no pavimentados + fatiga: Reducir umbral 40%
- Cambio de turno: Monitoreo intensivo primeras 2 horasTransporte Público (Alertas Especiales):
- >30 pasajeros + distractedDriving: Alerta inmediata
- Lluvia + pasajeros + noche: Protocolo especial
- makeCalls (teléfono) + pasajeros: Crítico automáticoMateriales Peligrosos (Alertas Especiales):
- Cualquier DMS + materiales críticos: Escalado inmediato
- Condiciones adversas + peligrosos: Central de control
- fatigueDriving (LEVE) + peligrosos = tratado como SEVEROFATIGA FÍSICA DURANTE CONDUCCIÓN (35% del riesgo total)
Comportamientos DMS con Niveles de Severidad:
1. fatigueDriving (Conducción por fatiga) - Peso: 0.25
- LEVE: Factor 1.2 (somnolencia inicial)
- MODERADO: Factor 1.8 (fatiga evidente)
- SEVERO: Factor 2.5 (peligro inmediato)
- Acumulación: Promedio ponderado últimos 30min
2. abnormalDrivingBehavior (Comportamiento anormal) - Peso: 0.20
- Patrón de movimientos irregulares
- Análisis acumulativo de consistencia
3. distractedDriving (Conducción distraída) - Peso: 0.15
- Frecuencia sugerida crítica: >8 eventos/hora
- Duración acumulada: >5 minutos/hora = alto riesgo
4. makeCalls (Hacer llamadas) - Peso: 0.15
- TELÉFONO_EN_MANO: Factor 2.8 (crítico)
- MANOS_LIBRES: Factor 1.3 (moderado)
- Duración acumulada por hora
5. smoke (Fumar en vehículo) - Peso: 0.10
- Frecuencia y duración acumulativa
- Combina con otros distractores
6. driverAnomaly (Anomalía del conductor) - Peso: 0.10
- Patrones fuera del baseline personal
- Análisis de tendencia temporal
7. driverChange (Cambio de conductor) - Peso: 0.05
- Reset de acumulación para nuevo conductor
- Continuidad de monitoreo
**ANÁLISIS ACUMULATIVO DIFERENCIADOR:**Ventana de Análisis Deslizante:
Patrón Temporal:
Frecuencias Críticas Sugeridas:
Duración de Manejo (15%):
- 0-2 horas: Factor 1.0
- 2-4 horas: Factor 1.3
- 4-6 horas: Factor 1.7
- 6+ horas: Factor 2.2
**CONDICIONES AMBIENTALES Y OPERATIVAS (15% del riesgo total)**
**A. Condiciones Ambientales Básicas (40% de este factor)**
**B. Perfil Operativo del Vehículo (35% de este factor)**60 pasajeros: Factor 2.2
**C. Patrón de Viajes Diarios (25% de este factor)**200 km (larga distancia): Factor 2.0
6 viajes/día: Factor 2.1
600 km/día: Factor 2.3
**RÉGIMEN DE TRABAJO - ROSTER (10% del riesgo total)**
**Sistema de Turnos Mineros:**Multiplicadores de Roster Críticos:
Patrones Históricos (5%):
- Historial del conductor
- Tendencias recientes
- Comportamiento baseline
**CONFIGURACIÓN ADAPTATIVA POR CLIENTE:**
Clientes CON Logifit:
- Pre-Conducción: 30%
- Fatiga Durante: 35%
- Duración: 15%
- Condiciones Ambientales/Operativas: 15%
- Régimen de Trabajo (Roster): 10%
- Históricos: 5%
Clientes SIN Logifit:
- Pre-Conducción: 0%
- Fatiga Durante: 50% (peso redistribuido)
- Duración: 20%
- Condiciones Ambientales/Operativas: 20%
- Régimen de Trabajo (Roster): 15%
- Históricos: 5%
**EJEMPLOS DE CÁLCULO POR INDUSTRIA:**
Ejemplo 1 - Bus Interprovincial (60 pasajeros, 200km):
Ejemplo 2 - Transporte Minero (carga, 6 viajes × 20km):
Ejemplo 3 - Materiales Peligrosos (combustible, 300km):
// Para clientes CON Logifit
Risk_Score = (
PreDriving_Risk * 0.30 +
Fatigue_During_Score * 0.35 +
Duration_Factor * 0.20 +
Environmental_Factor * 0.10 +
Historical_Pattern * 0.05
) * Multicollinearity_Multiplier
// Para clientes SIN Logifit
Risk_Score = (
Fatigue_During_Score * 0.55 +
Duration_Factor * 0.25 +
Environmental_Factor * 0.15 +
Historical_Pattern * 0.05
)
Multicollinearity_Multiplier:
- NO_APTO + fatigueDriving: 1.5x
- NO_APTO + abnormalBehavior: 1.4x
- APTO pero 3+ DMS alerts: 1.2x (degradación detectada)
Donde:
- PreDriving_Risk: 0-100 (evaluación Logifit)
- Fatigue_During_Score: 0-100 (eventos DMS acumulados)
- Duration_Factor: 1.0-2.2 (según horas manejando)
- Environmental_Factor: 1.0-1.5 (condiciones adversas)
- Historical_Pattern: 0.8-1.3 (perfil del conductor){
"analysis_result": {
"session_id": "sess_12345",
"timestamp": "2025-07-02T13:30:15Z",
"risk_assessment": {
"overall_risk_score": 85,
"risk_level": "HIGH",
"risk_category": "FATIGUE_CRITICAL",
"confidence": 0.92
},
"risk_factors": {
"fatigue_indicators": {
"score": 78,
"primary_factors": ["excessive_yawning", "prolonged_eye_closure"],
"count_last_hour": {
"yawns": 4,
"eye_closures": 12,
"head_nods": 2
}
},
"driving_duration": {
"total_minutes": 330,
"risk_multiplier": 1.7,
"recommended_break_overdue": true
},
"environmental_context": {
"time_factor": "afternoon_peak",
"weather_impact": "minimal",
"road_conditions": "highway_monotony"
}
},
"predictions": {
"accident_probability_next_30min": 0.23,
"time_to_critical_fatigue": "15-20 minutes",
"recommended_action_urgency": "IMMEDIATE"
},
"recommendations": {
"immediate_actions": [
"Pull over safely within next 5 minutes",
"Take 20-minute break minimum",
"Contact fleet manager"
],
"alert_level": "CRITICAL",
"should_notify_fleet": true,
"suggested_break_duration": 20
}
},
"metadata": {
"processing_time_ms": 45,
"model_version": "v2.1.3",
"last_calibration": "2025-07-01"
}
}LOW (0-30): Monitoreo normal
MODERATE (31-60): Atención incrementada
HIGH (61-80): Alerta preventiva
CRITICAL (81-100): Acción inmediata requeridaclass RiskAnalysisEngine:
def __init__(self):
self.fatigue_model = load_fatigue_detection_model()
self.risk_calculator = RiskCalculator()
self.pattern_analyzer = DriverPatternAnalyzer()
def analyze_real_time(self, event_data):
# Procesar evento individual
fatigue_score = self.fatigue_model.predict(event_data)
risk_score = self.risk_calculator.calculate(event_data, fatigue_score)
return self.generate_recommendations(risk_score)
def analyze_session(self, session_data):
# Análisis acumulativo
patterns = self.pattern_analyzer.analyze(session_data)
return self.calculate_session_risk(patterns)-- Tablas principales
drivers (id, name, experience_years, baseline_profile)
sessions (id, driver_id, start_time, end_time, total_events)
events (id, session_id, timestamp, event_type, severity, raw_data)
risk_calculations (id, session_id, timestamp, risk_score, factors)
alerts (id, session_id, alert_level, timestamp, resolved)