做工业视觉算法这几年发电机组检测识别是我觉得特别有代表性的一个场景。它不像行人、车辆那么“标准”设备本身结构复杂部件互相遮挡再加上现场光照、反光、油污背景很多在公开数据集上表现不错的模型拿过来一测往往就露馅。这个项目就是在这个背景下推进的以 YOLOv8 为基线引入 LSCD 特征增强模块和 LQE 质量感知损失机制专门针对“局部纹理密集、全局结构显著”的工业设备目标做检测优化。文本主要记录这个项目从设计思路、模块实现、训练调试到部署落地的一些实战经验适合正在做工业检测算法、或者想在 YOLO 结构上做针对性改进的朋友参考。1. 项目背景与核心痛点1.1 发电机组检测的典型场景发电机组检测和常规目标检测有个很大的区别它的检测对象不只是“有没有一台机器”而是要在复杂的现场环境中把设备区域、核心部件甚至局部状态都框出来。实际项目里最常见的几类需求电厂或者机房的远程巡检通过固定摄像头自动判断设备是否在画面范围内、是否被遮挡。无人机或者轨道机器人巡检需要在不同高度下识别机组本体、散热器、控制柜、管道接口。工厂安全监控中检测非作业人员是否异常接近运行中的机组区域。这些场景带来一个共同的难点同一台机组在不同机位、不同焦距下尺度差异非常大。远景能看到整台机组的轮廓近景只能看到某个阀门或者焊缝的局部纹理。与此同时厂房里管道、支架、线缆密布背景噪点极多检测模型很容易把结构相似的管道接口误判成设备部件。我们在项目初期拿通用检测模型直接跑了一轮结果典型问题就两类一是场景变大或者变小之后漏检率明显上升尤其是机组细长结构的两端经常只框出一半二是局部特写时模型过度关注纹理细节把许多背景误判成目标区域。这两个现象背后本质上是模型对“全局结构”和“局部细节”的平衡能力不够。1.2 为什么选择 YOLOv8 作为基线技术选型时我们认真对比过几条路线二阶段检测器如 Faster R-CNN精度高但在部署和实时性上不占优势工业巡检摄像头常有并发推流需求。Anchor-Free 单阶段检测器YOLOv8 等速度、精度、部署生态综合最平衡。基于 Transformer 的检测器如 RT-DETR精度有潜力但推理框架适配和训练收敛稳定性在项目初期风险偏大。最终选 YOLOv8 的核心原因其实很实际它的 Backbone 和 Neck 结构可扩展性强C2f 模块和 PAN-FPN 结构都比较规范我们可以在不破坏整体训练流程的情况下做局部模块替换同时 ONNX、TensorRT 等部署链路已经非常成熟客户现场要求快速交付时踩坑成本低很多。另外选择 YOLOv8 而不是当时更新的 YOLO 系列变体还有一个考虑YOLOv8 的损失函数DFL CIOU和标签分配策略TaskAlignedAssigner相对清晰后续如果要改损失机制可控性强。我们后面加 LQE 损失时只改动了一部分训练流程没有动整体数据流就是这个原因。1.3 两个改进点的整体定位这个项目里的两个核心改进点定位非常明确LSCDLightweight Selective Context Decoupling轻量级选择性上下文解耦模块负责特征表达层面的优化。它让网络在提取特征时能够根据目标区域的具体特点动态平衡“全局上下文信息”和“局部细节信息”解决机组设备在不同尺度、不同遮挡程度下特征表达不稳定的问题。LQELocation-aware Quality Enhancement位置感知质量增强损失负责预测质量层面的优化。它加强定位质量与分类置信度之间的关联让模型在判断“这是什么”的同时更准确地知道“框得准不准”抑制高分误检和低分漏检问题。一句话总结这两个改进的分工LSCD 管特征“看得全不全、细不细”LQE 管输出“判得准不准、稳不稳”。实际实验下来两者单独加都有收益叠加之后效果最明显。2. LSCD 模块设计思路与实现2.1 发电机组特征的特殊性在设计 LSCD 之前我先花了不少时间观察发电机组目标本身的结构特点。这类设备不像自然场景中的行人车辆有很强的类别共性它的核心特征是局部区域纹理非常丰富比如散热格栅、螺栓连接面、控制面板按钮这些细碎纹理对识别很有帮助但只靠局部纹理又不够因为很多背景物体比如管道法兰、电缆桥架纹理和它非常接近必须结合整体轮廓、几何关系才能判断这是机组的一部分。也就是说模型在识别发电机组时需要在“看细节”和“看整体”之间不断切换。普通卷积网络的问题在于深层的特征图虽然有较大的感受野但分辨率低细节损失严重浅层特征图分辨率高、细节丰富但感受野有限无法感知全局结构。常规 FPN 结构虽然做了多尺度融合可融合方式相对固定无法根据输入内容动态调整。LSCD 想解决的问题就是让特征融合过程具备“选择性”不同区域、不同尺度下模型能自适应决定更依赖全局上下文还是局部细节。2.2 LSCD 模块的结构LSCD 的整体结构可以理解为一个三分支的残差模块第一是全局上下文分支使用大卷积核的深度卷积来快速扩大感受野。常规做法是用 7x7 或者 9x9 深度卷积保证参数开销可控的同时让每个位置的输出能聚合更大范围的上下文信息。大核深度卷积在这里替代了多层小卷积堆叠原因是机组这类目标的全局轮廓比如细长的机体、圆形的散热器需要大范围结构信息而小卷积需要堆很多层才能达到同等感受野计算效率上不划算。第二是局部细节分支使用 3x3 深度卷积配合 1x1 卷积保留高分辨率下的局部纹理特征。这一步相当于把浅层细节信息通过残差方式送到后续层避免深层网络只关注“是什么类别”而丢掉“边界在哪”的细节线索。第三是选择权重生成分支这是 LSCD 的核心。它通过全局平均池化获得通道维度上的全局描述再用一个轻量的全连接层生成两个权重系数分别对全局上下文分支和局部细节分支的输出做加权。这里的逻辑是不是所有目标、所有位置都需要同等程度的全局信息和细节信息。对于一个完整的机组远视图全局上下文更重要对于局部阀门的特写细节信息更重要。让模型自己决定权重比固定拼接或者固定相加更灵活。代码实现上LSCD 可以作为一个独立模块放进网络实现参考如下import torch import torch.nn as nn class LSCD(nn.Module): def __init__(self, in_channels, out_channelsNone, kernel_size7): super().__init__() out_channels out_channels or in_channels # 全局上下文分支大核深度卷积 self.context_branch nn.Sequential( nn.Conv2d(in_channels, in_channels, kernel_sizekernel_size, paddingkernel_size // 2, groupsin_channels), nn.Conv2d(in_channels, out_channels, kernel_size1) ) # 局部细节分支小核深度卷积 self.local_branch nn.Sequential( nn.Conv2d(in_channels, in_channels, kernel_size3, padding1, groupsin_channels), nn.Conv2d(in_channels, out_channels, kernel_size1) ) # 权重生成 self.gap nn.AdaptiveAvgPool2d(1) self.fc nn.Sequential( nn.Linear(in_channels, max(in_channels // 4, 8)), nn.ReLU(inplaceTrue), nn.Linear(max(in_channels // 4, 8), 2), nn.Softmax(dim1) ) self.act nn.SiLU(inplaceTrue) def forward(self, x): ctx self.context_branch(x) local self.local_branch(x) # 生成选择权重 weight self.fc(self.gap(x).squeeze(-1).squeeze(-1)) alpha weight[:, 0].view(-1, 1, 1, 1) beta weight[:, 1].view(-1, 1, 1, 1) out x alpha * ctx beta * local return self.act(out)这里有几个设计细节值得说明两个分支都用深度卷积groupsin_channels目的是控制参数和计算量。如果两个分支都用普通卷积模块的参数量会成倍增加叠加到多个特征层之后训练和部署压力都会变大。权重生成分支用的全连接层非常轻量对整体推理速度影响很小。这一点在工业项目里很重要——客户现场往往对识别帧率有硬性要求。残差连接out x ...保证了信息不丢失也让训练初期模块输出的分布不会偏离原特征太远稳定性更好。2.3 LSCD 嵌入位置选择模块设计好之后放在哪里也有讲究。我们实验了三种位置第一只给 Backbone 最后一层加 LSCD。效果有提升但有限原因是 High-level 特征图分辨率太低LSCD 对大尺度上下文的建模能力发挥不出来对小目标的帮助也不够。第二在 Neck 的所有尺度的特征图上都加 LSCD。提升最明显但计算量也最大在边缘设备上有点吃力。第三折中方案在 Neck 的 P3、P4、P5 三层特征图后增加 LSCD但 P3 层使用较小的卷积核5x5P5 层使用较大的卷积核9x9。这样既控制了计算量也让每个尺度能根据自己的需求侧重不同的感受野。我们最后采用的是折中方案。修改 YOLOv8 配置文件时在 head 部分的 C2f 之后插入 LSCD 层即可示意如下head: - [-1, 1, Conv, 128, 3, 2] - [-1, 1, LSCD, [128, 5]] - [-1, 1, Conv, 256, 3, 2] - [-1, 1, LSCD, [256, 7]] - [-1, 1, Conv, 512, 3, 2] - [-1, 1, LSCD, [512, 9]]实际测试中只加 LSCD 这一项在自建数据集上 mAP50-95 提升了约 2.1 个点这个提升幅度在工业检测项目里已经非常明显。更重要的是原来那种“远景漏掉机组两端、近景误检管道”的问题明显减少。3. LQE 损失机制的优化实践3.1 分类置信度与定位质量的错位问题YOLOv8 默认的训练策略里分类分支输出的是“这个位置有目标的概率”回归分支输出的是框的位置。推理阶段最终保留哪些检测框很大程度上依赖分类置信度排序同时用 NMS 去掉重叠框。这里有个容易被忽略的问题分类置信度高不代表这个框定位得准。实际场景很常见——某个预测框把机组的散热器连同旁边的管道一起包进去了分类置信度可能有 0.91但框的 IoU 其实只有 0.55。另一个预测框边界贴合得很好置信度却只有 0.68。如果直接按置信度排序定位更差的框反而排在前面影响后续决策。在发电机组这类工业目标上这个问题会被放大。因为机组部件之间的边界并不像人、车那样清晰很多框的边界落在“似乎对又不太对”的模糊区域。客户现场如果拿着这种框去做区域判定或者遮蔽检测很容易出现误判。3.2 LQE 的实现方式LQE 的思路借鉴了“分类分数与 IoU 对齐”的思想做法上做了两点调整第一引入IoU 感知质量标签。训练时不再把分类标签简单地设置为 0 或者 1而是用预测框与真实框的 IoU 作为质量权重。也就是说如果一个预测框与真实框的 IoU 只有 0.6它的分类目标不是一个生硬的 0而是接近 0.6 的软标签。模型在训练中就会明白框得不准的时候分类置信度不应该盲目给高。第二增加一个LQE 辅助回归项。在原始损失函数中显式加入一项让预测的分类置信度与当前预测框的定位质量尽量一致。训练时我们用预测框与目标真实框之间的 IoU 值作为监督信号同时施加梯度如果预测分数很高但 IoU 很低这部分预测会收到额外惩罚。简化后的损失计算逻辑如下def lqe_loss(pred_scores, pred_boxes, target_boxes, target_scores): # 计算预测框与目标框的 IoU iou bbox_iou(pred_boxes, target_boxes, CIoUTrue, eps1e-7) # 生成 IoU 感知的质量目标 quality_target target_scores * iou.detach() # 分类分数与定位质量对齐 lqe F.binary_cross_entropy_with_logits( pred_scores, quality_target, reductionmean ) return lqe这里关键点在于iou.detach()也就是 IoU 数值只作为监督信号不参与回归梯度的反向传播。否则 LQE 会干扰回归分支的学习导致框的位置反而变差。总损失设计为total_loss L_cls L_dfl L_box lambda_lqe * L_lqelambda_lqe 在项目里通过消融实验确定为 0.25。设太大会让模型过度关注“分类与定位的一致性”导致分类分支趋于保守整体召回率下降设太小又起不到明显的对齐效果。从实际效果看LQE 加入后的主要收益并不在 mAP 指标上mAP 提升大约只有 0.8 个点而在于输出框质量明显变稳高置信度的框边界与机组部件边缘贴合更好下游做区域判定时的误判率显著下降。这个差异在指标数字上体现得不够明显但在客户现场验收时体感差异非常直接。3.3 训练策略调整LQE 机制加入后训练策略也需要适度调整否则容易出现不收敛或者震荡起始 epoch 的 LQE 权重不宜过大。模型前几个 epoch 还在学习基本目标定位能力IoU 本身很不稳定此时强行拉高分类与 IoU 的一致性容易导致模型震荡。我们在前 5 个 epoch 内用一个 warmup 策略把当前 epoch 占总共 epoch 的比例乘到 LQE 权重上让 LQE 的影响渐进增强。标签分配策略建议继续使用 TaskAlignedAssigner。因为 LQE 本质上也是在强化分类与定位的对齐这与 TaskAlignedAssigner 的“按对齐程度选择正样本”的逻辑是一致的两者叠加不会冲突。数据增强中使用 Mosaic 时LQE 的监督信号偶尔会出现噪声。原因是 Mosaic 把多张图拼在一起某些框跨图交界处 IoU 计算会有偏差。我们参考了 YOLOv8 后续版本的做法在最后 10 个 epoch 关闭 Mosaic保证 LQE 在收敛阶段面对的是干净清晰的样本。4. 数据准备与训练配置4.1 数据集类别体系设计发电机组检测的类别体系设计直接决定模型在项目中的可用性。我们初期按照客户提供的原始需求只标了一个大类“发电机组”结果模型训出来之后远端能检测到整台机组近端一旦画面里只有机组的局部就完全无法识别。后来我们把类别体系做了拆分形成一套更适合实际巡检任务的结构整机画面中包含完整或大部分机组结构的目标用于设备整体定位。动力模块机组中的发动机主体区域特征是体积大、轮廓方正常用于判断设备运行位置。散热模块包括散热格栅、风扇区域纹理密集是近景识别的重要线索。控制柜独立的目标类别虽然从结构上不完全属于机组本体但巡检时通常需要同时关注。管道接口机组周边连接管道的接口部位尺寸小、数量多是误检高发区。类别拆分后模型的学习目标更加清晰远看找“整机”近看找“模块”背景干扰项管道、支架也有了区分对象。标注成本增加了不少但模型实用性的提升非常值得。4.2 数据采集与增强策略实际采集时要注意图像覆盖多样性。我们刻意收集了以下几个维度的数据不同机位正视、侧视、俯视无人机视角和固定摄像头视角差异很大。不同光照白天、黄昏、夜间补光、逆光。发电机组表面多为金属材质反光强烈夜间补光会产生高光斑块需要让模型见得多才能抗得住。不同工况停机状态和运行状态运行时机组震动会导致图像模糊但有些巡检任务恰恰需要判断是否运行。不同遮挡程度管道遮挡、人员遮挡、检修围栏遮挡模拟真实巡检路径上的突发情况。数据增强上我们在 YOLOv8 默认增强的基础上做了一些针对性补充亮度扰动幅度比默认值加大模拟厂房内光源复杂的情况。加入随机 HSV 扰动尤其是饱和度调整让模型不过度依赖金属表面的颜色特征。Mosaic 保持开启但关闭了随机透视变换。工业场景摄像头安装后透视变化很小过强的透视增强反而会引入不真实的几何形变。增加少量模糊增强模拟震动场景下的图像退化。数据总量控制在训练集 6800 张左右验证集 800 张测试集 500 张。这个量级对于 YOLOv8n 和 YOLOv8s 规模来说足够支撑收敛。4.3 训练超参与环境训练环境使用单张 GPU。考虑到客户现场部署设备性能有限最终选择以 YOLOv8n 为主干进行改进超参配置如下输入分辨率640x640部署端保持一致。Epoch120前 10 个 epoch 使用 warmup最后 10 个 epoch 关闭 Mosaic。优化器SGDmomentum 0.937weight_decay 0.0005。初始学习率0.01使用 cosine 衰减。Batch size64单卡上以梯度累积方式实现。训练过程中我们明显观察到LSCD 模块使得模型收敛略慢于原始 YOLOv8大约慢 5 个 epoch 左右因为新增的权重生成分支需要额外时间学习。这个现象在 DFL 和 CIOU 损失的组合下更加明显。但收敛后的稳定性较好val 损失曲线没有出现明显的震荡回弹。4.4 实验效果对比最终我们在自建验证集上做了系统性消融模型配置mAP50 (%)mAP50-95 (%)参数量 (M)推理耗时 (ms)YOLOv8n baseline91.276.83.158.9 LSCD92.678.93.5710.6 LQE92.077.93.159.1 LSCD LQE93.480.53.5710.9这里推理耗时是在同一张 GPU 上、固定 batch size 下测的没有刻意做 TensorRT 优化。从数据上看LSCD 对 mAP 的贡献更明显LQE 则主要在输出框质量层面发挥作用两者叠加后 mAP50-95 比 baseline 提高 3.7 个百分点这个精度提升在工业检测项目里足够支撑后续的系统验收。5. 部署与落地验证5.1 模型导出与推理框架选择模型训练完成后部署阶段的首要工作是导出为推理框架支持的格式。我们主要验证了两条导出路径第一条导出 ONNX使用 ONNXRuntime 推理。这条路最稳妥兼容性好适合快速测试和客户环境验证。YOLOv8 官方仓库里已经内置了完善的导出脚本只要保证 PyTorch 版本和 ONNX 版本匹配基本不需要额外处理。需要注意算子的兼容性LSCD 模块中的大核深度卷积在 ONNX 里会展开成普通卷积不同版本 ONNX 支持的优化程度不同建议固定 ONNX 版本。第二条导出 TensorRT 引擎追求推理性能。TensorRT 的优化对 LSCD 模块中的 Softmax 和大核卷积有一定适配要求TensorRT 8.5 及以上版本支持得比较好。导出时开启 FP16 精度mAP 下降 0.2 个点左右FPS 提升接近 1.5 倍这个性价比在工业现场非常划算。5.2 实际场景验证中遇到的 badcase模型部署到现场后集中出现了一批离线测试时没发现的问题第一类是强逆光下的检测丢失。厂房大门口的光照条件下发电机组整体处于背光面目标亮度低部分整机目标漏检。处理办法是在训练数据里专门增加了逆光增强样本同时把输入图像的归一化方式从简单除以 255 改为带自动增益的预处理也就是推理前先做线性拉伸牺牲一点速度换取暗光场景的稳定性。第二类是金属反光导致的误检。机组表面抛光区域会反射周围灯光形成高光斑块这些斑块在某几个 epoch 中被当成控制柜或者管道接口的特征。处理方式是把 HSV 增强中的 V 通道扰动范围收紧同时删除一部分强反光样本避免模型过度学习这种不稳定的纹理特征。第三类是运动模糊下的边界框抖动。机组运行时轻微震动视频检测中同一目标框位置上下飘动影响下游的判定逻辑。这个问题的根源是回归分支对边界定位的稳定性不够LQE 机制虽然有帮助但无法完全消除。我们最终增加了一个轻量级的时序后处理对连续 5 帧的检测结果做加权平均消抖效果明显同时没有引入额外延迟。5.3 客户现场验收时的调试要点现场验收阶段最容易出问题的不是模型精度而是检测结果和业务逻辑的对接。这里分享几个容易踩坑的点检测框的置信度阈值不要照搬测试集上的最优值。现场光照、摄像头角度和测试集差异较大建议现场采集一段视频按检测结果重新调整阈值。区域遮挡判定要结合图像坐标不要只看框的 IoU。摄像头安装角度不同同一目标在画面不同位置的大小差异明显直接按像素面积判定遮挡状态会产生许多误报。模型返回的类别要处理好“整机”和“局部模块”同时出现的逻辑。很多场景下远端画面同时检测到整机和散热模块属于正常情况但下游系统如果不做去重会把同一台设备统计成两个目标。这些看起来是业务流程问题但实际影响模型最终能不能通过验收。算法交付不只是模型精度还要把输出结果和现场规则对齐。6. 常见问题与排查技巧6.1 训练时损失不下降或者震荡LSCD 模块加入后如果在自定义数据集上出现损失震荡优先检查的不应该是学习率而是 LSCD 的权重初始化。由于 LSCD 中的大核深度卷积对小数据集比较敏感建议在模块初始化时将大核卷积的权重偏置设为 0或者先用一个较小的标准差初始化让模块初始时尽量接近恒等映射。这样网络在最初几个 epoch 相当于在原始 YOLOv8 上做微调不会因为新模块的随机初始化而破坏 Baseline 的特征表达。6.2 小目标漏检严重发电机组场景里管道接口、阀门这类小目标本身像素占比小如果出现大量漏检优先从输入分辨率找问题。640x640 的输入在远端视野下一个小阀门可能只有十几个像素目标特征太少再好的模块也难有作为。我们实际项目中把输入分辨率提升到 960x960 后小目标召回率提升明显但推理耗时增加了约 40%需要根据现场算力做取舍。另一个有效做法是重点增强 P2 特征层。YOLOv8 原生结构中没有独立的 P2 输出我们通过修改 Neck 结构额外引入一个 160x160 尺度的特征图并赋予它专门的检测头小目标检测能力提升非常显著。代价是计算量和显存占用上升部署端如果显卡性能不足需要谨慎评估。6.3 光照变化导致误检多发电机组表面的金属材质对光照变化极其敏感。白天阳光直射时表面呈现高对比度夜间灯光补光时又会出现大面积低照度区域。模型容易在这种情况下把散热格栅的阴影形状误判成控制柜或者把设备周围的安全护栏误判成管道接口。建议在数据增强阶段刻意模拟多种光照状态比如把亮度扰动范围从默认的 0.5~1.5 扩大到 0.35~2.0同时加入随机灰度化弱化模型对金属表面颜色的依赖。还有一个更直接的办法在推理阶段对输入图像做局部直方图均衡化增强暗部细节。这个操作在光线不稳的厂房里效果非常明显代价是每帧图像预处理耗时增加 1~2 ms大多数现场设备都能承受。6.4 部署后精度下降明显PyTorch 训练精度和部署端推理精度出现明显差异是工业项目里非常常见的问题。如果是从 PyTorch 导出 ONNX 后再转到 TensorRT最典型的坑就是算子融合不完全导致某个自定义模块被拆成多个低效算子。LSCD 中的大核深度卷积在部分 TensorRT 版本上可能会出现这种问题。排查方法很简单先导出 ONNX 模型用 ONNXRuntime 跑一遍测试集统计精度再转 TensorRT跑同一批数据。如果 ONNXRuntime 精度正常而 TensorRT 明显下降说明问题出在引擎优化阶段如果 ONNX 阶段就已经下降则要回头查导出过程是否有什么算子不支持。如果问题确实出在 TensorRT可以考虑把 FP16 改为 FP32或者在校准阶段使用更多现场图像数据。工业场景中精度稳定性和实时性同等重要不要一味追求最高推理帧率而牺牲模型效果。6.5 LQE 机制在小数据集上的失效小数据集上 LQE 的作用会减弱原因很好理解LQE 需要一个相对稳定的 IoU 估计作为监督信号。当训练数据只有几百张时模型本身位置预测很不稳定IoU 估计噪声较大强行用这个噪声信号去约束分类置信度反而可能干扰模型学习。如果项目数据量不足建议先不加 LQE把重点放在数据扩充和 LSCD 模块上。等模型收敛后再用微调方式在训练后期加入 LQE让它在模型已经有较好定位能力的基础上发挥作用。7. 项目扩展与后续优化方向这个项目做完之后后续实际上有不少可以继续挖的方向这里简单列几条给同类项目一个参考。第一个方向是引入视频时序信息。当前 LQE 是在单帧上做分类与定位的对齐但发电机组运转时会有规律性震动和运动如果能把相邻帧的运动信息引入到检测结果中对误检抑制和漏检补偿都会有帮助。我们已经验证了简单的多帧加权平均方案有效下一步可以尝试更正式的时序融合结构比如轻量级的 LSTM 或者时序 Transformer但要注意计算量和硬件适配。第二个方向是旋转框检测。发电机组中很多部件比如管道、控制面板是长条形或具有明显方向性的用水平矩形框表达时天然会引入大量背景区域既影响定位精度也干扰后续的业务判断。切换到旋转框检测可以更贴合设备形态但训练数据和标注工具的改造工作量都不小需要根据实际需求权衡。第三个方向是小样本快速部署能力。工业巡检项目往往面临“不同客户现场设备类型差异大但可标注数据少”的问题。目前我们的模型是针对一个电厂数据集优化的换一个现场后需要重新采集标注数据并微调。如果能结合少样本学习或者领域自适应技术就能大幅缩短新现场的交付周期。这些方向并不急于同时推进但从项目长期发展的角度看提前规划好演进路径比临时抱佛脚去堆新模块要稳妥得多。做这个项目的过程中我最大的一个体会是工业检测项目里的“提升”不能只看 mAP 数字。LSCD 和 LQE 都不是那种能让指标暴涨的魔法模块但它们针对的两个问题——特征表达不均衡和分类定位质量错位——都是在真实场景里最影响系统可用性的瓶颈。如果你的项目也遇到模型在测试集上成绩很好、到了现场却各种漏检误检的情况不妨先想想是不是这两个地方出了问题再决定要不要上大模型、换骨架。很多时候把特征和损失这两个基本功做扎实比换一个更大的 Backbone 更实在。