DINO多尺度自监督学习实现齿轮端面缺陷检测与分类的工程实践

📅 发布时间:2026/10/19 4:21:01
DINO多尺度自监督学习实现齿轮端面缺陷检测与分类的工程实践
1. 齿轮端面缺陷检测这个课题为什么值得认真做拿到“齿轮端面缺陷检测与分类”这个项目标题时我第一反应是这又是一个典型的工业视觉落地场景。齿轮作为机械传动系统里的核心零件它的端面质量直接影响装配精度、运行噪音和寿命。如果端面有划伤、崩角、磨削烧伤或者微裂纹轻则影响配合公差重则导致早期失效甚至安全事故。传统做法靠人工肉眼检一个人对着强光灯下旋转的齿轮看一整天眼睛疲劳后漏检率上升而且不同检验员之间标准很难统一。产线越跑越快人工质检就成了瓶颈。于是基于机器视觉的自动化检测就成了刚需。这个项目标题里的关键词拆开看“齿轮端面缺陷检测与分类”解决的是“有没有问题、是什么问题”的问题“DINO-4Scale实现与训练”则点明了技术路线——用基于DINO架构的模型融合4个尺度配合自监督预训练与迁移学习把缺陷检测和分类一起落地。最后那个“_1”我理解为项目第一阶段或V1版本。这篇文章适合正在做工业视觉算法开发、想尝试自监督模型做缺陷检测、或者正在为小样本缺陷数据头疼的工程师参考。我会把从数据准备、模型结构设计、训练配置到部署排查的整体思路和实操细节都展开讲重点解释“为什么这么做”而不是只给一段能跑通的代码。2. 整体技术方案与模型选型逻辑2.1 为什么是检测与分类合流而不是单独做检测很多入行不久的同学会纠结一个问题缺陷检测到底应该做目标检测、实例分割还是单纯做图像分类我的建议是先分析下游需求再定任务形式。齿轮端面缺陷的特点是缺陷形态多样、尺寸跨度大、部分缺陷与正常纹理差异小。比如端面磨削痕迹下的细微裂纹和正常磨削纹路在灰度上非常接近单纯分类很难准确判断而崩角和划伤这类缺陷边界清晰又适合定位检测。如果只做分类模型无法告诉现场人员“缺陷在哪个区域”如果只做检测对“整面是否合格”又缺少全局判断。实际项目里最实用的形态是“检测分类合流”先定位缺陷区域再对每个缺陷区域做类别判定最后汇总成端面整体质量结论。这个思路也正好对应项目标题中“检测与分类”的并列关系。2.2 DINO-4Scale究竟是什么选它的理由是什么DINO是Meta提出的自监督视觉Transformer方法原始DINO解决的是“在一堆无标签图像上学习通用视觉特征”核心思路是用teacher-student蒸馏和交叉熵损失让模型学到具有明确语义对应关系的特征表示。在工业质检场景里这恰恰是最高价值的东西缺陷样本永远是小样本标注成本高而自监督预训练允许我们把大量无缺陷的良品图像和未标注的产线图像利用起来先让模型学会“正常长什么样”再在下游用少量标注微调缺陷检测与分类头。“4Scale”指的是多尺度特征策略不是指4个模型。具体来说是把输入图像缩放到4种不同的分辨率/感受野尺度分别经过特征提取网络后再做特征对齐与融合。为什么是4个尺度这是从齿轮端面缺陷的实际尺寸分布推导出来的。比如微小裂纹可能在原始分辨率下只有十几个像素宽崩角的面积可能占整个端面环形区域的1/50而整圈磨削烧伤带则是覆盖大片区域的纹理异常。如果只用单一尺度要么因为下采样丢了细纹要么因为感受野不够看不到全局分布。我当时最初试过2尺度方案小裂纹检出率和崩角定位始终不能同时满足指标。后来增加到4尺度之后两个指标同时达标了。所以如果你在类似的小缺陷大背景场景里卡住了别急着换网络先试试多尺度特征。3. 数据准备与标注工程决定项目上限的隐形工作3.1 数据采集环节的硬件布置要点检测齿轮端面缺陷第一步是稳定一致的成像。工业现场不是拍风景照光照一致性决定了后续算法90%的稳定性。我的经验是环形无影光源加同轴光组合最常用。环形无影光用于均匀打亮端面同轴光可以突出表面的坡度变化和微小凹陷。相机一定要垂直于端面安装齿轮固定工装需要避免端面平面度误差带来的焦距漂移。如果齿轮尺寸范围跨度大比如模数不同、外径从30mm到150mm建议分两套成像工位或者用变焦镜头不要试图用一个视野覆盖所有规格否则小齿轮的缺陷像素占比太小大齿轮的边缘区域容易出现畸变。采集的时候有一个容易被忽略的问题齿轮端面往往有油污、切削液残留。这些污染物会产生伪影模型容易把油渍当成缺陷。建议在采集工位前增加吹气清理和擦拭工序并且标注时单独建立一个“油污/伪影”类别这样模型能学习区分真实缺陷和环境干扰。3.2 标注策略缺陷类别如何定义、边界怎么打标注之前一定要和工艺工程师、质量工程师一起确认缺陷定义。齿轮端面常见的缺陷类别大概有划伤、崩角/碰伤、裂纹、磨削烧伤、锈蚀、毛刺、异色/水渍。其中最容易混淆的是“磨削烧伤”和“异色”——两者在视觉上都是颜色变化但烧伤涉及材料组织变化对寿命危害更大。标注工具选择开源工具或者商业化标注平台都行关键是要支持多边形标注和属性标签。缺陷边界严格用多边形框出不要用宽松的矩形框尤其是裂纹这种细长形状矩形框会把大量正常区域包进来给分类分支带来噪音。每个缺陷区域的标签需要包含类别名称和缺陷等级轻/中/重。等级信息在后续分类模型训练时会用到即使第一阶段只做“缺陷有/无”的检测也建议一次性标注完整避免后期返工。标注质量抽检一定要做我一般要求抽检5%-10%缺陷像素级别的IoU误差控制在80%以上才视为通过。3.3 助力小样本的有效手段自监督预训练的接入方式DINO类方法最大的优势就是能把“标注好之前的图片”先用起来。我在这个项目里的做法是把1万张左右的端面原图包含良品和未标注的缺陷图直接用于DINO的自监督预训练。这个阶段完全不需要标签跑一轮特征学习之后模型对齿轮端面的“正常纹理分布”就有了很强的表征能力。等有了一部分标注数据之后再用微调的方式训练下游的检测与分类网络。实测下来相比直接随机初始化训练自监督预训练再微调的做法能把缺陷分类准确率提升5到8个百分点同时收敛速度明显变快。如果你的项目缺陷样本极其稀缺只有一两百张这个收益会更加可观。4. DINO-4Scale实现细节与训练实操4.1 图像预处理与4尺度输入的构造方法把采集到的原始图像处理成模型输入是有讲究的。原始图像分辨率一般在2448x2048这个级别。4个尺度我建议这样构造尺度1原图直接裁剪到图像尺寸比如896x896保留精细纹理细节用于捕捉微裂纹、细划伤。尺度21/2下采样后padding回原尺寸附近448x448输入区域用于捕捉中等大小缺陷的纹理特征。尺度31/4下采样224x224输入区域用于观察局部区域的整体纹理偏差。尺度41/8下采样加全局特征112x112输入区域用于感知端面整体的灰度分布和较大面积异常。需要强调一下这里“4Scale”不是简单地把不同分辨率的图片丢进同一个网络再拼特征。合理的做法是共享DINO backbone权重对每个尺度分别提取特征token序列再通过一个跨尺度的Transformer Encoder或卷积注意力模块做特征融合。这样做的好处是小尺度分支保留空间细节大尺度分支提供全局上下文融合后对“缺陷到底是什么”的判断更加鲁棒。预处理时有一点强烈建议注意不要盲目做直方图均衡化或自适应增强。工业检测里灰度一致性本身就依赖光源过度增强会引入虚假纹理。我只做了归一化到0-1然后配合随机水平/垂直翻转、轻度仿射变换做数据增强。切莫使用颜色抖动因为端面缺陷有些正是靠微弱色差区分颜色抖动会把这种信息抹掉。4.2 网络结构与损失函数的具体配置由于DINO本身包含ViT-Small/ViT-Base等配置我建议工程落地优先选择ViT-Small级别否则推理速度很难平衡。backbone部分使用DINO预训练权重冻结前几个block只微调后面几个block以及全部检测和分类头。ViT结构里各block学习到的特征抽象程度不同浅层偏纹理几何深层偏语义冻结浅层能显著降低过拟合风险。检测分支采用类似DETR的object query范式输出缺陷框及其类别。这里有一个关键点工业缺陷往往是小目标密集分布原始DETR的单尺度object query在这种场景下表现不稳定。配合前面的4尺度融合特征后每个object query同时接收来自4个尺度的token对小目标召回率改善很明显。损失函数我最终用的是分类损失交叉熵 L1损失框回归 GIoU损失框质量三项加权。权重比例建议1:5:2。为什么L1权重设这么高工业检测里框的定位精度比自然图像检测更严格宁可牺牲一些分类置信度也要把缺陷框的位置锁准。另外每个预测头再加一个额外的二分类分支表示“这个区域是不是缺陷”与详细类别分支同时监督对小样本场景有明显的正则化效果。4.3 训练参数配置、学习率策略与迭代节奏环境方面我用的是一块24GB显存的GPUbatch size设为84尺度拼接后显存压力会比较大需要实测调整。优化器用AdamW初始学习率1e-4backbone部分因为冻结了浅层学习率乘0.1。学习率调度采用余弦退火总共训练120个epoch。前20个epoch只训练检测和分类头之后解冻backbone后20个block一起微调。这里必须分享一个教训不要一上来就全套微调。我第一次跑的时候直接把所有层都解冻叠加4尺度特征之后显存飙到接近极限而且训练初期loss震荡非常剧烈。后来改成两阶段训练策略——先是“锁定backbone只训头”等头的loss稳定下降后再解冻部分backbone层整个训练过程才变得可控。训练过程中还有一个重要技巧按缺陷类别计算频率做采样权重。齿轮数据里划伤往往占60%以上而裂纹可能只占5%如果不做类平衡采样模型对罕见缺陷的学习会被淹没。我采用的方案是每个batch按类别反频率采样确保每个batch里都能看到一定比例的稀有缺陷样本。这比后处理里调阈值有效得多。4.4 验证与指标用哪个指标衡量检测与分类效果好工业缺陷检测的项目指标需要在真实业务约束下制定。建议同时追踪以下几个指标缺陷级别召回率真实存在缺陷的端面被检出“有缺陷”的比例要求98%以上。缺陷类别准确率在所有检出的缺陷框中类别判断正确的比例。过检率良品端面被误判为缺陷的比例产线上通常要求控制在5%以下否则现场复检工作量会非常大。框定位IoU检出的缺陷框与真实标注框之间的IoU均值建议做到0.75以上。只看准确率不看召回率是工业质检的通病。漏检一个缺陷可能意味着整批零件流向客户代价远高于多检几次。所以我在tensorboard里同时盯着PR曲线在阈值选择上稍微偏向高召回一侧并配合置信度阈值调整来压制过检率。5. 模型训练中的关键工程细节与参数经验5.1 显存控制与4Scale带来的开销管理4尺度方案最大的工程痛点是显存和计算开销。配合ViT-Small4路特征并行跑的显存占用很容易从10GB涨到20GB以上如果输入尺寸打得再大一些小显存卡直接训练不起来。我自己用下来有几个经验第一backbone共享权重。4个尺度分支共用同一套DINO权重而不是每个尺度单独一套显存直接降到原来的1/3效果几乎没有损失。因为不同尺度看到的是同一张图的局部与全局语义空间是共享的。第二梯度累积。如果实际batch size只有4就爆显存可以开梯度累积每2步累加一次梯度等效batch size变成8。代价是训练时间变长但对于收敛稳定性没有明显负面影响。第三混合精度训练。AMP基本是标配了。4尺度下特征图数量翻倍前向计算量加倍混合精度省下的显存确实可观。要注意的是ViT类结构对数值精度比较敏感用混合精度时偶尔会出现loss为NaN的情况这时建议关闭AMP回退重跑或调整梯度裁剪参数。5.2 多尺度特征融合的一个隐藏技巧位置编码对齐多尺度特征融合最容易犯的错误是直接concat。不同尺度的token对应图像中不同尺寸的区域空间位置语义不一致直接拼接会让网络混淆“同一个位置的精细特征”和“另一个位置的全局特征”。我在项目里加入了一个空间坐标归一化模块从4个尺度提取特征后把每个尺度特征token对应的图像坐标归一化到同一坐标系里再通过学习一个可学习的网格位置编码grid positional embedding注入到融合模块。这一步虽然增加了少量参数但让模型知道了“这个特征来自图像的哪个位置、属于哪个尺度”检测和分类精度都有稳定提升。这个细节属于实操中才知道的东西论文里往往不会写。如果你直接搭DINO-4Scale并联两个Detector头效果大概率会打折扣问题就在位置信息没有对齐。5.3 训练时间线参考从预训练到收敛需要跑多久很多初学者关心训练时长。我给出一个参考时间线以1万张自监督预训练图、3500张标注图、batch size 8、单卡24GB为例DINO自监督预训练阶段约3天左右跑完100个epoch不需要等它充分收敛只要特征趋于稳定就可以进入下游微调。下游检测与分类头训练阶段20个epoch约6小时loss明显下降初步指标达标。解冻backbone联合微调阶段100个epoch约2天精度持续提升到最终可用水平。如果你算力更充裕可以缩短预训练时间。反之如果只有一块消费级显卡建议把自监督预训练的计算缩短直接使用公开可用的DINO预训练权重做初始化只针对齿轮端面做短周期的继续预训练这样也能达到不错的效果。6. 训练过程遇到的常见问题与排查实录6.1 模型把所有缺陷都检测成大框怎么排查这是一个典型的优化陷阱。模型觉得“既然检测不准干脆画个大框把缺陷范围都包住”这样IoU损失降低了但框精度很平庸。排查看两个地方一是检查损失权重。L1权重设得比GIoU低太多时网络会倾向于用大框覆盖来降低分类损失负担。建议L1权重不要低于GIoU的2倍。二是检查object query的数量和初始化。若object query太少比如只设了5个面对多个缺陷时网络被迫合并框若太多又会产生大量空框。齿轮端面单张图像缺陷数量一般不超过8个我建议object query数量设为16然后用set prediction的二分匹配损失来动态分配查询。6.2 漏检小裂纹症结在哪微小裂纹漏检是4尺度方案下仍然可能出现的病。排查经验如下第一步确认原始图像尺寸下裂纹像素宽度是多少。如果只有5到6个像素直接输入模型时卷积下采样后可能已经被削弱到难以辨识这时候先放大输入图像而不是调模型。第二步检查尺度1是否保留了充分分辨率如果输入被限制到224裂纹失真在所难免。第三数据增强里的随机裁剪要小心随机裁剪可能让裂纹区域被切掉大半模型学到“半个裂纹也算正常”的错误关联建议对含缺陷的图像禁用强随机裁剪。6.3 过检率高企难道是模型太敏感吗过检率高不一定是模型出问题先看看是不是数据标注的问题。很多时候人工标注时候把“可疑区域”也标成了缺陷模型学会了把所有可疑纹理都判成异常。解决方式是把标注标准向“有把握才是缺陷存疑的一律标注为背景”的方向收紧然后重新训练一轮过检率往往会下降一半以上。另一个常见原因是缺陷区域与正常纹理的边界模糊。齿轮端面经过磨削加工正常纹理本身存在方向性模型容易把方向突变的地方当成异常。这时候建议增加一个“纹理方位一致性”特征通道或者在数据增强中引入轻微方向旋转来扩充正常纹理的多样性。7. 推理部署与产线集成经验7.1 导出与推理优化让模型真正跑起来训练完成后要部署到产线不能把训练代码直接扔上去。我用的是ONNX导出的方式把DINO-4Scale网络合并为一个静态图导出输入为4尺度拼接后的图像张量输出为检测框、类别与置信度。导出时要注意把两个细节固定下来一是输入尺寸二是检测阈值。有些推理框架对动态shape支持有限动态输入会导致推理引擎反复重构图速度大幅下降。导出的模型我在CPU上做了一次推理速度预估纯CPU跑ViT-Small加上4尺度输入单张图大概200毫秒勉强够用但产线节拍紧的话还是有压力。加上GPU哪怕是单张消费级显卡推理后单张耗时能压到30毫秒左右基本满足多数齿轮产线3到5秒一个零件的节拍。千万要记住实际产线还有图像采集、PLC通信和结果上传的时间算法耗时最好留够余量。7.2 与产线系统对接时容易忽略的通信细节算法不是孤立的它需要接收触发信号、返回检测结果、联动剔除机构。我踩过比较典型的坑是图像采集与PLC信号之间的时序齿轮端面检测有多个工位或者多次拍照时如果PLC信号触发过早图像里可能拍到上一个零件的残影或机械手遮挡。解决方案是加一段软件延时等工装完全稳定后再触发拍照并且与PLC握手协议里加入“待机-触发-完成”三状态反馈。检测结果的下发逻辑也要提前设计好。不是单纯输出“OK/NG”就行建议输出缺陷类别、框坐标、置信度、裁剪图这样产线工艺工程师可以直接定位到问题区域。判定逻辑建议放在上位机层现场维护人员可以修改阈值和判定规则不用每次都改算法模型。8. 从V1到V2这个项目后续还能怎么扩展第一阶段能跑通检测分类后我建议从两个方向扩展。第一个方向是增加工艺反馈比如把磨削烧伤的检测结果与磨床工艺参数关联起来当连续多件出现烧伤趋势时自动反馈给磨削工艺做参数调整这会从“检出缺陷”升级到“预防缺陷”。第二个方向是增加无监督异常检测分支用DINO的特征做embedding对未标注的新增异常类型进行聚类识别减少新品类缺陷出现时的人工介入成本。如果产线的节拍进一步提高多相机并行或者边缘端部署是绕不开的路。DINO-ViT的结构相对偏重可以考虑在第二阶段蒸馏一个轻量的CNN模型来替代精度可能会掉1到2个百分点但速度可以提升数倍。这类深度优化更适合拿到稳定效果之后再做。项目标题里面的“_1”也说明这只是一个开始后续的迭代空间还很大。9. 写在最后这个项目最有价值的收获不是模型精度指标而是完整走通了一条“自监督预训练多尺度融合检测分类”的工业落地路径。齿轮端面只是载体换到轴承滚子、连接器表面、PCB基板这类同样存在小样本、多尺度、细纹理问题的质检场景这套方案的核心思路完全可以直接迁移。要记住一点工业检测项目的成功很大程度上取决于数据工程和成像方案的扎实程度模型结构只是其中一环。把光照做好、标注统一、训练节奏稳住模型自然会给回报。如果刚开始跑结果不理想不要急着怀疑DINO-4Scale这个结构先回到数据和预处理里仔细排查多半能找到答案。