一维残差网络水下超声无损检测与缺陷识别【附代码】
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1EWT-FastICA联合降噪与有效IMF分量筛选机制水下超声A扫描信号首先经过经验小波变换EWT分解为6个本征模态分量IMF。根据频谱支持划分利用尺度空间方法自动检测分界频率构建自适应小波滤波器组。针对EWT可能产生的无效频带分割设计自相关函数主导指数ACRI筛选器计算每个IMF的自相关函数若第一侧峰与主峰比值大于0.35且包络熵低于阈值2.8则判定为有效信号分量否则归入噪声分量。保留的有效IMF送入快速独立分量分析FastICA进行盲源分离为了克服输出幅值不确定性提出基于RMS幅值归一化与线性最小二乘幅值恢复两步法使分离后的信号幅值与原信号能量匹配。仿真设置不同缺陷回波信号叠加高斯白噪声及水下混响SNR从初始5dB提升至18.3dB较单独EWT降噪再提升4.2dB。对比传统小波阈值降噪EWT-FastICA能够更完整地保留超声脉冲的起跳点特征时域相关系数达到0.94为后续缺陷分类提供了高保真信号。2ECA-ResNet1D缺陷分类网络设计与通道注意力强化构建一维残差网络输入为预处理后长度2048点的单通道时间序列信号。网络包含3个残差块每个块由两个卷积层和批量归一化层组成卷积核大小分别为7、5、3通道数依次为64、128、256。残差连接后叠加有效通道注意力模块ECAECA通过一维卷积实现局部跨通道交互卷积核尺寸根据通道数自适应确定为5。ECA模块在全局平均池化后不降维生成通道权重增强对缺陷敏感的特征通道。尾部经全局最大池化后全连接层输出4类气孔、夹渣、未熔合、无缺陷。在有限元仿真生成的数据集上进行训练数据集包含四种缺陷各800个样本添加不同噪声级。ECA-ResNet1D的测试准确率达到97.1%较普通ResNet1D的94.2%提高2.9个百分点尤其在气孔和夹渣在形态相似时ECA机制使两类F1分数分别从0.89和0.90提升至0.94和0.93识别混淆度明显降低。3水下超声检测系统搭建与端到端验证实验搭建以Olympus 5072PR脉冲发生接收器、5MHz水浸聚焦探头为核心的水槽实验系统对含有预制缺陷的不锈钢标准试块进行扫查采集。由于仪器限制真实采集数据仅用于定性参考通过PZFlex有限元软件建立三维水下超声传播模型模拟不同尺寸和深度的内部缺陷获得含噪A扫描信号2800条构成标准数据集。将数据先经EWT-FastICA降噪再输入ECA-ResNet1D模型整体检测准确率96.3%气孔缺陷的召回率95.8%基本满足工程检测需求。进一步对实际水槽实验采集的40组真实缺陷信号进行测试经降噪和分类后识别正确37组准确率92.5%其中一处直径0.8mm微小气孔被漏判后续通过调整ECA权重训练得以纠正。实验证明所提一维残差网络与降噪方法的组合在水下超声无损检测中具有良好潜力。import numpy as np import pywt from scipy.signal import hilbert, correlate from sklearn.decomposition import FastICA # EWT 分解模拟 def ewt_decompose(signal, N6): # 简化用带通滤波器组近似 fs 50e6; f np.fft.fftfreq(len(signal), 1/fs) imfs [] for i in range(N): low (i) * fs/2/N; high (i1)*fs/2/N mask (np.abs(f) low) (np.abs(f) high) spec np.fft.fft(signal) * mask imf np.real(np.fft.ifft(spec)) imfs.append(imf) return imfs # ACRI筛选 def acri_filter(imfs): valid [] for imf in imfs: corr correlate(imf, imf, modefull) corr corr[len(corr)//2:] if corr[1]0.35*corr[0] and np.std(imf)2.8: valid.append(imf) return np.array(valid) # ECA 模块PyTorch 伪代码 import torch import torch.nn as nn class ECALayer1D(nn.Module): def __init__(self, channels, k_size5): super().__init__() self.avg_pool nn.AdaptiveAvgPool1d(1) self.conv nn.Conv1d(1,1, kernel_sizek_size, padding(k_size-1)//2, biasFalse) self.sigmoid nn.Sigmoid() def forward(self, x): y self.avg_pool(x) # (B,C,1) y y.squeeze(-1).unsqueeze(1) # (B,1,C) y self.conv(y) y self.sigmoid(y).unsqueeze(-1) return x * y # ResNet1D 块 class ResBlock1D(nn.Module): def __init__(self, in_ch, out_ch, ksize): super().__init__() self.conv1 nn.Conv1d(in_ch, out_ch, ksize, paddingsame) self.bn1 nn.BatchNorm1d(out_ch) self.conv2 nn.Conv1d(out_ch, out_ch, ksize, paddingsame) self.bn2 nn.BatchNorm1d(out_ch) self.eca ECALayer1D(out_ch) self.downsample nn.Conv1d(in_ch, out_ch, 1) if in_ch ! out_ch else nn.Identity() def forward(self, x): residual self.downsample(x) out torch.relu(self.bn1(self.conv1(x))) out self.bn2(self.conv2(out)) out self.eca(out) out residual return torch.relu(out) # 主程序示例 if __name__ __main__: np.random.seed(0) t np.linspace(0, 10e-6, 2048) signal np.sin(2*np.pi*5e6*t) * np.exp(-((t-5e-6)/1e-6)**2) np.random.randn(2048)*0.3 imfs ewt_decompose(signal, N4) valid_imfs acri_filter(imfs) ica FastICA(n_components1) if valid_imfs.shape[0]1 else None if ica: denoised ica.fit_transform(valid_imfs.T).flatten() print(降噪后信号长度:, len(denoised)) else: print(有效分量不足)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2601876.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!