FEATURED · 精选文章

基于CNN-LSTM混合模型的光纤水声信号识别:从原理到工程部署

发布时间 / 2026/9/4 12:26:24
来源 / 创域科博编辑部
栏目 / 资讯中心
基于CNN-LSTM混合模型的光纤水声信号识别:从原理到工程部署 简介本资源是一套面向本科毕业设计、课程设计与机器学习实践者的光纤水声信号识别深度学习项目聚焦水下声学环境中的船只引擎声、生物声等非线性信号分类任务解决低信噪比下特征提取难、模型泛化弱等典型问题。压缩包共276个文件含11个核心Python脚本如数据加载mydata.py、模型构建Modelbuilder.py、可视化Plotter.py、7个Jupyter Notebook实验记录、14个CSV特征数据集含SMOTE增强后的频域特征文件如n_0_smote_fequence_feature.csv等、4个.pth模型权重及多个.pkl预处理中间结果辅以README.md项目说明与openmax.py异常类别识别模块整体6.92MB结构清晰、模块解耦。目前已有28人学习下载提供从原始信号预处理、CNN/LSTM混合建模、训练过程监控到OpenMax边界优化的完整技术链路附带checkpoints多阶段模型快照便于复现实验、调试参数或迁移至实际海洋监测场景。1. 项目概述从“听”到“识”的深海之眼最近在整理一个老项目翻出来一个名为“基于深度学习的光纤水声信号识别.zip”的压缩包思绪一下子被拉回到几年前。当时我们团队接到一个需求要在水下复杂环境中实现对特定声学事件的自动识别与分类比如船只航行、海洋生物活动、甚至是水下工程作业的异常声响。传统的声呐系统虽然强大但往往体积庞大、部署复杂且对微弱、低频信号的感知能力有限。而基于光纤的水声传感技术以其高灵敏度、抗电磁干扰、易于组网等优势成为了我们探索的新方向。这个项目本质上就是给这根“会听”的光纤装上一个“会思考”的大脑——用深度学习模型去解读光纤“听”到的水下声音故事。简单来说这个项目要解决的核心问题是如何从光纤水听器采集到的、通常混杂着大量海洋环境噪声的原始光信号中精准地识别出我们感兴趣的目标声源信号。这就像在一个嘈杂的菜市场里让你只听声音就分辨出远处某个熟人在说什么难度可想而知。传统的信号处理方法比如滤波、频谱分析在面对这种非平稳、低信噪比的复杂信号时往往力不从心需要大量的人工特征工程和专家经验。而深度学习尤其是卷积神经网络CNN和循环神经网络RNN及其变体为我们提供了一种端到端的解决方案让模型直接从原始或预处理后的信号数据中自动学习并提取出最具判别性的特征最终完成分类或检测任务。这个项目适合谁呢如果你是从事海洋观测、水下安防、资源勘探、或声学信号处理相关领域的研究人员或工程师正在寻找更智能、更自动化的信号识别方案那么这里面的思路和踩过的坑或许能给你一些启发。即便你对光纤传感不熟但项目中对时序信号的处理、小样本下的模型训练、以及工业场景下的模型部署优化等经验对于处理类似的时间序列数据如振动、心电、语音也具有普适的参考价值。接下来我会把整个项目的设计思路、技术细节、实操过程以及那些“血泪教训”毫无保留地分享出来。2. 核心思路与技术选型为什么是“光纤深度学习”2.1 光纤水听器灵敏的“水下麦克风”首先得搞清楚我们的“耳朵”是怎么工作的。我们用的是基于干涉原理的相位敏感型光纤水听器。它的核心是一段传感光纤当水中的声波压力波作用在光纤上时会引起光纤长度和折射率的微小变化进而导致在光纤中传输的光信号的相位发生改变。我们通过解调这个相位变化就能反演出作用在光纤上的声压信号。这种技术的灵敏度极高能检测到极其微弱的声音而且光纤本身是电绝缘的不怕水下复杂的电磁环境非常适合长期布放。但问题也随之而来第一原始解调出的信号是光相位随时间的变化它包含了所有频率的声压信息是一个宽频带的“声音混合物”。第二海洋背景噪声非常丰富包括波浪噪声、湍流噪声、生物噪声等它们和目标信号如船声在频域上常常重叠。第三光纤水听器阵列会采集海量数据人工监听和判读效率极低。这就引出了我们需要深度学习的根本原因自动化、智能化地从高维、混杂的时序数据中挖掘出有意义的模式。2.2 深度学习模型选型CNN与RNN的联姻面对一维时序信号常见的深度学习模型有几类候选全连接网络Dense Network、卷积神经网络CNN、循环神经网络RNN以及它们的混合体。全连接网络首先被排除。它将时序信号展平为一维向量完全破坏了信号的时间局部相关性参数量巨大且难以训练对于长序列信号几乎不可行。一维卷积神经网络1D-CNN这是我们的主力选手之一。CNN的卷积核在时序上滑动能非常有效地提取信号的局部特征比如某个特定频率的短时脉冲、信号的包络形状等。多个卷积层堆叠可以逐渐组合出更高层次的特征例如从边缘到纹理在信号里就是从波形细节到整个事件的轮廓。我们通常用CNN作为特征提取器。循环神经网络RNN及其变体LSTM/GRU这是另一位主力。水声信号是典型的时间序列当前时刻的信号与过去时刻紧密相关。RNN系列模型专为处理这种序列依赖关系而生它们有“记忆”能力能捕捉信号的长时上下文信息。比如一艘船由远及近再远去其声音的多普勒频移变化是一个连续过程LSTM就能很好地建模这种动态演变。混合模型CNNRNN这是我们最终采用的架构也是当前处理时序信号分类任务的黄金标准之一。其思路非常直观先用1D-CNN层作为“特征工程流水线”从原始信号中自动提取出丰富的局部特征图然后将这些特征图在时间维度上展开送入LSTM层让LSTM去学习这些特征在时间上的演变规律和依赖关系最后接上全连接层和Softmax输出层进行分类。这种结构兼顾了局部特征和全局时序信息通常能取得比单一模型更好的效果。注意模型选型没有银弹。对于某些频域特征非常明显的信号比如特定频率的声呐脉冲可能仅用CNN在频谱图上操作效果就很好。对于非常长的序列且计算资源有限时可能要考虑使用Transformer的变体如Informer或者更轻量的RNN。我们的选择是基于当时几年前的硬件条件、项目数据特性以及团队技术栈的综合考量。2.3 整体技术流程设计我们的项目Pipeline可以概括为以下几步数据采集与预处理光纤水听器阵列采集原始光信号经解调设备转换为数字电压时序信号。数据切片与标注将长时间序列切割成固定长度如2秒、5秒的片段。根据同步记录的水面监控、AIS船舶自动识别系统等信息为每个片段打上标签如“背景噪声”、“商船”、“渔船”、“未知引擎声”等。特征工程/表示将切片后的时域信号可以转换为多种“视图”供模型学习原始时域波形直接输入保留最完整信息但对模型要求高。短时傅里叶变换STFT谱图将信号转换为时间-频率-强度的三维谱图即声谱图这是最常用的输入之一因为它将信号的时间结构和频率结构直观地展现出来非常契合CNN处理图像的特性。梅尔频谱图Mel-Spectrogram在STFT基础上将频率轴映射到梅尔刻度更贴近人耳听觉特性对于以生物噪声为主的任务可能更有优势。MFCC梅尔频率倒谱系数进一步提取的系数常用于语音识别在水声信号中也有应用但可能会损失部分细节信息。 在我们的项目中声谱图是主要的输入形式。模型构建与训练搭建CNN-LSTM混合模型使用标注好的声谱图数据进行训练。采用交叉熵损失使用Adam优化器并加入Dropout、BatchNorm等技巧防止过拟合。模型评估与部署在独立的测试集上评估模型准确率、召回率、F1分数等指标。将训练好的模型转换为TensorRT或ONNX格式部署到边缘计算设备如水下接驳盒内的工控机或服务器端进行实时或准实时的流式识别。3. 实操要点与核心环节实现3.1 数据准备质量决定天花板数据是深度学习的基石对于水声信号这种小众领域数据获取和标注更是最大的挑战。数据采集与标注我们当时是在一个海上试验场进行的。布放了由多个光纤水听器组成的阵列同步记录数据。标注信息来源于AIS数据获取试验海域附近船舶的实时位置、航速、船型用于关联和标注船舶噪声。人工监听与日志安排有经验的声呐员对部分时间段的数据进行监听记录下可辨识的事件如海豚叫声、打桩声等。可控声源在特定时间播放已知信号如特定频率的调频信号生成“干净”的标签数据。 这个过程极其耗时费力且存在大量模糊地带比如远距离的微弱船声与背景噪声难以区分。最终我们构建了一个包含数万条2秒片段的数据集但类别不均衡问题严重“背景噪声”类样本远多于其他类别。数据预处理与增强标准化对每个数据片段进行零均值、单位方差的标准化加速模型收敛。STFT生成声谱图我们使用librosa库。关键参数需要仔细调试import librosa import librosa.display import numpy as np # 加载音频片段已转换为电压时间序列 y, sr librosa.load(‘audio_snippet.wav’, srNone) # 保持原始采样率 # 计算STFT生成声谱图 n_fft 2048 # FFT窗口大小决定频率分辨率 hop_length 512 # 帧移决定时间分辨率 win_length n_fft # 窗口长度 window ‘hann’ # 窗函数 D librosa.stft(y, n_fftn_fft, hop_lengthhop_length, win_lengthwin_length, windowwindow) # 转换为幅度谱图dB scale S_db librosa.amplitude_to_db(np.abs(D), refnp.max)n_fft和hop_length的选择是平衡时间分辨率和频率分辨率的关键。对于低频丰富的船噪声需要较高的频率分辨率较大的n_fft对于快速变化的瞬态信号则需要较好的时间分辨率较小的hop_length。我们经过实验针对我们的数据采样率通常为几kHz到几十kHzn_fft2048hop_length512是一个不错的起点。数据增强为了解决样本少和类别不均衡我们采用了针对声谱图的增强技术时移Time Shifting在时间轴方向随机滚动一部分。频移Frequency Shifting模拟多普勒效应或设备微小频偏在频率轴方向轻微滚动。添加噪声随机添加高斯白噪声或真实录制的海洋背景噪声片段。SpecAugment一种在声谱图上直接进行掩码Mask的增强方法随机遮蔽掉一些时间块或频率带强制模型不依赖于某些固定的特征效果显著。实操心得数据增强一定要在声谱图域进行而不是在原始时域信号上做完增强再生成谱图这样更高效且易于控制。同时增强的强度要适中避免破坏信号的本质特征。对于水声信号频移增强要谨慎因为某些目标的频率特征是其关键标识。3.2 模型构建CNN-LSTM混合网络详解我们使用PyTorch搭建模型。下面是一个简化但核心的模型结构代码示例import torch import torch.nn as nn import torch.nn.functional as F class CNNLSTM(nn.Module): def __init__(self, input_height, input_width, num_classes): super(CNNLSTM, self).__init__() # 假设输入声谱图形状为 [batch, 1, freq_bins, time_frames] # CNN部分用于提取局部时空特征 self.cnn nn.Sequential( nn.Conv2d(1, 32, kernel_size(3, 3), padding1), # [batch, 32, freq, time] nn.BatchNorm2d(32), nn.ReLU(), nn.MaxPool2d(kernel_size(2, 2)), # [batch, 32, freq/2, time/2] nn.Conv2d(32, 64, kernel_size(3, 3), padding1), nn.BatchNorm2d(64), nn.ReLU(), nn.MaxPool2d(kernel_size(2, 2)), # [batch, 64, freq/4, time/4] nn.Conv2d(64, 128, kernel_size(3, 3), padding1), nn.BatchNorm2d(128), nn.ReLU(), # 这里可以再加池化也可以不加取决于输入尺寸 ) # 计算CNN输出展平后的维度需要根据输入尺寸动态计算或固定 # 假设经过上述CNN后特征图形状为 [batch, 128, H, W] # 我们将H频率维和W时间维展平但为了送入LSTM我们需要将时间维保留为序列 # 一种常见做法在CNN最后使用 AdaptiveAvgPool2d 将空间维度频率池化掉只保留通道和时间 self.adaptive_pool nn.AdaptiveAvgPool2d((1, None)) # 输出 [batch, 128, 1, time_seq] # 或者我们可以将频率维和通道维合并时间维作为序列 # self.flatten_for_lstm ... 需要根据实际尺寸计算 # LSTM部分用于捕捉时间依赖 self.lstm nn.LSTM(input_size128, # 每个时间步的特征维度 hidden_size256, num_layers2, batch_firstTrue, bidirectionalTrue, # 使用双向LSTM捕捉前后文 dropout0.3) # 双向LSTM输出维度为 hidden_size * 2 self.fc nn.Linear(256 * 2, num_classes) self.dropout nn.Dropout(0.5) def forward(self, x): # x: [batch, 1, freq, time] cnn_features self.cnn(x) # [batch, 128, H, W] # 为了送入LSTM我们需要将特征重组为序列形式 [batch, time_steps, feature_dim] # 方法1自适应池化压缩频率维 cnn_features self.adaptive_pool(cnn_features) # [batch, 128, 1, W] cnn_features cnn_features.squeeze(2) # [batch, 128, W] # 调整维度: [batch, channels, time] - [batch, time, channels] lstm_input cnn_features.permute(0, 2, 1) # [batch, W, 128] # LSTM处理 lstm_out, (h_n, c_n) self.lstm(lstm_input) # lstm_out: [batch, W, 256*2] # 通常取最后一个时间步的输出或者所有时间步的平均/最大池化 # 这里取最后一个时间步 lstm_last lstm_out[:, -1, :] # [batch, 512] # 全连接分类 out self.dropout(lstm_last) out self.fc(out) # [batch, num_classes] return out关键点解析输入表示我们将声谱图视为单通道的“图像”形状为[批次大小, 1, 频率单元数, 时间帧数]。CNN设计使用小尺寸卷积核3x3逐步增加通道数提取从边缘到纹理的特征。BatchNorm和Dropout是防止过拟合的利器在数据量不大的情况下尤为重要。CNN到LSTM的衔接这是架构设计的难点。我们需要将CNN输出的三维特征图[C, H, W]转换为LSTM期望的序列形式[序列长度, 特征维度]。上述代码采用了一种方法用自适应平均池化将频率维H压缩为1即对所有频率特征进行平均然后将通道维C作为特征维度时间维W作为序列长度。你也可以尝试其他方法比如将H和C展平作为一个高维特征但这样特征维度会很大。双向LSTM水声信号的前后文信息都很重要双向LSTM能同时考虑过去和未来的信息通常能提升性能。分类头取LSTM最后一个时间步的输出包含了整个序列的上下文信息送入全连接层进行分类。3.3 模型训练与调优损失函数与优化器损失函数使用nn.CrossEntropyLoss()。对于类别不均衡问题可以在CrossEntropyLoss中设置weight参数给少数类别更高的权重。优化器使用torch.optim.Adam学习率从3e-4开始尝试。配合ReduceLROnPlateau或CosineAnnealingLR调度器动态调整学习率。训练技巧监控与可视化使用TensorBoard或WandB实时监控训练损失、验证损失、准确率等指标。绘制混淆矩阵清晰看到模型在哪些类别上容易混淆。早停Early Stopping当验证集损失在连续多个epoch如10个不再下降时停止训练防止过拟合。梯度裁剪特别是使用LSTM时梯度爆炸是个潜在风险设置torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0)。混合精度训练如果使用支持Tensor Core的GPU如NVIDIA V100, A100可以启用AMPAutomatic Mixed Precision训练大幅减少显存占用并加快训练速度几乎不影响精度。超参数调优我们使用Optuna或Ray Tune进行了一定范围的超参数搜索重点关注的参数包括CNN的层数、通道数、卷积核大小。LSTM的隐藏层大小、层数。Dropout比率。学习率及调度器参数。批处理大小Batch Size。踩坑实录最初我们忽略了学习率预热Warmup。在训练初期模型参数是随机初始化的直接使用较大的学习率可能导致训练不稳定。后来加入了线性Warmup例如前5个epoch从很小的学习率线性增加到初始学习率训练曲线平滑了很多。另外批归一化BatchNorm在小批量Batch Size下的统计量估计可能不准如果Batch Size只能设得很小比如8或16可以考虑使用组归一化GroupNorm替代。4. 部署优化与工程化考量实验室模型跑出高精度只是第一步要让它在真实水下环境中稳定、高效地运行还有很长的路要走。4.1 模型压缩与加速部署环境往往是算力有限的边缘设备如Jetson AGX Orin、Intel NUC。量化Quantization训练后动态/静态量化将模型权重和激活从FP32转换为INT8模型大小减少约75%推理速度提升2-4倍。PyTorch提供了方便的API。静态量化需要校准数据但对精度影响通常较小是我们首选。# 静态量化示例简化 model_fp32.eval() model_fp32.qconfig torch.quantization.get_default_qconfig(‘fbgemm’) # x86 # 或 ‘qnnpack’ for ARM model_prepared torch.quantization.prepare(model_fp32) # 用校准数据运行收集统计信息 with torch.no_grad(): for data in calibration_dataloader: model_prepared(data) model_int8 torch.quantization.convert(model_prepared)剪枝Pruning移除模型中不重要的权重如接近0的权重创造稀疏性。结构化剪枝移除整个通道或滤波器更容易获得实际的加速。可以使用PyTorch的torch.nn.utils.prune工具。知识蒸馏训练一个大的“教师模型”然后用它来指导一个小的“学生模型”训练让学生模型模仿教师模型的行为从而在小模型上获得接近大模型的性能。4.2 部署格式与推理引擎ONNX将PyTorch模型导出为ONNX格式实现框架无关性。便于后续使用不同的推理引擎如ONNX Runtime, TensorRT进行优化和部署。torch.onnx.export(model, dummy_input, “model.onnx”, input_names[“input”], output_names[“output”], dynamic_axes{“input”: {0: “batch_size”}, “output”: {0: “batch_size”}})TensorRTNVIDIA GPU上的终极优化引擎。它将ONNX模型进一步优化层融合、内核自动调优等生成高度优化的推理引擎.engine文件能最大化利用GPU资源获得极致的低延迟和高吞吐。这是我们最终在部署到带GPU的水下节点时采用的方案。LibTorch (C)如果需要集成到C工程中或者对部署包体积有严格要求可以使用PyTorch的C前端LibTorch进行推理。4.3 实时流式处理实际应用中数据是源源不断的流。我们需要设计一个流式处理管道数据流缓冲开辟一个环形缓冲区持续接收来自数据采集卡或网络的水声信号。滑动窗口与重叠以固定长度如2秒的窗口以一定的重叠率如50%从缓冲区取出数据块。重叠可以避免在窗口边界处切分事件。预处理与推理对每个数据块进行相同的预处理标准化、STFT送入模型推理。后处理与决策对模型的输出各类别概率进行后处理。例如设置一个置信度阈值如0.8只有超过阈值的类别才被认定。还可以结合多个连续窗口的结果进行投票以提高鲁棒性。结果输出将识别结果事件类型、发生时间、置信度通过水声通信或光纤网络上传至水面监控中心。工程经验流式处理中的性能瓶颈往往在数据预处理特别是STFT和模型推理。我们使用CUDA加速的库如CuPy来计算STFT并将整个预处理-推理流水线用TensorRT部署在一个Jetson AGX Xavier上实现了对多路水听器信号的实时处理延迟100ms。另外内存管理要格外小心长时间运行不能有内存泄漏。5. 常见问题与排查技巧实录在实际开发和部署中我们遇到了无数问题。这里总结几个最具代表性的5.1 模型在训练集上表现很好但在验证集/测试集上很差过拟合现象训练准确率直奔100%验证准确率在60%徘徊。排查与解决检查数据泄露确保训练集和验证集的数据是严格按时间或事件独立划分的绝不能有重叠或来自同一段连续录音的相邻片段。这是最容易犯也最致命的错误。增强数据使用之前提到的SpecAugment、加噪声、时移频移等方法增加数据的多样性。增加正则化加大Dropout比率从0.3尝试到0.5。在CNN和全连接层后加入BatchNorm。在损失函数中加入L2权重衰减Weight Decay。简化模型减少CNN或LSTM的层数、神经元数量。一个更小的模型往往泛化能力更好。早停严格监控验证集损失一旦不再下降就停止训练。5.2 模型对所有样本都预测为同一个类别类别不均衡现象模型输出总是“背景噪声”因为数据集中90%都是背景噪声。排查与解决重采样对少数类样本进行过采样如SMOTE算法但在图像/谱图上需谨慎使用其变体或对多数类样本进行欠采样。类别权重在CrossEntropyLoss中设置weight参数让模型更关注少数类。权重通常设置为类别样本数比例的倒数。修改损失函数使用Focal Loss它通过降低易分类样本的权重让模型更专注于难分类的样本。数据层面尽可能去采集更多少数类样本的数据这是根本解决之道。5.3 模型推理速度慢无法满足实时性要求现象处理一帧数据需要几百毫秒而我们需要每秒处理几十帧。排查与解决Profile分析使用py-spy或torch.profiler工具找出代码中的性能热点。往往是数据预处理STFT或某个特定的网络层。优化预处理STFT计算很耗时。检查是否可以使用更小的n_fft和hop_length而不显著影响性能是否可以使用滑动FFT等优化算法考虑使用CUDA加速的库。模型优化量化INT8量化通常能带来2-4倍的加速。剪枝移除冗余权重。更换轻量模型考虑MobileNet、SqueezeNet的1D版本或专门为时序设计的轻量模型如TCNTemporal Convolutional Network。推理引擎务必使用TensorRT或ONNX Runtime进行部署它们有大量的图优化和内核优化。批处理即使实时处理也可以将短时间内到达的多个数据帧组成一个小批量mini-batch进行推理能更好地利用GPU的并行能力提高吞吐量。5.4 在真实环境中识别率骤降现象实验室测试准确率85%海上真实环境测试不到50%。排查与解决域适应问题实验室数据可能来自水池或特定海域与真实部署海域的声学环境噪声谱、传播特性不同。这是最大的挑战。解决方案收集目标海域的无标签数据进行自监督预训练或域自适应训练如使用DANN域对抗网络。或者在目标海域进行短期的微调即使只有少量标注数据也很有帮助。传感器差异不同批次的光纤水听器、不同的解调设备其频率响应、本底噪声可能存在差异。解决方案在数据采集阶段就引入设备编号作为元数据或者在预处理中加入标准化校准步骤尝试消除设备间差异。未知类别干扰真实环境中存在大量训练集中未出现的声源。解决方案在模型输出中增加一个“未知”或“其他”类别并设置一个较低的置信度阈值当模型对所有已知类别的置信度都低于阈值时归类为“未知”。后期再对“未知”类别进行聚类分析可能发现新的声源类型。这个项目从技术验证到工程落地是一个不断与数据、模型、环境作斗争的过程。最大的体会是在工业或科研应用中数据的质量和代表性远比模型结构的花哨更重要。往往花费80%的时间在数据获取、清洗、标注和增强上。另一个深刻的教训是必须尽早考虑部署问题实验室的模型精度只是一个方面在资源受限的边缘设备上能否跑起来、跑多快决定了项目的最终价值。最后保持一个迭代和闭环的思维用初步模型去处理真实数据分析错误案例反过来指导数据的补充采集和模型的改进如此循环才能让这个“深海之眼”看得越来越准。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻