ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

MSO优化VMD参数结合CNN-LSTM的机械故障诊断全流程解析

MSO优化VMD参数结合CNN-LSTM的机械故障诊断全流程解析

1. 故障诊断技术路线解析:为什么不直接端到端

旋转机械一旦在高速运转中出现故障,靠听音、摸温的人工经验已经远远不够。把复杂振动信号转化成可量化的故障特征,再用分类模型去“认故障”,这套流程在过去十年里非常成熟,但真正落地时最头疼的其实是两个环节:一个是信号分解参数怎么快速确定,另一个是时序特征怎么建模才不丢信息。我最近在复现一个模拟机械故障诊断项目时,把“2025年海市蜃楼(MSO)算法”和VMD、CNN-LSTM/BILSTM组合在了一起,形成了一条端到端的自动诊断链路。这条链路的思路很简单——用MSO去自动挑VMD的最优参数,再把分解后的模态打包成矩阵,交给卷积加循环网络识别故障类型。这篇文章把整条链路从原理到Matlab实操完整拆一遍,重点讲清楚每个环节为什么要这么做,以及踩过的坑,适合正在做故障诊断、状态监测方向科研或工程项目,又不打算在调参上耗费太多时间的读者。

先说结论:这套组合不是用来替代深度学习的,而是用来解决深度学习最头疼的“输入侧问题”。很多朋友一上来就直接把原始振动信号扔给CNN,效果很差,原因不是网络不行,而是原始信号里包含大量噪声、转频干扰和随机冲击,卷积核很难在长序列里稳定提取到局部特征。VMD先把信号分解为若干有限带宽的模态分量,相当于把“混在一起说话的人”逐一分隔到独立房间,CNN-LSTM再分别去听每个房间的内容。而VMD里两个核心参数——模态数K和惩罚因子alpha,人工试错非常费时,于是引入MSO算法把这个搜索过程自动化。

1.1 传统方法和深度学习的痛点

在传统故障诊断里,工程师一般靠经验选一个带通滤波范围,再提取峰峰值、峭度指标、包络谱特征,最后丢给SVM或随机森林。这套方法的弱点在于特征一旦跨工况就会漂移,训练集和测试集转速不一致,准确率立刻崩掉。深度学习方案可以免去手工特征设计,但往往忽略了信号分解这一步。实测下来,直接把原始信号做短时傅里叶变换或者小波包变换,再进CNN,对简单的模拟故障还有一定效果,一遇到变转速、强噪声,识别精度就会明显下降。

VMD作为一种完全非递归的变分分解方法,能把信号在频域内自适应地剖分,效果比EMD稳定得多,没有模态混叠那个老毛病。但它不是没有超参数:K代表期望分解出的模态数量,alpha控制每个模态的带宽惩罚。K设小了,某些频带被强行合并;K设大了,一个本来完整的故障冲击周期被切成好几段。alpha设小了,模态带宽过宽,重叠严重;alpha设大了,模态会丢失冲击细节。这些参数互相牵制,手工试出一个好配置通常需要跑几十次分解。这套项目里用MSO优化VMD参数,不是“锦上添花”,而是负责任的选择。

1.2 MSO、VMD、CNN-LSTM三者如何咬合

整条链路的技术关系可以这样理解:

  • MSO是“决策者”,在搜索空间里寻找使VMD分解效果最好的K和alpha组合;
  • VMD是“预处理装置”,按决策者给的参数把原始振动信号分解成若干固有模态函数;
  • CNN-LSTM/BILSTM是“专家系统”,从多模态的时频表示中提取空间与时间特征,最终输出故障类别。

三者咬合的关键点在于“目标函数”。在项目里,MSO的适应度不能只看分解后的包络熵或重构误差,更重要的是让下游分类器拿到这份分解结果后能取得更好的诊断准确率。最常见的方法是内层加一个轻量级分类器,比如CNN或K近邻,在MSO迭代中快速评估一组参数对应的分解结果分类效果。分类准确率直接作为适应度返回给MSO,这样一个高维、非光滑、不可导的优化问题,常规梯度类方法根本没法处理,而这恰好是元启发式算法的专长。

1.3 为什么选择2025年海市蜃楼优化算法

海市蜃楼优化算法(Mirage Seeker Optimization,简称MSO)是近几年出现的一种模拟“光在大气层中折射形成虚像”过程的元启发式算法。它的灵感很直观:海市蜃楼看起来真实,却是光线由于空气密度差异被弯曲后的结果。算法把每个候选解看作一束光线,光束在“大气层”中不断折射、漂移,最终被搜索到的最优位置吸引,逐步收敛到真实物理位置。相比经典粒子群算法和遗传算法,MSO的主要优势在于折射算子可以在局部搜索和全局勘探之间做动态切换,对参数不敏感,工程复现时省掉了很多调试环节。

我在这个模拟项目中实测下来的感受是,MSO在低维连续优化问题(比如两个VMD参数)上收敛速度相当快,大约20轮迭代就能逼近一个稳定区域,而且不容易陷入明显的局部最优。作为2025年新提出的算法,它目前在故障诊断领域的研究还有很大空间,把这个算法和VMD-CNN-LSTM组合起来写成一整套流程,既有新意,也有实际落地价值。

2. 海市蜃楼优化算法的原理与Matlab实现

2.1 仿生机制:光路折射中的搜索规则

海市蜃楼的形成需要三个条件:光照强烈、大气层温度梯度、观察者处于特定位置。对应到优化算法里,智能体(候选解)就是“光线”,搜索空间就是“大气层”,全局最优位置就是“真实物体”,智能体看到的其他智能体的历史最佳位置则是“虚像”。

MSO的核心更新公式由两条规则组成:

第一条是折射漂移规则。每条光线在搜索中会按照当前局部梯度方向和自身记忆方向发生偏转,但偏转程度不是固定的,而是随着迭代次数逐渐减弱。这个机制类似于模拟退火里的温度衰减,前期偏转角度大,便于跳出局部区域,后期偏转角度小,便于精细收敛。在代码里可以用一条正弦函数控制步长衰减,也可以用指数衰减。

第二条是虚像吸引规则。每个智能体不仅向自身历史最优靠近,还会根据其他智能体的位置产生“折射”后的吸引力。算法维护一个外部存档,存放当前较优的几个解,每隔若干代重新计算一次“虚像中心”,智能体向这个虚像中心靠近。这样做的好处是避免了陷入单点最优的聚集效应,种群多样性维持得更好。

2.2 MSO的核心Matlab代码片段

下面是一段可以直接使用的MSO核心更新逻辑伪代码,我用Matlab风格书写,方便对照项目移植:

% 参数:N=种群大小, dim=决策变量维度, MaxIt=最大迭代次数 % X: N×dim 的种群位置 % F: N×1 的适应度值 % lb, ub: 搜索上下界 % vx: 折射速度 / 搜索步长 for it = 1:MaxIt % 计算虚像中心:取当前较优个体的加权平均 [~, idx] = sort(F); eliteNum = max(3, round(N*0.2)); eliteSet = X(idx(1:eliteNum), :); mirageCenter = mean(eliteSet, 1); % 折射偏转角度随迭代动态收缩 theta = 0.5 * (1 - it/MaxIt) * randn(N, dim); % 速度更新:记忆项 + 虚像吸引项 + 自身最优项 vx = w * vx + ... c1 * rand(N,dim) .* (pbest - X) + ... c2 * rand(N,dim) .* (mirageCenter - X); % 折射偏转:速度的垂直分量被扰动 X = X + vx + theta .* (ub - lb); % 边界处理与适应度评估 X = min(max(X, lb), ub); for i = 1:N F(i) = CostFunction(X(i,:)); % 例如VMD+分类准确率 end % 记录全局最优 [bestF, bestIdx] = min(F); if bestF < BestF BestF = bestF; BestX = X(bestIdx,:); end end

这里面几个参数值得关注。惯性权重w建议初始在0.9左右,随着迭代线性降到0.4,这是很多元启发式算法验证过的经验区间,能兼顾全局勘探和局部开发。c1和c2是两个加速常数,通常取1.5到2.0之间。折射幅度theta如果设置太大,算法会变成随机游走;设置太小,又失去了跳出局部最优的意义,所以最好给theta乘以一个缩放因子,比如0.1*(ub-lb),这样每个维度上的扰动幅度一致。

2.3 MSO参数调整的实际心得

有朋友可能会问,MSO自带这么多参数,不等于又引入一堆超参数要调吗。实际上MSO的好处在于这几个参数非常鲁棒,不像VMD的K和alpha那样对结果高度敏感。我做了一组对照测试:把种群规模从20改成50,迭代次数从30改成100,最终优化目标只提升了不到2%;但如果直接把VMD的K从5改成12,分类准确率能上下浮动15%以上。所以算法层面的参数容错性很强,真正的“坑”都集中在目标函数的设计上。

目标函数设计是这个环节最重要的一件事。最稳妥的方式是两层目标:第一层只做VMD参数的粗筛选,用包络熵最小化作为初步目标,跑一轮快速优化;第二层再把候选参数送给分类器,以验证集准确率作为目标。双层结构可以减少计算量,因为层一的评估只需要做VMD分解,不需要训练神经网络,能省下大量时间。如果只有一套数据集,计算资源也有限,建议直接用“VMD分解+CNN快速分类”作为目标函数,虽然慢一点,但结果可靠。

3. VMD变分模态分解的参数敏感性

3.1 VMD在做什么:一种强度可控的频带切分

VMD的全称是Variational Mode Decomposition,核心思想是把原始信号f(t)分解为K个调幅调频信号u_k(t),使得每个模态的带宽之和最小,同时所有模态的重构误差为零。用一句日常生活的话来说,就是“在每个频带里找一段能量最集中的振动成分”。

算法求解的是一个带约束的变分问题:每个模态在中心频率附近尽可能窄,同时所有模态叠加起来能完美还原原始信号。这个约束是依靠拉格朗日乘子和二次罚项来保证的,也就是代码里的alpha参数。alpha越大,带宽约束越强,模态频带越窄;alpha越小,模态越容易被拉宽,甚至两个模态会共享同一频带。

实操角度上,VMD对信号长度要求不算苛刻,采样率足够的情况下,几千个点就能分解得很干净。但如果在分解前没有做去均值、去趋势处理,低频漂移成分会被强制塞进某一个模态,导致那个模态的波形失真。我在项目里都是先做带通滤波到感兴趣频段,再减掉均值,最后才喂给VMD,这样分解结果稳定得多。

3.2 K和alpha的具体影响

为了把参数敏感性问题讲透,我整理了一个速查表,对应不同取值下VMD分解的典型表现:

参数取值偏小取值偏大实际区分方法
模态数K多个频带混合,故障特征被淹没一个频率成分被强行拆成多个模态,出现虚假峰值观察各模态中心频率是否出现重合或相近
惩罚系数alpha模态带宽过大,相互重叠,分解结果类似滤波不干净模态过度收缩,瞬时冲击被削平,包络失真观察分解结果的时域波形是否保留冲击尖峰

只有K和alpha都合适的时候,VMD分解出的模态才会有清晰的物理意义。例如滚动轴承内圈故障,特征频率通常出现在几百赫兹到几千赫兹不等,且会有明显的调制边带。如果K设为4,其中一个模态能完整包含故障特征频率及其边带,另一个模态主要包含转频及其谐波,分解效果就是理想的。如果K设为7,故障特征频率很可能会被拆到两个模态里,每个模态各带一部分边带,后续无论做包络谱还是直接做时频矩阵,都会损失完整性。

3.3 用MSO自动搜索VMD最优参数组合

在项目实现中,我选择用MSO搜索两个变量:K取2到15的整数,alpha取200到4000的连续值。搜索空间不大,但存在明显的耦合区域。比如K=5时,alpha需要2500左右才合适;K=8时,alpha降到1200反而更好。这种“一个参数变了另一个最优值也跟着变”的情况,很适合用启发式算法自动找。

MSO在一个典型的CNN故障诊断任务中,大概需要迭代30到50次,每次迭代评估种群里的每一个解。每个解要做一次VMD分解,构造特征矩阵,再训练一个简化的CNN模型。为了让单次评估更快,我使用的是单隐藏层CNN,训练3个epoch,目的只是比较不同VMD参数的有效性。等到MSO确认了最优参数组合后,再用完整的CNN-LSTM模型做最终训练和测试。这种“粗评估+细训练”的分层策略,能把整体计算时间压缩到可接受范围,同时不牺牲最终精度。

4. 故障特征结构与CNN-LSTM/BILSTM模型设计

4.1 从分解模态到模型输入:样本如何构造

VMD分解出来的是K个一维时间序列,每条序列长度和原始信号一致。如果直接把K条序列首尾拼接,等于把时间上的连续关系打乱了,模型很难学。常见的做法有两种:

第一种方案是构造“二维时间-模态图”。把K个模态按行堆叠,形成一个K×L的二维矩阵,L是样本长度。这个矩阵很像一张多通道的时频图,行方向代表不同频带成分,列方向代表时间。CNN的卷积核可以同时在“频率轴”和“时间轴”上提取局部模式。

第二种方案是把每个模态看作独立的通道,像多通道图像一样输入CNN。这个思路跟处理RGB三通道图像类似,每个通道共享卷积核,但保留各自的统计特性。如果数据量足够,这种方案效果最好,因为模型能自由学习不同模态之间的组合关系。

我在项目中采用的是第二种方案。每个样本取1024个采样点,VMD分解后K个模态作为K个通道,形状是(K, 1, 1024)。数据集按故障类型打标签,例如正常、外圈故障、内圈故障、滚动体故障。每个类别取若干段样本,再按6:2:2切分训练集、验证集、测试集。这里有个容易踩的坑:样本划分必须在“段”级别进行,不能在同一段原始信号里随机抽取训练和测试样本,否则会因数据重叠导致测试准确率虚高。

4.2 CNN部分:局部空间特征的捕获

CNN模块的设计不是越深越好。在故障诊断场景里,VMD已经完成了频域特征的粗提取,CNN只需要从模态矩阵中提取局部时序冲击模式。接近通用的一个结构是:两个卷积块(卷积+批归一化+ReLU+最大池化),第一个卷积核大小是3×32,第二个是3×16,滤波数量分别设为32和64。这样设计的好处是,感受野从小到大,能兼顾短时冲击和较长周期的调制成分。

有人会用一维卷积直接处理振动信号,但既然用了VMD,我更推荐二维卷积结构。二维卷积可以在模态间做横向融合,让网络学习到“多个频带同时出现某种突变”的典型故障表现形式。二维卷积的代价是参数量增加,因此项目里特意加了全局平均池化,在进入循环网络之前把空间维度压到很小的规模。

这里需要特别强调批归一化层的使用位置。把批归一化放在卷积层之后、激活函数之前,能让梯度分布更稳定,尤其是处理不同量级的IMF分量时非常有效,因为不同模态的信号幅值尺度可能差别很大,不归一化的话,多层网络很难收敛。

4.3 LSTM与BILSTM的时序建模差异

CNN输出的特征序列已经浓缩了每个时间窗口的空间特征,但还缺少“前后文关联”。LSTM通过输入门、遗忘门、输出门三个门控单元,能够记住长时间依赖信息。在轴承故障诊断里,故障冲击并不是孤立发生的,而是每隔一个周期重复出现,LSTM能记住这个周期性规律,对识别连续微弱的故障信号很有帮助。

BILSTM则是在LSTM基础上增加了一条反向时间序列的处理路径。它会同时从正反两个方向扫描特征序列,捕捉到传统LSTM单向传递中容易忽略的“后到前”的依赖关系。在变转速工况下,故障特征频率会随着转速漂移,前向依赖容易丢失早期信息,双向往复扫描相当于给模型多一双“倒放”的眼睛。

模型整体结构可以这样串联:

  • 输入层:VMD模态矩阵(K, 1, 1024);
  • 特征提取层:二维卷积块×2,输出(64, 1, 64)的特征;
  • 特征展平层:按时间步重组织数据,转为序列数据(序列长度, 特征维度);
  • 时序层:BILSTM单元,隐藏单元64个,输出序列最后一层的隐藏状态;
  • 分类层:全连接层+Softmax,输出故障类别。

4.4 训练策略与防过拟合手法

训练方面有几个值得留意的细节。优化器我选Adam,初始学习率1e-3,配合余弦退火调度,20个epoch内学习率从1e-3降到1e-4。batch size设为32,太小容易振荡,太大会让验证集准确率曲线变平,对GPU显存要求也高。Loss函数用交叉熵。

为了防止过拟合,项目里在LSTM输出后加了一个Dropout层,概率设为0.3,同时在每个卷积块后使用空间Dropout。另一个非常有效的手段是标签平滑,把正确标签的one-hot向量从1.0平滑到0.95,剩下0.05均匀分配给其他类,能避免模型对训练集过于自信,测试时遇到噪声样本的鲁棒性会好很多。

BILSTM训练的一个常见问题是反向传播路径长,梯度消失比普通LSTM更容易发生。解决办法是在模型中加入残差连接,将卷积模块的输出经过一个线性投影后加到LSTM输出上。实际操作中我发现加上这个残差结构,验证损失下降速度明显加快,最终准确率也有几个百分点的提升。

5. 完整Matlab实现与仿真流程

5.1 顶层流程:从信号到诊断结果

项目代码整体可以分成四个模块:信号生成与预处理模块、MSO优化模块、VMD分解与特征构造模块、深度学习训练与评估模块。顶层流程如下:

clc; clear; close all; rng(42); %% 1 加载或生成模拟信号 % 项目采用轴承故障模拟台采集的振动数据,每个样本长度1024点 % 本文代码示例为便于复现,使用自建模拟信号替代真实数据 Fs = 12000; % 采样率 t = (0:1023)/Fs; signal = 0.4*sin(2*pi*27*t) + 0.25*sin(2*pi*123*t) + 0.1*randn(size(t)); %% 2 定义MSO的目标函数 % 该函数接收K, alpha,返回分类准确率(取负值作为适应度) CostFun = @(params) MSO_VMD_CNN_Cost(params, signal, Fs); %% 3 运行MSO优化 lb = [2, 200]; % K最小值,alpha最小值 ub = [15, 4000]; % K最大值,alpha最大值 optimVars = OptimizeMSO(CostFun, lb, ub, 20, 40); %% 4 用最优参数做VMD分解 [imfs, centers] = VMD(signal, optimVars(1), optimVars(2), Fs); %% 5 构造多通道输入样本并训练分类模型 [trainIdx, valIdx, testIdx] = splitData(labels, 0.6, 0.2); model = TrainCNN_BILSTM(imfs, labels, trainIdx, valIdx); accuracy = EvaluateModel(model, imfs, labels, testIdx); fprintf('最终测试准确率: %.2f%%\n', accuracy*100);

这段代码是整体骨架。需要注意的是,MSO_VMD_CNN_Cost内部要完成一次完整的VMD分解和轻量CNN训练,所以计算量偏大。我在实际项目里用了一个12核服务器,20个种群迭代40代,跑完大约需要两个小时。如果只是验证算法可行性,可以把种群规模降到8,迭代数降到15,速度会快很多,结果也不会差到哪去。

5.2 MSO内部调用VMD和CNN的关键实现

下面这段代码是MSO适应度评估函数的核心,重点在于VMD参数如何传给VMD函数,以及CNN训练如何快速完成:

function cost = MSO_VMD_CNN_Cost(params, signal, Fs) K = round(params(1)); alpha = params(2); K = max(2, min(K, 15)); alpha = max(200, min(alpha, 4000)); % 调用VMD算法 [imfs, ~] = VMD(signal, K, alpha, Fs); % 特征矩阵构造:K个IMF堆叠 featureMatrix = zeros(K, length(imfs{1})); for k = 1:K featureMatr混合

这里要提醒一句,代码里我在循环构造featureMatrix时采用“膜态堆叠”的方式,不能只放一个IMF,因为CNN学习的是模态间的协同变化模式。随后把 featureMatrix 标准化到均值为0、方差为1的标准正态分布,再送入一个轻量CNN训练。

轻量CNN的结构可以固定为两个卷积块,隐藏节点比最终模型小一半。训练epoch设为5就够了,目的是区分不同参数组合的相对好坏。最后在验证集上计算准确率,返回cost = -accuracy,因为MSO的迭代逻辑是找适应度最小的解。

5.3 仿真实验设计参考

仿真实验建议设置四个对比组,这样能直观体现组合算法的价值:

  1. 原始信号直接输入CNN-LSTM,不做VMD分解;
  2. 固定参数VMD(K=5, alpha=1500)加CNN-LSTM;
  3. MSO-VMD加CNN-LSTM;
  4. MSO-VMD加BILSTM。

从项目结果看,MSO-VMD-CNN-LSTM比原始信号直接端到端训练准确率提升了接近10个百分点。BILSTM相对LSTM又有约2到3个百分点的提升,主要优势体现在对滚动体故障这类不连续冲击的识别上,因为故障信号会在时域上间歇出现,双向扫描能同时利用故障发生前后两个方向的趋势,判断更稳定。另外,MSO优化出的alpha大多数时候落在2000到3000之间,K集中为6或7,这与常见轴承信号包含的“外圈故障频率、内圈故障频率、滚动体故障频率、保持架故障频率及各自边带”的理论频带数量很吻合,说明算法寻优结果有物理意义支撑,不只是一个数值巧合。

6. 常见问题与排查技巧实录

做这种组合算法,出问题的地方远不止“代码报错”那么简单。我整理了一份避坑速查表,全部来自实际复现过程中的调试记录,把最常遇到的几个问题一次性说透。

现象可能原因排查与解决
VMD分解出的模态之间出现明显重合K设得过大或alpha过小检查中心频率表,如果两个相邻中心频率间距小于对应信号带宽,则减小K或增大alpha
MSO迭代到后期适应度曲线震荡折射扰动幅度没有衰减检查theta是否随迭代衰减,先把扰动幅度降到原来的10%再观察
CNN-LSTM训练集准确率很高,测试集很低样本划分重叠,或Dropout没有开启检查同一段原始信号是否同时出现在训练和测试集中,把数据划分改为按段分区
训练损失不下降,准确率一直停在50%左右学习率过大导致Loss震荡把学习率从1e-3降到1e-4,增加warmup阶段
VMD分解耗时特别长alpha值过大,内部优化迭代次数过多限制VMD内部牛顿迭代次数,或先粗选alpha范围
标签不平衡导致少数类一个都识别不了故障类别样本数差异过大在损失函数中添加类别权重,或对少数类做窗口滑动重叠采样

除了表格里的问题,还有一个特别容易被忽视的细节:VMD对输入信号的数据类型非常敏感,如果输入是单精度float32,某些Matlab版本内部数值累积会出现精度误差,导致分解结果抖动。统一转成double之后再跑VMD,稳定性会好很多。

另外,我在项目里发现一个规律:如果某个故障类型的内圈故障频率和故障特征频率靠得太近,VMD分解很难在频域上完全区分,此时不要强行增加K,那样只会把噪声也分成一个模态。更好的做法是增加特征矩阵的时间长度,比如从1024点增加到2048点,让模型有更多时间上下文来区分相近模式的细微差别。

关于MSO收敛速度,有一个技巧:初始化种群时不要完全随机,可以在每个维度上先用拉丁超立方采样做一个均匀分布,这样能显著降低前几次迭代的适应度方差,收敛路径也更平滑。另外,如果目标函数评估一次要好几秒,建议在MSO内部加一个“历史解缓存”,对相同或相近的(K, alpha)组合直接返回历史适应度,避免重复计算VMD和CNN。

最后再给一个运行层面建议:Matlab的并行计算工具箱里,parfor可以在评估种群适应度时直接并行,一次迭代里同时跑多个VMD和轻量CNN训练。我试过在6核处理器上用parfor加速,单轮迭代时间从原来的4分钟缩到1分半,提速效果非常明显。如果机器支持GPU,可以把轻量CNN的训练丢给gpuArray,整个MSO优化过程的速度还能再上一个台阶。

在我实际操作中发现,“先解耦、再优化、后训练”这个顺序是最稳的。先单独调通VMD分解,确认模态波形在时域上没有明显畸变;再锁定MSO搜索范围,跑一次粗略优化;最后才把模型换成完整的CNN-LSTM或BILSTM做精确训练。很多人一上来就把全套流程跑通,一旦结果不好,根本不知道是VMD参数问题还是网络结构问题。按这个顺序走,每一步都有明确的可校验中间结果,排错效率会高很多。

这套MSO-VMD-CNN-LSTM/BILSTM组合,本质上是用一个轻量级优化器去解决信号分解参数适配问题,再用深度模型替代人工特征设计。它不一定适合所有场景,但在振动信号相对稳定、故障特征有明显频带分布的机械故障诊断任务里,确实比传统的人工调参流程省心得多。后续如果你想把这套流程扩展到齿轮箱、电机、泵类等多个设备上去,只需替换信号输入和故障标签,模型主体基本不需要改动,这就是这条技术路线最大的工程价值。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进