✨ 长期致力于超声质量检测、递归分析、超声无损检测、深度学习、碳纤维复合材料研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(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.') # 注:实际训练需要大量图像数据