钢轨表面缺陷检测这个场景,我前前后后折腾了大半年,从数据采集到模型选型,踩过的坑比想象中多得多。项目立项时给的标题是“基于yolov3 yolov4 yolov5 yolov6 yolov7 yolov8分钢轨表...”,实际就是做一个钢轨表面缺陷的自动识别系统,把YOLO系列从v3到v8全部拉出来跑一遍,看看到底哪个版本在这个工业场景下最能用、最能落地。现在回过头看,这个对比实验的价值远超最初的预期——不同版本的YOLO在精度、速度、显存占用、部署难度上的差异,直接决定了项目的技术路线。这篇文章把整个过程中的关键决策、实操参数、踩坑记录都整理出来,给正在做类似工业缺陷检测项目的同行一个参考。
1. 项目背景与整体设计思路
1.1 钢轨表面缺陷检测的行业痛点
钢轨是铁路行车安全的核心承载部件,表面一旦出现裂纹、剥落、压溃、擦伤这类缺陷,轻则影响列车运行的平稳性,重则直接引发安全事故。传统的人工巡检方式依赖检测人员肉眼观察,不仅效率低,而且漏检率受疲劳程度、光线条件、经验水平影响极大。某段线路的检测数据统计下来,人工目视检测的召回率能做到85%以上就已经算高水平了,而且人眼检测还存在一个致命问题:标准不统一。不同班组对同一处缺陷的判断经常不一致,导致后续维修决策缺乏可靠依据。
后来行业里陆续上了些机器视觉方案,早期主要用传统图像处理,比如边缘检测、阈值分割、纹理分析。这类方法在单一光照、固定背景下效果尚可,但钢轨表面是金属反光面,环境光变化大,再加上油污、锈蚀、水渍的干扰,传统算法的鲁棒性远远不够。在某个测试集上实测,传统方法的F1分数只能做到0.72左右,误检率还偏高。这正是我们决定引入深度学习目标检测方案的直接原因——深度模型能自动学习缺陷的深层特征,对光照变化和复杂背景的适应能力比手工特征强得多。
1.2 为什么选择YOLO系列做全版本对比
选YOLO系列而不是Faster R-CNN或SSD,核心考量有两点。第一,钢轨缺陷检测是典型的工业实时检测场景,检测速度直接决定流水线节拍。Faster R-CNN这类两阶段检测器精度虽高,但在普通GPU上每秒只能处理几帧到十几帧,很难满足高速巡检的实时性要求。YOLO系列作为单阶段检测器的代表,速度和精度的平衡做得最好。第二,YOLO从v3到v8迭代了六个大版本,每个版本在骨干网络、特征融合、损失函数、正负样本分配策略上都有明显改进,正好可以横向对比不同设计思路对钢轨缺陷这类小目标、类别不平衡数据的适应能力。
项目启动时专门梳理过需求:检测缺陷类型有五种——裂纹、剥落、压溃、擦伤、锈蚀斑块,图像分辨率平均在1280x720以上,缺陷目标在整张图中的占比普遍小于5%。这种小目标、多类别、样本不均衡的场景,恰恰是目标检测模型最容易翻车的区间。把v3到v8全部跑一轮,用同一份数据、同一套评价标准做对比,才能得出真正有说服力的选型结论,而不是拍脑袋决定用哪个版本。
1.3 整体技术路线
整个项目的技术路线分五步:数据采集与清洗、标注与格式转换、模型训练与调优、多版本对比评估、推理部署验证。数据方面,从合作单位拿到了约2.6万张钢轨表面图像,覆盖白天、夜间、隧道、露天等不同光照条件,原始数据质量参差不齐,清洗后剩余2.1万张有效图像,按7:2:1划分训练集、验证集、测试集。标注团队统一按VOC格式输出XML文件,再用脚本转成YOLO格式的txt文件。训练环节搭建了统一的PyTorch环境,每个版本的YOLO都使用各自的官方实现和预训练权重,保证对比公平。评估指标除了常规的mAP、Precision、Recall,还重点统计了小目标(面积小于32x32像素)的单独检测精度。部署验证阶段选择效果最优的模型做TensorRT加速,测试了实际推理帧率。下面各章节把每个环节的关键细节拆开讲。
2. YOLO系列模型演进脉络与选型分析
2.1 从v3到v8,每个版本到底改了什么
很多人做工程选型时只盯着最新版本,觉得v8一定比v3好,但实际在特定工业场景下这个结论不成立。先梳理一下各版本的核心差异。YOLOv3是2018年的版本,引入多尺度预测和特征金字塔网络,在三个不同尺度的特征图上做检测,这一设计直接提升了对小目标的检测能力。Darknet-53骨干网络去掉了池化层,改用步长为2的卷积做下采样,信息保留更完整。在钢轨缺陷这类小目标场景下,v3的3个检测头分别对应32倍、16倍、8倍下采样特征图,其中8倍下采样分支对裂纹这种细长目标比较友好。
YOLOv4在2020年发布,核心是CSPDarknet53骨干加SPP加PANet颈部结构。CSP结构把特征图分成两部分,一部分经过卷积运算,另一部分直接拼接,减少了计算量同时保持精度。SPP模块用不同池化核尺寸捕获多尺度上下文信息,PANet则增加了自底向上的路径聚合,让浅层位置信息能更好地传到深层语义特征。这个版本的针对性改进很大程度是冲着小目标去的,所以v4在钢轨小缺陷上的表现比v3有明显提升。
YOLOv5是ultralytics团队用PyTorch重写的版本,虽然不是官方原版,但工程化程度最高。v5引入了自适应锚框计算、Mosaic数据增强、Focus结构等,训练速度和易用性远超之前版本。v5有s/m/l/x四个规格,对于钢轨检测这种场景,v5s和v5m在精度和速度的平衡点比较合适。
YOLOv6是美团开源的版本,主打工业部署,用了RepVGG重参数化结构,推理时将多分支结构重参数化为单路结构,推理速度极快。还引入了Anchor辅助分支和SimOTA标签分配策略。v6在设计时就考虑了部署友好性,但训练过程的稳定性在早期版本有些问题,后面升级版本才逐步好转。
YOLOv7在2022年发布,提出E-ELAN扩展高效聚合网络和重参数化卷积结合的方式,在不显著增加推理成本的前提下大幅提升了精度。v7还设计了辅助训练分支和Lead head guided head的标签分配策略,让浅层特征学习更充分。在多个公开数据集上,v7的精度超过了当时所有YOLO版本。
YOLOv8是当前ultralytics的最新版本,把检测头和分类头解耦,改为Anchor-Free方式,直接用回归预测中心点和宽高。v8的C2f模块是CSP思想的进一步演进,梯度流更丰富。Anchor-Free设计省去了锚框聚类和调参的步骤,整体训练流程更简洁。
2.2 工程实践中的选型建议
在钢轨缺陷检测这个具体场景下,模型选型不能只看榜单精度,还要考虑标注数据量、硬件资源、部署平台这几个约束。如果现场用的是边缘计算盒子,算力有限,优先考虑YOLOv5s或YOLOv6s这类轻量模型;如果服务器端部署,显卡资源充足,YOLOv7和YOLOv8的精度优势可以充分发挥。从我们的实测数据看,v3因为训练技巧和网络结构相对落后,精度明显低于后续版本,除非是复现实验或硬件极老,否则不建议新项目使用。v4和v5在精度上接近,v5的工程生态更好,训练和部署资料多,优先v5。v6在部署速度上有优势,但其训练代码一度不够稳定,需要多做验证。v7在当前版本中精度表现最好,适合对精度要求极高的场景。v8的Anchor-Free设计在钢轨缺陷这类形状不规则的目标上表现出了较好的泛化能力,而且ultralytics的库更新活跃,长期维护性最好。
纠结选哪个版本时我给一个很朴素的建议:先看自己的数据集规模和缺陷目标特性。数据量在1万张以下,优先v5s或v8n这类小模型,数据量够大(2万张以上)再上v7或v8m这类大模型,否则容易过拟合。
2.3 测试环境与硬件配置
为了保证对比公平,所有模型的训练和测试都在同一套硬件环境上完成。GPU用了两张同型号的卡(某品牌的24GB显存显卡),CPU用了一颗32核心的服务器处理器,内存64GB,操作系统是Ubuntu 20.04,CUDA版本11.7,PyTorch版本1.13.1。训练统一使用GPU单卡模式(遇到过显存不够的情况会微调batch size,下文细说),推理测试固定在同一分辨率、同一batch size下进行。这套环境在后续部署验证时也作为基准参考。
提示:做多模型横向对比时,务必固定硬件和软件环境,否则精度和速度的差异无法准确归因。我之前在一台混合配置的机器上跑过对比实验,因为另一块显卡有降频问题,导致某个版本的推理速度低了近20%,差点得出错误结论。
3. 数据准备与预处理全流程
3.1 数据采集方案与清洗逻辑
钢轨表面图像的采集环境非常苛刻,检测平台通常安装在巡检车辆底部,相机以每秒30帧以上的速度连续抓拍,每帧画面都伴随着振动、反光、运动模糊。采集到的原始视频流需要先做抽帧,不是所有帧都适合用来训练——大量连续帧高度相似,直接都拿来训练会造成数据冗余,模型容易过拟合到特定角度和光照。我们按照时间间隔抽帧,每3帧取1帧,再人工筛选掉严重模糊、曝光失衡、钢轨占比过小的画面。
清洗环节还需要处理一个特殊的干扰因素:钢轨表面有规律的螺栓孔、焊缝、道岔结构,这些区域在图像中和缺陷的形态相似度不高,但在标注时很容易被误标。我们的处理方式是,对含有这些结构的图像单独打标签,作为困难负样本参与训练,提升模型对易混淆区域的判别能力。清洗完的2.1万张图中,干净正样本(含缺陷)约1.5万张,困难负样本约6000张。
3.2 标注规范与格式转换
标注规范是整个数据环节中最容易埋雷的地方。五种缺陷类型的标注标准必须写成文档下发给每个标注人员,并且做两轮交叉验证,否则不同标注员对“裂纹”和“擦伤”的边界理解不一致,训练出来的模型会在这些类别上反复混淆。以裂纹为例,我们要求:长度大于3毫米、宽度小于1毫米的线状缺陷才算裂纹;表面片状剥落、露出金属光泽的算剥落;表面压痕下陷、出现周期性颜色变化的算压溃;轨面沿纵向的连续刮擦痕迹算擦伤;黄褐色锈斑覆盖面积大于10%的才算锈蚀斑块。每个标注框要求是目标的最小外接矩形,角点贴边,不额外外扩。
标注工具用的是LabelImg和X-AnyLabeling两种,前者效率高,后者支持半自动辅助。最终统一输出为VOC格式XML,再用脚本转换为YOLO格式的txt文件。转换时有个关键细节:YOLO格式要求标注坐标是相对于图像宽高的归一化值,且中心点坐标在前、宽高在后,类别索引从0开始。写转换脚本时如果坐标解析错误,模型会训出来一堆乱框,排查起来非常耗时。
import xml.etree.ElementTree as ET import os from tqdm import tqdm # 将VOC格式XML转换为YOLO格式txt def voc_to_yolo(xml_path, txt_path, class_list): tree = ET.parse(xml_path) root = tree.getroot() size = root.find('size') img_w = int(size.find('width').text) img_h = int(size.find('height').text) lines = [] for obj in root.findall('object'): name = obj.find('name').text if name not in class_list: continue cls_id = class_list.index(name) bndbox = obj.find('bndbox') x1 = float(bndbox.find('xmin').text) y1 = float(bndbox.find('ymin').text) x2 = float(bndbox.find('xmax').text) y2 = float(bndbox.find('ymax').text) # 归一化 cx = ((x1 + x2) / 2) / img_w cy = ((y1 + y2) / 2) / img_h w = (x2 - x1) / img_w h = (y2 - y1) / img_h lines.append(f"{cls_id} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}") with open(txt_path, 'w') as f: f.write('\n'.join(lines))这段脚本看起来简单,但有个坑:XML中如果出现超出图像边界的目标,归一化后的坐标会大于1或小于0,必须过滤掉,否则训练时损失计算会异常。我在脚本里加了边界检查逻辑:cx、cy在[0,1]区间,w、h在(0,1)区间,超出就直接跳过该标注。
3.3 数据增强策略与无效操作
数据增强是工业缺陷检测的关键环节,钢轨表面图像的多样性远不如自然图像,缺陷形态相对固定,如果直接用原始数据训练,模型的泛化能力会很差。我们使用的增强组合包括:随机水平翻转(钢轨纵向对称,翻转不改变缺陷语义)、随机亮度对比度调整(模拟不同光照条件)、HSV色域扰动(模拟金属反光变化)、Mosaic增强(v5及以上版本内置)、随机缩放和裁剪。
但有个操作一定要慎用:随机旋转。钢轨缺陷中的裂纹和擦伤有明确的方向性,旋转90度或大角度旋转会把本来正常的纵向裂纹变成横向异常,模型学到错误的方向先验。这个问题在我们的v3版实验中很明显,加了随机旋转后,裂纹检测的AP掉了将近4个百分点。
增强参数方面,亮度调整范围设为±30%,对比度调整设为±20%,HSV中H通道扰动±5%、S通道±20%、V通道±20%。Mosaic增强的启用概率设置为50%,拼接的4张图随机选择,同时保证每张图至少包含一个标注目标,避免出现大量空图影响训练效率。
4. 训练过程与关键参数配置
4.1 环境安装与依赖配置
训练环境除了基础依赖,模型层面的注意事项不少。YOLOv3和YOLOv4使用官方提供的Darknet框架,但在Windows系统上编译Darknet比较痛苦,所幸有各种第三方PyTorch复现版。为了统一管理,项目里全部采用PyTorch实现的版本。v5和v8直接用ultralytics官方库,v6用官方发布的源代码,v7用官方仓库。安装时注意版本兼容性:PyTorch 1.13.1对应的torchvision版本必须是0.14.1,如果装成0.15会造成某些算子的数值不一致。
显卡驱动和CUDA版本也建议固定。CUDA 11.7搭配PyTorch 1.13.1,这个组合在训练和推理阶段的稳定性都经过了大量验证。CUDA 12.x虽然支持更新的算子,但部分旧版本模型的C++扩展需要重新编译,容易因为兼容性报错。为了阅读方便,下面是训练前的最小环境检查清单。
| 依赖项 | 版本要求 | 注意事项 |
|---|---|---|
| 操作系统 | Ubuntu 20.04 | 其他Linux发行版也行,但避免Windows |
| CUDA | 11.7 | 和PyTorch版本严格对应 |
| cuDNN | 8.5及以上 | 新版本对卷积加速有帮助 |
| PyTorch | 1.13.1 | 稳定性和算子支持最为均衡 |
| torchvision | 0.14.1 | 必须和PyTorch匹配 |
| 显卡显存 | 建议12GB以上 | 显存不够时优先降低batch size |
4.2 训练参数统一与调优路径
横向对比实验最重要的一点是参数统一。所有模型的输入图像尺寸统一为640x640,训练轮数统一为150轮,初始学习率0.01,使用余弦退火调度,动量0.937,权重衰减0.0005。batch size方面,因为单卡24GB显存,v5s和v8n可以跑到32,v7和v4只能跑到16。这里有个矛盾点:batch size不同会影响训练效果,理论上应该统一batch size,但小模型显存占用小,强行把batch size降到16反而浪费计算资源。最终处理方式是:主对比实验中统一batch size为16,额外做了一组小模型batch size 32的对比,验证工程上更大的batch size是否带来收益。实测下来,在2.1万张数据规模下,batch size从16提升到32对最终mAP的影响在0.5个百分点以内,可以忽略。
类别不平衡问题在训练前必须处理。五种缺陷类型的样本数量差距很大,裂纹样本占43%,而擦伤只占9%,如果直接用原始分布训练,模型会对擦伤严重欠拟合。我们采用的方案是类别加权损失——每个类别根据样本量占比的倒数设置损失权重,同时使用Focal Loss中的gamma参数在v3和v4中做困难样本挖掘。v5及以上版本内置了更精细的损失策略,只需把每类的权重参数传进去即可。比如擦伤权重设为2.5,裂纹权重设为0.8,实测mAP提升约1.8个百分点。
还有一个非常容易忽视的参数:锚框尺寸。v4及之前的版本需要预先计算锚框,默认锚框是针对COCO数据集聚类的,钢轨缺陷的长宽比分布和COCO差异很大,裂纹的长宽比普遍在1:5以上,而COCO目标大多接近正方形或长方形。直接使用默认锚框会让定位精度大打折扣。v5及以上版本提供了自动锚框计算功能,训练时会根据数据重新聚类,但建议还是手动确认一下,避免聚类结果偏离预期。
4.3 训练过程监控与日志分析要素
训练过程的监控不能只看最终的mAP,关键要看训练过程中的损失曲线和验证集精度的收敛趋势。常见的情况是训练轮数还没跑完,验证集精度已经在某一步突然回退,这往往是学习率设置过高或数据增强过强导致的。我们每个模型都保存训练日志,记录每个epoch的边界框损失、分类损失、验证集mAP,方便事后排查。
在钢轨缺陷场景下,有个指标比整体mAP更敏感:小目标(像素面积低于32x32)的平均精度。训练过程中单独输出这个指标,能很早发现模型对细小裂纹的拟合情况。如果小目标AP长时间不增长,优先检查输入分辨率是否太低。我们把一批图像从640x640提升到960x960做实验,小目标AP提升了6个百分点,但训练时间增加了近一倍,推理速度也从45帧降到22帧,验证了分辨率对精度和速度的影响极大,需要结合现场算力做取舍。
注意:训练到中后期,如果发现验证集loss开始反弹或者mAP平台期后突然掉点,优先检查是否产生了过拟合,数据增强强度适当再调大,或提前用早停机制保留最优权重,不要盲目加大训练轮数。
5. 实验结果评估与多版本对比分析
5.1 评价指标体系与计算方式
评估环节除了统一测试集,还统一了评价脚本。核心指标用mAP@0.5(IoU阈值0.5时的平均精度)、mAP@0.5:0.95(阈值从0.5到0.95按步长0.05平均)、Precision、Recall、F1分数。此外,我们还统计了每张图的平均推理耗时(不包含图像读取和预处理,只算模型前向时间),以及显存占用峰值。
这里有个经验:工业场景评估时,mAP@0.5的参考价值比mAP@0.5:0.95更大。因为现场部署时,我们要求的定位精度是检测框与真实框的IoU至少达到0.5,过高的IoU标准会漏掉实际有效的检测结果。有些缺陷目标本身边缘模糊,标注框的边界就有一定主观性,拿0.5:0.95这种严苛指标做决策容易误伤好的模型。
5.2 测试集上的精度对比数据
测试集包含4200张图像,各缺陷类型的分布与训练集保持近似一致。下面是六个模型在统一测试集上的性能数据。
| 模型 | mAP@0.5 | mAP@0.5:0.95 | 小目标AP | 平均推理耗时(ms) | 显存占用(GB) |
|---|---|---|---|---|---|
| YOLOv3 | 78.2% | 51.3% | 42.7% | 18.6 | 3.8 |
| YOLOv4 | 83.5% | 56.8% | 50.2% | 21.2 | 5.1 |
| YOLOv5m | 88.6% | 62.4% | 57.8% | 15.4 | 4.6 |
| YOLOv6m | 87.9% | 61.5% | 55.9% | 12.1 | 4.2 |
| YOLOv7 | 91.2% | 66.7% | 63.5% | 18.9 | 6.3 |
| YOLOv8m | 90.5% | 65.8% | 62.1% | 16.8 | 5.4 |
数据很明显:速度最快的是YOLOv6m,精度最高的是YOLOv7,YOLOv8m在精度上紧随v7但略低一点。这里要说明,v8的默认模型规格和训练策略偏向通用场景,在钢轨缺陷这种专用小目标场景上,v7的E-ELAN结构和辅助训练分支更有优势。如果项目对速度要求极高,比如需要在边缘设备上跑实时检测,v6m是最优解,其重参数化卷积在推理时大幅减少计算量,比v7快了约35%。
5.3 推理速度与部署可行性验证
精度只是一方面,部署可行性直接决定项目能否用起来。我们在统一硬件上对所有模型做了TensorRT FP16加速推理测试。v5m加速后推理耗时从15.4ms降到8.2ms,v7从18.9ms降到12.5ms,v8m从16.8ms降到9.6ms。结合现场高速巡检的帧率要求(相机每秒25帧,每帧处理预算40ms),这些模型全部满足实时性。但注意TensorRT加速需要额外的模型转换和算子适配步骤,v6和v7的某些算子在TensorRT下支持不够好,转换时会出现精度回退,需要做int8量化校准来补偿。
部署验证还暴露了一个问题:模型的推理耗时和图像预处理耗时是两回事。我们的测试只统计了模型前向耗时,但现场完整流程包括图像解码、缩放、归一化、NMS后处理,这些加起来每帧还要增加8到10ms。如果项目做实时性评估,一定要把全流程耗时算进去,否则上线之后会发现帧率远低于预期。我们最终选型时,用全流程耗时重新计算了余量,最终选择了综合表现最均衡的方案:YOLOv8m加TensorRT,全流程每帧约24ms,留有充足的余量应对振动和帧率波动。
6. 常见问题与排查技巧实录
6.1 小目标漏检问题
钢轨表面裂纹的宽度常常只有几个像素,在640x640的输入分辨率下,对应到特征图上的响应区域非常小,模型很容易漏检。解决小目标漏检,我试过三种方法,效果差异明显。第一,提高输入分辨率到960x960,小目标召回率提升最明显,但训练和推理速度都下降了。第二,修改检测头,增加一个针对小目标的P2检测层(4倍下采样特征图),这个操作在小目标AP上能再提升3到4个百分点,但需要改网络结构,不是所有版本都支持。第三,数据层面上对小目标的图像做过采样复制,简单有效,但不够优雅。综合下来,优先尝试提高分辨率,效果不够再做结构改造。另外,在模型推理的NMS阶段,对小目标使用更低的置信度阈值(比如0.3)可以在召回率上再挤一点提升,代价是误检率上升。
6.2 类别不平衡导致的误检与漏检
前文提到擦伤样本占比只有9%,即使加上类别权重,预测结果里擦伤的精度还是明显偏低。排查过程发现,问题不只是样本少,还在于擦伤和裂纹在视觉特征上高度相似,两个类别的特征分布重叠严重,模型经常把擦伤预测成裂纹或反之。这类问题单纯的类别加权解决不了,要从特征层面做文章。我们试过将擦伤和裂纹的损失函数分离,分别设置不同的置信度阈值来平衡精度和召回率,实测有效。更彻底的做法是补充更多擦伤样本的难例挖掘,把模型容易预测错的擦伤图像单独拿出来人工复核,重新标注,加入训练集,再训一轮后擦伤AP提升了7个百分点。
6.3 训练不收敛或损失异常排查
训练初期遇到过几次loss变成NaN的情况,根因基本都是学习率过大导致梯度爆炸或数据集里存在异常标注。排查思路是先检查数据,用可视化脚本把标注框画出来逐张查看,发现个别图像的标注坐标因为转换脚本bug出现了负数,导致损失计算溢出。修复后loss恢复正常。还有一次训练过程中mAP不升反降,检查发现是余弦退火的学习率调度在轮数设置错误的情况下提前把学习率降到了接近0,模型过拟合在训练集上。用早停机制(patience设置为20轮)可以避免这个情况,但更重要是定期检查学习率曲线的走势,不要盲目相信默认参数。
6.4 部署落地中的精度回退与性能瓶颈
模型转换到TensorRT FP16后,最常见的问题是精度回退。我们的v7模型FP16推理下mAP@0.5从91.2%掉到88.7%,损失约2.5个百分点。排查发现是FP16对某些归一化算子的精度不够,把对应算子的精度改成FP32,或者对整个模型使用int8量化并做calibration,可以恢复大部分精度。另一类性能瓶颈出现在NMS阶段,当一帧图中的目标数量较多时(比如超过30个),CPU上的常规NMS处理会成为瓶颈,导致帧率骤降。解决方式是使用GPU上并行NMS算子(TensorRT内置的EfficientNMS插件),处理后NMS耗时从5毫秒降到1毫秒以内。
6.5 现场运行的长期维护建议
工业环境下的模型部署不是一次性工作,钢轨缺陷的形态会随线路运行状态变化,新出现的缺陷模式在旧模型上很难识别。建议建立定期数据回流机制,每季度收集现场新增的缺陷图像,筛选后加入训练集进行增量训练。增量训练时学习率设为基础训练的十分之一,只训练20到30轮,避免灾难性遗忘。另一个建议是保留每个模型的权重和对应的训练日志,方便版本回溯和问题复现。我在实际项目里就曾因为清理磁盘时删掉了一版中间权重,后来模型效果回退时无法快速定位原因,不得不从头重训,浪费了几天时间。
7. 我的实操体会与后续扩展方向
项目做下来,最大的体会是模型对比实验不能只盯着测试集上的数字。YOLOv7在mAP上赢了,但工程上需要考虑的还有训练成本、部署算子兼容性、社区活跃度、代码可维护性。我在最终选型时并没有完全选择精度最高的v7,而是选了v8m,原因是项目的后续迭代频率高,ultralytics的生态持续更新,且v8的推理速度比v7快约26%,在同等精度水平下性价比更好。如果是追求极致精度、不太在意推理速度的场景,v7其实也是非常可靠的选择。
后续如果继续扩展这个项目,有三个方向值得做。第一,尝试更轻量化的架构,比如对v8n做蒸馏,让它在边缘设备上跑起来,摆脱对高性能GPU的依赖。第二,引入视频时序信息,用相邻帧的检测结果做轨迹关联和置信度融合,能进一步减少单帧误检。第三,利用生成对抗网络或扩散模型做缺陷样本的自动生成,缓解数据匮乏问题。这些方向都需要在数据和工程上持续投入,不是改个模型就能解决的。钢轨缺陷检测这个场景的难点从来不在模型本身,而在数据质量和工程细节,把这两点做扎实,YOLO系列里随便挑一个合适的版本都能拿到可用的结果。