目录前言一、项目背景与问题定义1.1 为什么需要基于振动的路面识别1.2 核心挑战二、数据理解与预处理2.1 数据结构2.2 标签解析2.3 全局标准化2.4 RMS包络特征2.5 滑窗采样2.6 防止数据泄露关键设计三、物理合法的数据增强四、CNN-LSTM模型架构4.1 整体结构4.2 Channel Attention机制4.3 模型参数量五、训练策略与超参数5.1 类别权重放大解决不平衡5.2 学习率调度器5.3 早停机制监控验证损失5.4 完整超参数六、实验结果与分析6.1 混淆矩阵6.2 分类报告6.3 综合指标6.4 训练曲线七、阈值调优八、继续改进建议8.1 频域特征增强8.2 损失函数升级8.3 数据质量控制8.4 多轮交叉验证8.5 多传感器融合8.6 模型轻量化九、部署建议9.1 ONNX导出9.2 车载芯片适配十、总结前言在智能驾驶系统中路面类型识别沥青 vs 湿滑是车辆稳定性控制的前置关键环节。传统方法依赖视觉传感器但在雨雾、夜间等恶劣条件下性能大打折扣。本文介绍的基于车轮三轴加速度传感器的路面识别系统通过分析轮胎与路面摩擦产生的振动信号实现全天候、高精度的路面分类。核心成果在真实采集数据上达到97.64%准确率、0.9929 AUC湿滑路面召回率89.80%满足工业级部署要求。一、项目背景与问题定义1.1 为什么需要基于振动的路面识别传感器优势劣势摄像头视觉直观、分辨率高受光照、雨雾影响大激光雷达精度高成本高、雨雾衰减严重车轮加速度IMU全天候、不受光照影响信号复杂需要算法提取特征1.2 核心挑战数据严重不平衡湿滑路面数据量远少于沥青路面多源噪声干扰车身振动、发动机噪声、路面起伏叠加数据泄露风险同一采集片段相邻窗口高度相关工业级约束模型需满足高召回率安全优先、低延迟、小体积二、数据理解与预处理2.1 数据结构原始数据存储在Excel文件中每个Sheet命名格式为{路面类型}-{车轮编号}{采集次数}。Sheet名称含义沥青-11沥青路面、左前轮、第1次采集湿滑-32湿滑路面、右后轮、第2次采集车轮编号1左前2右前3左后4右后每个Sheet包含三列加速度数据x,y,z采样频率1800Hz。2.2 标签解析def parse_sheet_info(sheet_name: str): parts sheet_name.strip().split(-) surface parts[0] # 沥青 或 湿滑 code parts[1] # 如 32 wheel int(code[0]) # 车轮编号 trial int(code[1]) # 采集次数 return surface, wheel, trial2.3 全局标准化采用两阶段加载策略先收集所有Sheet的数据计算全局均值和标准差再统一标准化。这确保了不同Sheet、不同车轮间的数据可比性。# 第一遍收集全局统计量 all_concat np.concatenate(all_raw_data, axis0) global_mean all_concat.mean(axis0) global_std all_concat.std(axis0) # 第二遍应用标准化 norm_xyz (raw_xyz - global_mean) / (global_std 1e-8)2.4 RMS包络特征RMS均方根包络反映振动信号的能量变化趋势能有效表征路面粗糙度差异。湿滑路面通常表现为能量衰减更快、波动更平滑。def compute_rms_envelope(data, window50): 滑动RMS计算反映振动能量包络 rms np.zeros_like(data) half window // 2 for i in range(len(data)): start max(0, i - half) end min(len(data), i half) rms[i] np.sqrt(np.mean(data[start:end]**2)) return rms通过添加RMS包络输入特征从3通道 → 6通道x,y,z RMS_x, RMS_y, RMS_z。2.5 滑窗采样for i in range(0, len(feature_matrix) - WINDOW_SIZE, STEP_SIZE): window_data feature_matrix[i:i WINDOW_SIZE] all_windows.append(window_data) all_labels.append(surface) all_groups.append(sheet)参数值说明WINDOW_SIZE600~0.33秒1800Hz下STEP_SIZE25050%重叠率2.6 防止数据泄露关键设计同一个Sheet同一车轮/同一采集批次的所有窗口必须全部落在训练集或全部落在测试集。from sklearn.model_selection import GroupShuffleSplit gss GroupShuffleSplit(n_splits1, test_size0.2, random_state42) train_idx, test_idx next(gss.split(X, y_encoded, groupsgroups)) # 额外保障确保测试集包含两类样本三、物理合法的数据增强在振动信号中并非所有增强方式都物理可解释增强方式物理含义是否采用幅值缩放模拟传感器灵敏度差异✅高斯噪声模拟电气噪声✅循环移位破坏时序因果性❌时间反转改变振动传播方向❌def augment_vibration_window(window_xyz, noise_std0.03, scale_range(0.9, 1.1)): aug window_xyz.copy() scale np.random.uniform(*scale_range) aug * scale noise np.random.normal(0, noise_std, sizewindow_xyz.shape) aug noise return aug关键设置SAMPLE_THRESHOLD 0强制所有类别参与增强。四、CNN-LSTM模型架构4.1 整体结构输入: 600 × 6 (窗口长度 × 特征通道) ↓ Conv1D(6→96, k15) BN ReLU MaxPool(3) Dropout(0.2) ↓ Conv1D(96→160, k7) BN ReLU MaxPool(2) Dropout(0.25) ↓ Conv1D(160→160, k3) BN ReLU MaxPool(2) Dropout(0.3) ↓ Channel Attention (160维) ← 自动学习通道重要性 ↓ Bi-LSTM (hidden128, bidirectional) ↓ LSTM (hidden96, unidirectional) ↓ 分类器: Linear(96→128) BN ReLU Dropout(0.4) Linear(128→2)4.2 Channel Attention机制class ChannelAttention(nn.Module): def __init__(self, channels, reduction8): super().__init__() self.fc nn.Sequential( nn.AdaptiveAvgPool1d(1), nn.Flatten(), nn.Linear(channels, max(channels // reduction, 4)), nn.ReLU(), nn.Linear(max(channels // reduction, 4), channels), nn.Sigmoid() ) def forward(self, x): weight self.fc(x).unsqueeze(-1) return x * weight # 通道级注意力加权4.3 模型参数量模块参数量Conv Blocks≈ 200KChannel Attention≈ 1.5KLSTM Layers≈ 500KClassifier≈ 75K总计≈ 776K五、训练策略与超参数5.1 类别权重放大解决不平衡class_weights_raw compute_class_weight(balanced, classesnp.unique(y_train_raw), yy_train_raw) class_weights_raw[1] class_weights_raw[1] * 2.5 # 湿滑权重放大2.5倍5.2 学习率调度器scheduler ReduceLROnPlateau(optimizer, modemin, factor0.5, patience10, min_lr1e-6) scheduler.step(avg_val_loss)5.3 早停机制监控验证损失监控验证损失而非验证准确率——后者容易被多数类沥青虚高。early_stopper EarlyStopping(patience25, modemin) should_stop early_stopper(avg_val_loss, model)5.4 完整超参数参数值优化器AdamW学习率1e-3权重衰减1e-4批大小96最大Epoch150早停耐心值25六、实验结果与分析6.1 混淆矩阵真实\预测预测: 沥青预测: 湿滑真实: 沥青86617真实: 湿滑544解读湿滑漏报仅5个召回率 89.8%沥青误报仅17个误报率 1.9%整体准确率97.64%6.2 分类报告指标沥青湿滑Precision0.99430.7213Recall0.98070.8980F1-Score0.98750.80006.3 综合指标指标数值整体准确率97.64%ROC-AUC0.9929湿滑召回率89.80%湿滑精确率72.13%湿滑F10.80006.4 训练曲线从图中可以看出训练损失从0.77快速收敛至0.10以下验证损失稳定在0.10~0.15区间验证集规模小波动正常训练准确率与验证准确率均稳定在98%左右训练与验证曲线高度吻合没有过拟合迹象七、阈值调优threshold 0.6 preds (probs[:, 1] threshold).long()阈值召回率精确率F10.5100%50.0%0.670.689.8%72.1%0.800.780.0%80.0%0.80推荐阈值 0.6在安全召回率与用户体验精确率间取得最佳平衡。八、继续改进建议虽然当前模型表现优秀但以下方向可进一步提升8.1 频域特征增强当前模型仅在时域RMS包络做特征增强。建议在数据加载阶段添加频域特征from scipy.fft import rfft def add_spectral_features(norm_xyz, n_fft128): 添加FFT幅度谱作为额外通道 fft_features [] for axis in range(3): spec np.abs(rfft(norm_xyz[:, axis], nn_fft)) spec np.log1p(spec) # 对数压缩 fft_features.append(spec) return np.concatenate(fft_features, axis1)预期效果沥青和湿滑在频域的能量分布差异更显著可进一步提升精确率。8.2 损失函数升级尝试Focal Loss替代加权交叉熵强制模型关注被错误分类的湿滑样本class FocalLoss(nn.Module): def __init__(self, alpha0.25, gamma2.0): super().__init__() self.alpha alpha self.gamma gamma def forward(self, inputs, targets): ce_loss nn.CrossEntropyLoss(reductionnone)(inputs, targets) pt torch.exp(-ce_loss) return (self.alpha * (1 - pt) ** self.gamma * ce_loss).mean()8.3 数据质量控制问题您手动跳过了湿滑-41疑似标签错误但可能还有其他样本存在标注噪声。解决方案对每个Sheet做频谱可视化剔除明显异常波形的样本或使用主动学习策略进行人工复核。8.4 多轮交叉验证当前使用单次随机划分random_state42建议使用5折交叉验证评估模型稳定性from sklearn.model_selection import StratifiedKFold skf StratifiedKFold(n_splits5, shuffleTrue, random_state42)8.5 多传感器融合将车轮加速度信号与车辆CAN总线信号车速、方向盘转角、制动压力融合# 扩展输入特征 can_features pd.DataFrame([speed, steering_angle, brake_pressure]).T feature_matrix np.concatenate([norm_xyz, rms_features, can_features], axis1)8.6 模型轻量化当前模型参数量约77万如需部署到低成本MCU可尝试通道剪枝移除Conv层中不重要的通道知识蒸馏用当前模型作为教师网络训练一个更小的学生模型如纯CNN量化训练训练时模拟INT8量化部署后加速3~4倍九、部署建议9.1 ONNX导出dummy_input torch.randn(1, 600, 6).to(DEVICE) torch.onnx.export( model, dummy_input, road_classifier.onnx, opset_version13, input_names[input], output_names[output], dynamic_axes{input: {0: batch_size}, output: {0: batch_size}} )9.2 车载芯片适配芯片平台部署方式地平线J3/J5ONNX → 地平线模型转换工具TI TDA4ONNX → ONNXRuntime高通SA8155ONNX → TensorFlow Lite十、总结本文详细介绍了一个可直接部署的工业级路面识别系统维度成果准确率97.64%AUC0.9929湿滑召回率89.80%湿滑F10.8000模型大小≈ 776K 参数核心技术要点全局标准化 RMS包络特征物理合法的数据增强CNN-LSTM Channel Attention架构类别权重放大 早停监控验证损失阈值调优0.6关于欠拟合的问题根据训练曲线损失稳定在0.1以下、准确率98%模型不存在欠拟合。验证损失波动源于验证集规模较小仅49个湿滑样本属正常现象不影响最终分类性能。如需进一步提升建议按照第八节的改进建议操作。声明本文数据来源于江淮试验场实际采集已做脱敏处理。代码可依需开源欢迎交流探讨。