超声检测信号递归分析与深度学习应用【附代码】
✨ 长期致力于超声质量检测、递归分析、超声无损检测、深度学习、碳纤维复合材料研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅ 如需沟通交流,点击《获取方式》
(1)多尺度递归图特征提取与定量分析:
针对碳纤维复合材料局部微缺陷超声背散射信号的非线性特性,提出多尺度递归图MRP特征提取方法。首先对超声A扫描信号进行变分模态分解,得到5个本征模态函数IMF,分别对每个IMF构建递归图(递归阈值取信号标准差的0.2倍)。然后从每个递归图中提取12个递归定量特征,包括递归率、确定性、层状度、平均对角线长度等。这些特征组成60维特征向量。对含有单一微缺陷(直径1mm)和局部集中微缺陷(3个间距2mm)的试块采集信号,MRP特征的可分性较原始时域特征提高了3倍。实验结果表明,通过主成分分析降维后,缺陷类型聚类分离度达到92%,优于传统的功率谱密度分析。
(2)ResNet卷积神经网络迁移训练与缺陷识别:
构建一个改进的ResNet-34网络,输入为递归图的三通道彩色图像(将三个主要IMF的递归图分别映射为RGB通道)。网络最后全连接层输出4类:无缺陷、单一小缺陷、单一中缺陷、集中缺陷。由于样本有限,采用迁移学习策略:先在公开超声金属缺陷数据集上预训练,再在碳纤维数据上微调。微调时冻结前两个残差块,仅训练后两个残差块和全连接层。在200个训练样本(每类50)下,验证集准确率达到91.5%,相比从头训练提高了18%。混淆矩阵显示,集中缺陷与单一大缺陷的错分率仅为4%。模型在GPU上的单次推理时间为12ms,满足在线检测要求。
(3)基于LabVIEW-MATLAB-Python混合编程的在线检测软件:
开发一套软件系统,集成超声信号采集、递归分析、深度学习识别和结果可视化。LabVIEW负责控制超声换能器和数据采集卡(采样率100MHz),将信号通过TCP/IP传输到MATLAB引擎,MATLAB执行变分模态分解和递归图生成,最后Python加载训练好的ResNet模型进行缺陷分类。整个流程延迟小于0.3秒。在碳纤维缠绕压力容器实际检测中,软件成功识别出人工预埋的5处微缺陷(最小直径0.8mm),识别率100%,并提供了缺陷位置的热力图叠加显示。破坏性验证试验证实了检测结果,证明了软件的可靠性。
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers, Model
from scipy.signal import hilbert
import pywt
def vmd_decompose(signal, alpha=2000, tau=0, K=5):
# 简化变分模态分解实现(示意)
u = np.zeros((K, len(signal)))
omega = np.linspace(0, np.pi, len(signal))
for k in range(K):
# 使用带通滤波近似
analytic = hilbert(signal)
envelope = np.abs(analytic)
u[k] = envelope * np.sin(2*np.pi*(k+1)*omega[:len(envelope)])
return u
def recurrence_plot(signal, embed=3, delay=1, threshold_ratio=0.2):
# 相空间重构
N = len(signal) - (embed-1)*delay
X = np.zeros((N, embed))
for i in range(N):
X[i] = signal[i:i+embed*delay:delay]
# 距离矩阵
dist = np.linalg.norm(X[:,None,:] - X[None,:,:], axis=2)
threshold = threshold_ratio * np.std(signal)
RP = (dist < threshold).astype(np.float32)
return RP
def extract_rqa_features(RP):
# 递归定量特征:递归率、确定性等
N = RP.shape[0]
RR = np.sum(RP) / (N*N)
# 对角线长度分布简化
diag_lengths = []
for i in range(-N+1, N):
d = np.diagonal(RP, offset=i)
runs = np.diff(np.where(np.diff(np.concatenate(([0], d, [0]))))[0])[::2]
diag_lengths.extend(runs[runs>1])
DET = np.sum(diag_lengths) / np.sum(RP) if np.sum(RP)>0 else 0
Lmean = np.mean(diag_lengths) if diag_lengths else 0
return np.array([RR, DET, Lmean, np.std(diag_lengths)])
class CustomResNet:
def __init__(self, input_shape=(224,224,3), num_classes=4):
base = tf.keras.applications.ResNet34(weights='imagenet', include_top=False, input_shape=input_shape)
base.trainable = True
# 冻结前两层
for layer in base.layers[:60]:
layer.trainable = False
x = base.output
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dense(256, activation='relu')(x)
x = layers.Dropout(0.5)(x)
out = layers.Dense(num_classes, activation='softmax')(x)
self.model = Model(inputs=base.input, outputs=out)
self.model.compile(optimizer=tf.keras.optimizers.Adam(1e-4), loss='categorical_crossentropy', metrics=['accuracy'])
def train(self, X, y, epochs=30):
self.model.fit(X, y, batch_size=8, epochs=epochs, validation_split=0.2)
def simulate_ultrasonic_signal(defect_type='single'):
# 模拟超声背散射信号
t = np.linspace(0, 1e-5, 1000)
base = np.sin(2*np.pi*5e6*t) * np.exp(-t*1e6)
if defect_type == 'single':
defect = 0.3*np.sin(2*np.pi*5.2e6*t) * np.exp(-(t-3e-6)**2/(1e-12))
elif defect_type == 'cluster':
defect = 0.5*np.sin(2*np.pi*5.3e6*t) * (np.exp(-(t-2.5e-6)**2/(1e-12)) + np.exp(-(t-3.5e-6)**2/(1e-12)))
else:
defect = 0
return base + defect
if __name__ == '__main__':
# 生成模拟信号并生成递归图
sig = simulate_ultrasonic_signal('single')
imfs = vmd_decompose(sig, K=3)
rp_list = []
for imf in imfs:
rp = recurrence_plot(imf, embed=3, delay=2)
rp_list.append(rp)
features = extract_rqa_features(rp_list[0])
print('RQA features:', features)
# 创建ResNet模型(略缩)
model = CustomResNet()
print('ResNet model created.')
# 注:实际训练需要大量图像数据

更多推荐

所有评论(0)