✨ 长期致力于超声质量检测、递归分析、超声无损检测、深度学习、碳纤维复合材料研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
如需沟通交流,点击《获取方式


(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.')
    # 注:实际训练需要大量图像数据

更多推荐