1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
| """ 疲劳检测数据集评估工具
评估指标: - 准确率/精确率/召回率/F1 - 帧率(FPS) vs 准确率权衡 - 模型大小 vs 部署可行性 """
import numpy as np from typing import Dict, List, Tuple
class FatigueBenchmark: """ 疲劳检测基准评估 对比多个模型在NTHU-DDD/YawDD/SUST-DDD上的表现 """ BENCHMARKS = { 'NTHU-DDD': { 'subjects': 36, 'classes': 2, 'fps': 30, 'resolution': (640, 480), }, 'YawDD': { 'subjects': 34, 'classes': 3, 'fps': 30, 'resolution': (640, 480), }, 'SUST-DDD': { 'subjects': 10, 'classes': 2, 'fps': 30, 'resolution': (1280, 720), 'modalities': ['rgb', 'eeg', 'ecg'], }, } @staticmethod def evaluate_model(model_name: str, accuracy: float, params_m: float, fps: int, dataset: str) -> Dict: """ 评估模型在各维度的表现 Args: model_name: 模型名 accuracy: 准确率 0-1 params_m: 参数量(百万) fps: 推理帧率 dataset: 数据集名 """ deploy_score = 0 if params_m < 5: deploy_score += 40 量化友好 elif params_m < 20: deploy_score += 25 elif params_m < 50: deploy_score += 10 if fps >= 30: deploy_score += 40 量产帧率要求 elif fps >= 15: deploy_score += 25 elif fps >= 10: deploy_score += 10 if accuracy > 0.85: deploy_score += 20 elif accuracy > 0.75: deploy_score += 10 elif accuracy > 0.65: deploy_score += 5 if deploy_score >= 80: recommendation = 'production_ready' elif deploy_score >= 60: recommendation = 'prototype_ready' elif deploy_score >= 40: recommendation = 'research_only' else: recommendation = 'not_suitable' return { 'model': model_name, 'dataset': dataset, 'accuracy': f'{accuracy:.1%}', 'params': f'{params_m:.1f}M', 'fps': fps, 'deploy_score': deploy_score, 'recommendation': recommendation, 'model_size_mb': params_m * 4, 'model_size_int8_mb': params_m * 1, }
if __name__ == "__main__": benchmark = FatigueBenchmark() models = [ ('EffRes-DrowsyNet', 0.847, 30, 25), ('Fisher-Gabor-LDCRF', 0.863, 0.1, 30), ('CNN-Baseline', 0.731, 5, 60), ('ViT-Base', 0.825, 85, 15), ('MobileNetV3-LSTM', 0.798, 2, 45), ] print("=== 疲劳检测模型基准对比 ===\n") print(f"{'模型':<20} {'准确率':<8} {'参数':<8} {'FPS':<5} " f"{'部署分':<6} {'推荐':<15} {'INT8大小':<10}") print("-" * 80) for name, acc, params, fps in models: result = benchmark.evaluate_model(name, acc, params, fps, 'NTHU-DDD') print(f"{name:<20} {result['accuracy']:<8} {result['params']:<8} " f"{result['fps']:<5} {result['deploy_score']:<6} " f"{result['recommendation']:<15} " f"{result['model_size_int8_mb']:.1f}MB") print(f"\n=== 量产推荐 ===") for name, acc, params, fps in models: result = benchmark.evaluate_model(name, acc, params, fps, 'NTHU-DDD') if result['recommendation'] == 'production_ready': print(f"✅ {name}: 准确率{acc:.1%}, INT8={params:.1f}MB, {fps}fps") elif result['recommendation'] == 'prototype_ready': print(f"⚠️ {name}: 可原型验证,需优化")
|