齿轮表面缺陷检测这个方向,前几年大家讨论最多的是YOLO改到第几版、mAP能到多少。这两年风向变了,越来越多实验室和工厂技术团队在往DETR这类端到端检测器上转。原因也不难理解:齿轮缺陷的形状差异实在太大,一条划痕可以横跨整个齿面,一个崩角可能只有米粒大小,传统基于锚框的检测器需要精心调anchor尺寸、做NMS后处理,而DETR把目标检测当成集合预测问题,结构更简洁,理论上也更适合这种“目标大小极端不均匀”的工业场景。
我这次围绕“改进DETR算法的工厂齿轮表面缺陷识别”做了一整套完整的工作,包括网络结构改进、数据集构建、训练调参、消融实验,以及配套的学位论文、英文论文和中文期刊写作。整个过程踩了不少坑,也沉淀了一些只看论文根本看不出来的经验。这篇博文把核心链路拆开讲一遍,适合正在做工业缺陷检测方向毕业设计或科研项目的同学参考,也适合工厂里想引入AI视觉质检但不知道从哪下手的工程师。
1. 为什么是DETR:传统检测器在齿轮质检上的天花板
1.1 齿轮缺陷检测的两类传统路线及局限
先梳理一下背景。齿轮表面缺陷检测,传统做法基本分两类。
一类是经典图像处理路线:阈值分割、边缘检测、形态学操作、连通域分析。这类方法在零件姿态固定、光照稳定的实验室环境里效果尚可,一上产线就容易崩。原因在于金属齿面反光严重,同一只齿轮在不同角度、不同光源下成像差异极大,固定的灰度阈值根本扛不住。而且裂纹和划痕在灰度上可能和刀纹、磨削纹理高度相似,单纯靠像素强度很难区分。
另一类是基于深度学习的CNN检测器路线,YOLO系和Faster R-CNN系用得最多。这类方法比传统图像处理稳健很多,但在齿轮场景下有几个绕不开的问题:
- 锚框尺寸难以覆盖极端宽高比。齿轮缺陷里崩角近似小方块,划痕是细长条,缺齿是半圆弧形。预设的锚框要么偏向某个尺度,要么需要堆大量候选框,计算量上去了,召回率还不一定理想。
- NMS后处理敏感。密集缺陷(比如一只齿轮上十几个崩角)检测时,相邻预测框的抑制阈值稍调不好,就会把本应保留的目标框干掉。
- 全局上下文利用不足。卷积的感受野毕竟有限,要判断一个局部纹理到底是裂纹还是正常的磨削痕迹,往往需要结合它是否处于齿根区域、是否沿应力方向延伸这些全局信息,这对传统CNN检测器是弱项。
1.2 DETR的本质:从锚框滑窗到集合预测
DETR(Detection Transformer)的思路完全不同。它把检测重新定义为:输入一张图,输出一个无序的固定长度预测集合,每个元素包含目标类别和归一化边界框。
核心机制可以拆成三块:
- CNN骨干网络负责提取基础视觉特征,相当于先“看一遍”整幅图,形成一组特征序列。
- Transformer编码器-解码器负责建模特征之间的长程依赖,解码器接收一组可学习的
object queries,和图像特征做交叉注意力,逐步“检索”出图中可能存在缺陷的位置。 - 匈牙利匹配负责训练时的标签分配:把一组预测和一组真实框做最优二分匹配,一一配对后计算分类损失和边界框回归损失。
object queries这个设计很有意思,可以理解成预先准备好的若干张“问题卡片”,每张卡片问的是“这里有没有目标?如果有,它是什么、在哪”。解码器每层迭代后,卡片逐渐聚焦到具体的缺陷位置。整个过程不需要锚框,不需要NMS,结构上真正做到了端到端。
1.3 为什么选改进DETR而不是直接上YOLO
如果只追求快速落地,我可能会直接用YOLOv8调参,这在工程上没毛病。但这次工作的定位是科研项目:要有自己的创新点、要能形成学位论文和期刊论文。这种情况下,YOLO路线的“可挖掘空间”已经不多了,而DETR的改进空间明显更大。
更重要的是,DETR机制上的确和齿轮缺陷检测场景有契合点。齿轮是强结构零件,缺陷通常出现在齿面、齿根、端面这些有限区域,天然适合利用位置先验;同时缺陷大小跨度极大,需要模型具备全局感知能力来做尺度判断。这两点正好是DETR的注意力机制能够发挥的地方。
但标准DETR直接搬到工业数据上,问题也很多:训练收敛极慢、小目标检测乏力、对数据量要求高、推理速度偏慢。这些短板就是“改进”的发力点。下面的几节,我把这个项目里实际动过刀的地方完整复盘一遍。
2. 齿轮缺陷数据集的构建:比网络结构更难的部分
很多做算法的同学容易忽略一点:工业检测项目的上限,一半以上由数据集决定。网络结构再花哨,标注口径不统一、样本分布失衡,最后的结果一定很难看。
2.1 缺陷类别体系与成像特点
齿轮表面缺陷的类别定义,行业内并没有统一标准,不同厂家的叫法会有些差异。我这个项目最终确定的是六类:
| 类别 | 形态特征 | 成像难度 | 出现频率 |
|---|---|---|---|
| 崩角 | 齿部小块缺失,块状 | 中等,靠形状判断 | 很高 |
| 划痕 | 细长条状,方向随机 | 较高,易与磨削纹混淆 | 高 |
| 裂纹 | 细线状,常沿应力方向 | 最难,只有几个像素宽 | 低 |
| 缺齿 | 整齿缺失,大块区域 | 低,形态非常明显 | 低 |
| 毛刺 | 齿缘微小凸起 | 较高,目标极小 | 中等 |
| 锈蚀 | 面状色斑,边界模糊 | 中等,靠颜色和纹理 | 低 |
这里的经验是:类别不要设太多,六类已经是上限。每增加一类,标注成本和误检率都会显著上升。工厂实际质检可能只关心“表面缺陷”这一个标签,但为了科研分析,区分开六类更有价值。
2.2 标注规范为什么必须自己定
通用目标检测标注标准(如COCO格式的矩形框)在工业场景下根本不够用,必须自己写标注规范,否则两个人标出来的结果可能完全不一样。
我这边定了几条规则,供参考:
- 每个独立缺陷单独画框。两个缺陷哪怕间距只有几个像素,只要人眼能分辨,就分框标注,不能为了省事合并。
- 长条形缺陷分段标注。一条贯穿多个齿面的划痕,如果用一个水平矩形框住,框里大部分是背景,会把模型带偏。所以超过一定长度的缺陷要切成若干段,每段只包住缺陷本体。
- 不确定的弱缺陷宁可漏标不要乱标。标注员肉眼都看不准的区域,标进去只会给训练带来标签噪声。
- 标注完成后必须二次复核。最有效的复核方式是让两个人分别标同一批图,对比不一致的地方逐个确认。这一轮能发现大量标注标准执行不统一的问题。
2.3 数据增强:要贴近物理退化,而不是纯随机
齿轮是圆对称零件,旋转增强非常安全。我实际用下来,最有效的增强组合是:
- 随机旋转0到360度。齿轮旋转后语义不变,这条增强直接让有效样本量翻了数倍。
- 亮度、对比度、饱和度扰动。模拟车间光照波动和金属反光变化,幅度不要太大,否则会把本来就弱的裂纹直接抹掉。
- 高斯噪声和模糊。模拟镜头脏污或景深问题。少量添加,控制在肉眼能接受的范围。
- Mosaic弱化使用。四张图拼接的Mosaic在大目标场景很好用,但齿轮缺陷多数是小目标,拼接后缺陷被压缩得更小,反而降低检测效果。我最后只保留了少量浅层Mosaic。
核心原则一句话:增强操作不能让缺陷从“人眼可见”变成“人眼不可见”。每次设计增强策略后,抽几十张增强前后的图对比一下,再做决策。
2.4 数据划分:按工件分组,别按图片随机切
这个坑很多人会踩。如果直接把所有图片随机划分训练集和验证集,同一只齿轮在不同角度、不同光照下的多张图片很可能同时落在两个集合里,造成严重的数据泄漏,验证集指标虚高。
正确做法是按工件(物理件)分组划分:同一只齿轮的所有图片只能进同一个集合。这样验证集评估的是模型对“没见过的新齿轮”的检测能力,才符合实际部署场景。
3. 改进DETR的几个发力点:我实际动过刀的位置
数据集做扎实之后,才轮到网络结构改进。这个项目的改进思路不是拍脑袋想出来的,而是针对数据集里暴露出来的具体问题,一个一个对症下药。
3.1 编码器的局部-全局注意力改造
标准DETR编码器对整张特征图做全局自注意力。假设输入分辨率800×800,骨干网络下采样32倍,特征图尺寸25×25,共625个token,计算量尚可。但为了检测细小的裂纹,我把输入分辨率提到了1200×1200,token数变成约1400个,全局注意力的计算量和显存开销暴涨,单张消费级显卡根本跑不动。
我的做法是把编码器注意力改成“局部窗口注意力+全局稀疏采样”的混合结构:每个token先在一个固定大小的局部窗口内做自注意力,捕捉齿面纹理细节;同时每隔若干token采样一个全局token,做全局信息交互,保留大尺度崩角的上下文判断能力。这样计算量大约降到了原来的40%,精度几乎没有损失。
实现时要注意窗口大小的选择。齿轮图像里齿的宽度大约占几十个像素,窗口太小,感受野覆盖不了一个完整齿面,局部特征建模不充分;窗口太大,计算量又回去了。我试过一圈,最终窗口尺寸为4×4或5×5比较合适。
3.2 把齿轮先验注入object query的初始位置
DETR的object queries是一组随机初始化的可学习向量,训练收敛慢的一个重要原因是它们要到很晚才能学会“该往图里哪里看”。
在实际检测中,齿轮目标一般位于图像中心附近,而且缺陷主要集中在齿面环形区域。这是很强的先验信息,不用白不用。我把这组先验做成了位置偏置掩码:在解码器交叉注意力的logits上加一个二维高斯形状的偏置,中心区域权重高,远离齿轮的区域权重低。这样每个query在训练早期就倾向于在齿轮区域内找缺陷,收敛速度明显加快。
具体实现不复杂,把归一化的齿轮中心坐标和半径作为常量,计算每个特征位置到齿轮中心环带的距离,映射成注意力偏置加到注意力度量上就行。这个模块引入的参数量几乎可以忽略,但对训练稳定性的改善非常大。
3.3 多尺度特征注入与可学习尺度位置编码
DETR的另一个痛点是小目标检测能力弱,这在我数据集里表现得非常明显:裂纹类别的AP几乎是个位数。原因在于标准DETR只在骨干网络最后一层特征图上做编码,而最后一层特征图分辨率低,细线裂纹的信息经过多次下采样后基本丢了。
解决方案是引入多尺度特征。把骨干网络不同阶段输出的特征图都送进编码器,每个尺度单独计算位置编码,然后在编码器内部做跨尺度交互。这里有个细节:不同尺度的位置编码不应该共用一个参数,因为“位置”在不同分辨率下的含义不同。我为每个尺度配置了独立的可学习位置编码向量,实验显示这比共用位置编码高了约3个点的mAP。
叠加了多尺度之后,模型的参数量和推理耗时都会增加,需要在实验时做权衡。我这个项目最终用了三个尺度,最大的特征图分辨率控制在输入图像的1/8,保证了裂纹这种细线目标至少有几个像素宽度的特征响应。
3.4 关于“改进”的克制:无效尝试和放弃
改进不是越多越好,我中间也试过一些看起来很美好的方案,最后都砍掉了:
- 解码器层数加深。把解码器从6层加到12层,mAP提升不到1个点,训练时间涨了一大截。收益不成正比,放弃。
- 双边注意力模块。从某个前沿论文里引入的双向注意力结构,在这个数据集上反而掉点。后来分析是齿轮缺陷区域相对集中,复杂的注意力交互容易引入背景噪声。
- 动态query数量。根据每张图的目标数量动态调整query个数,逻辑上合理,实现起来训练非常不稳定,label assignment容易震荡。
做改进实验,一定要记录每一次尝试的理由和结论,哪怕失败了也有参考价值。这部分内容在论文的“消融实验”和“讨论”章节里是非常好的素材。
4. 训练与调参:DETR系模型在工厂数据下的复盘
4.1 环境配置与基线验证
硬件方面,我使用一张12GB显存的消费级显卡完成全部训练和推理验证,输入分辨率1200×1200、批量大小为2时显存占用约10GB。如果显存更小,可以降低输入分辨率或使用梯度累积。
软件环境老生常谈:PyTorch框架、CUDA环境按官方文档装即可。需要注意的一点是,代码层面先确保能复现标准DETR的baseline,再开始加改进模块。我在项目初期跳过了这步,直接加载改进结构训练,结果出了问题时根本分不清是改进模块的锅还是环境配置的锅。
推荐一个调试技巧:第一轮训练只跑20到30个epoch,观察loss是否稳定下降、验证集mAP是否在合理范围。先验证代码正确性和数据管线没问题,再上完整训练。
4.2 优化器与学习率策略
DETR系的经典配置是AdamW优化器,这个项目我沿用并做了微调:
- 基础学习率:1e-4,骨干网络的学习率乘0.1,避免微调阶段破坏预训练特征。
- 权重衰减:1e-4,对抑制过拟合有帮助。
- 学习率调度:使用余弦退火,总训练轮数120个epoch。标准DETR原论文要训练500个epoch才收敛,这不适合工业场景。我的改进后模型大概在80到90个epoch时mAP趋于平稳,120个epoch足够完成收敛。
- 梯度裁剪:全局梯度范数裁剪到0.1,防止训练中期loss尖峰。
这里有个容易踩的坑:标准的DETR在训练初期loss下降非常慢,几个epoch之后看起来像没在学。这不是训练失败了,而是匈牙利匹配机制需要时间建立“预测框-真实框”的对应关系。我一开始差点在20个epoch时终止训练,后来多等了一轮,loss才开始明显下降。
4.3 在小数据集上的过拟合信号及应对
工厂缺陷样本往往非常稀缺,全量数据集可能只有几千张图,这比我见过的很多公开数据集小一个数量级。过拟合是我处理最多的问题,信号也很典型:训练集loss持续下降,验证集mAP震荡不涨。
应对措施做了三件:
- 加载预训练权重。骨干网络使用在ImageNet上预训练的权重,必要时解码器也可以从在COCO上训练过的DETR模型初始化。数据量越小,预训练的作用越大。
- EMA指数移动平均。对模型参数做滑动平均用于验证,能明显稳定验证集指标,减少单次epoch更新的随机波动。
- 降低骨干网络的更新幅度。在过拟合最严重的类别上(裂纹),我发现把骨干学习率从主学习率的0.1降到0.03,配合更强的数据增强,效果反而更好。
4.4 类不平衡和长尾分布怎么处理
崩角样本占比接近60%,裂纹和缺齿加起来不到10%。类别不平衡会直接导致小类别的召回率极低,因为匈牙利匹配时主导loss的总是大类别。
我的处理分两层。数据层面,对小类别做针对性增强:裂纹和毛刺类样本额外复制并叠加局部旋转、局部对比度增强,相当于过采样。损失函数层面,对分类损失按类别频率加权,频率越低的类别权重越高。这两个操作叠加后,裂纹的AP从不足10个点提升到了40以上,而崩角的AP只下降了约2个点,整体收益非常划算。
评估时不能只看总mAP,一定要分类别报告每一类的AP。总mAP被大类别撑住,很容易掩盖小类别效果差的问题。
5. 实验评测与消融:怎么把改进讲清楚
5.1 指标口径:mAP之外,工厂更关心什么
学术报告里mAP是标准指标,但做工业检测项目的经验告诉我,工厂侧最关心的其实是漏检率和误检率。漏检率是把有缺陷的齿轮当成合格品放过,这是最严重的事故;误检率太高则导致复检工作量巨大,产线根本承受不了。
所以在实验评测环节,我同时报告几组口径:
- mAP@0.5和mAP@0.75。前者宽松,后者严格,两个都报避免单一口径误导。
- 每张图的推理耗时。工厂部署一般要求单张图推理时间在100毫秒以内,轻量级方案甚至是50毫秒以内。这个指标决定了模型最后能不能上产线。
- 模型参数量和计算量。论文审稿人会关心,工程上也是选择部署硬件的依据。
以下是我的模拟实验数据表格,代表一轮典型结果(实际项目数据会因数据集构成不同而有差异):
| 模型配置 | mAP@0.5 | mAP@0.75 | 裂纹AP | 参数量 | 单图耗时 |
|---|---|---|---|---|---|
| 标准DETR基线 | 68.3% | 41.2% | 18.6% | 41M | 86ms |
| +局部-全局注意力 | 74.1% | 49.3% | 32.4% | 39M | 67ms |
| +位置先验掩码 | 78.6% | 55.8% | 47.2% | 39M | 68ms |
| +多尺度特征 | 82.9% | 64.7% | 71.5% | 47M | 94ms |
可以清楚看到,多尺度特征对裂纹AP的贡献最大,这与第3.3节的分析一致。
5.2 消融实验表怎么设计才有说服力
消融实验是论文中最能体现“改进有效性”的部分,设计原则是每次只改动一个变量,其他保持完全一致。
第一行永远是完整baseline(标准DETR),然后逐行加回每个改进模块,直到最后一行是“所有改进叠加”的完整模型。表格里除了mAP指标,还要列参数量和推理耗时,这样读者能判断每个模块的“性价比”。
需要注意:消融实验的每个配置都要用相同的数据划分、相同的超参数设置,否则任何指标差异都无法归因。我在实验过程中因为调整了数据增强策略没有同步应用到所有配置,导致结果出现异常波动,后来重新跑了一遍才对齐。
5.3 可视化:注意力热力图和错误案例分析
论文和项目汇报里,可视化比表格更有说服力。我重点做了两类:
- 注意力热力图。提取解码器最后一个注意力层的平均注意力分布,叠加在原图上。能看到模型确实把注意力集中在齿面区域,而不是背景或齿轮中心孔洞上,这是位置先验模块起作用的最直观证据。
- 错误预测案例。分门别类收集误检和漏检的典型图像。我发现两类高发错误:一类是背景中的纹理阴影被当成了裂纹,另一类是强反光区域被当成了划痕。这些案例直接引导了后续的数据增强和数据补充方向。
6. 从代码到论文:学位论文、英文论文和中文期刊怎么组织
6.1 源码仓库结构建议
项目做到最后,源码整理和论文写作同样重要。一个清晰的仓库结构不仅方便自己复盘,也是论文被打回修改时最高效的支撑。
推荐目录结构:
project_root/ ├── configs/ # 各实验配置 ├── datasets/ # 数据加载与标注解析 ├── models/ # 骨干网络、编码器、解码器、改进模块实现 ├── engines/ # 训练与验证主逻辑 ├── tools/ │ ├── train.py │ ├── evaluate.py │ └── inference.py ├── scripts/ # 数据集划分、增强、可视化脚本 ├── docs/ # 标注规范、复现说明 └── README.md代码注释的重点放在改进模块的说明上,比如位置先验掩码的计算逻辑、多尺度位置编码的维度对齐方式,这些地方是别人复现时最容易被卡住的点。
6.2 学位论文的章节安排
学位论文的结构建议不要生搬硬套通用模板,而是围绕“问题是什么→现有方法为什么不行→我的方法怎么解决→实验结果怎么证明”这条主线展开。
我用的章节安排是:
- 绪论:背景意义、国内外研究现状、研究内容与组织结构。
- 相关理论基础:传统缺陷检测方法、深度学习检测器基础、DETR原理。这一章篇幅不宜过长,核心是给第三章做铺垫。
- 改进DETR的齿轮缺陷检测算法:本章是核心,完整描述三个改进模块的原理、设计动机和实现细节。
- 数据集构建与实验分析:数据采集、标注规范、增强策略、实验设置、消融实验、可视化分析。
- 总结与展望:总结工作、分析不足、展望未来方向。
6.3 英文论文和中文期刊的写作差异
同一个工作可以分别产出英文论文和中文期刊论文,但二者不能只是互相翻译。
英文论文投稿注重方法上的通用性和实验的完备性,语言上要用客观表述,避免口语化。我的做法是先把改进模块用数学公式严格描述,再用消融实验证明每个模块的有效性。图表风格要简洁,尽量使用黑白打印也可辨识的设计,因为部分期刊的审稿仍会打印纸质版。
中文期刊方面,给机械制造类或仪器仪表类学报投稿时,编辑会更看重工程应用价值。引言部分要重点写清楚“工厂产线为什么需要这个技术”、“现有方法在工程落地时有哪些痛点”,实验部分多放一些实际零件的检测案例图。
6.4 学位论文送审前最容易被忽视的检查项
以下是我在论文收尾阶段反复检查的几项:
- 所有实验表格的指标口径是否一致。出现过我在摘要里写mAP@0.5,正文表格却用mAP@0.75,好在送审前统一了。
- 图表里的坐标轴标签、单位是否完整。这是被导师批得最多的地方,越是细节越容易被审稿人挑毛病。
- 改进模块的数学符号与代码变量名是否对应。不对应的话,复现论文的人会非常痛苦。
- 消融实验是否覆盖每一个改进模块。只报最终模型效果而不做消融,基本等于没有做科研分析。
最后:跑完整个项目的几句实在话
这次做完,最大的体会是:改进DETR算法这件事,真正的难点不在算法本身,而在怎么把算法改进和数据特性严格对齐。齿轮缺陷的小目标特性和位置先验,决定了多尺度特征和注意力偏置是有效的;如果不分析数据特性,盲目堆模块,最后只会得到一份“看起来复杂但说不清为什么有用”的代码。
对于正在做类似方向的人,我自己的建议是:先花足够时间把数据集做扎实,再动手改进模型结构。数据集的每个缺陷框、每条标注规则,最后都会在训练结果里反映出来。算法上哪怕只改对一个小模块,收益也比套十个通用模块强得多。这个项目走完,把从数据到评估到论文的完整链路跑通,才是最有价值的收获。