☰
基于YOLO26的无人机桥梁裂缝检测实战:数据清洗、训练与部署
2026/10/19 14:40:25 网站建设 项目流程

无人机去拍桥梁,拍回来的素材动辄上万张照片,真正让人头疼的不是飞行本身,而是后面那堆照片怎么处理。我前阵子把一个混凝土结构缺陷识别项目完整跑了下来,从数据清洗、标注、训练到部署都走了一遍,核心检测器最终选型落在YOLO26上,用无人机桥梁巡检数据集的第10409期数据作为训练底子,这套方案算是已经真正进了工程流程,不是只在笔记本上跑个Demo那种。这篇文章把我的决策依据和实操过程完整梳理一遍,模型选型怎么算账、裂缝框怎么打、训练参数怎么调、部署之后哪些误检必须处理,都会讲到。如果你也在做桥梁裂缝巡检、混凝土建筑安全评估、工程质量巡检智能化这摊事,应该能从里面捞到不少能直接用的经验。

1. 桥梁缺陷检测这个任务,难点从来不在模型

1.1 一张无人机照片里的裂缝,为什么这么难找

先说个很多人刚开始做时会踩的认知误区:以为缺陷检测就是把通用目标检测模型下载下来,标点数据扔进去训练,就能得到不错的结果。真把无人机在桥底、桥墩、桥面上拍的影像打开看,你会发现事情远没有这么简单。

裂缝在图像里的形态,跟常见的行人、车辆、猫狗完全不是一个物种。它是一条极细长的线性结构,可能横穿整张图,长宽比极端到几十比一,宽度上经常只有两三个像素。一张640像素分辨率下拍摄的照片,如果裂缝实际宽度只有5毫米,它在图里可能就只占2到3个像素点。通用检测模型默认是为“块状目标”设计的,锚框和标签分配策略都倾向于覆盖圆形、方形物体,遇到这种又细又长的目标,一个框很难贴合它,模型学起来也会很痛苦。

更麻烦的是背景干扰。混凝土表面本来就不是干净的灰色,有水渍、有模板接缝、有蜂窝麻面、有伸缩缝、有划痕,这些东西在图像特征上和裂缝高度相似。尤其是桥面的伸缩缝和施工冷缝,肉眼都不太好分辨,模型误检几乎是必然。无人机视角还会带来额外的尺度问题:同一座桥,飞到10米高和飞到30米高拍同一道裂缝,像素宽度完全不一样;桥底的阴影、逆光、雾气又会让对比度波动很大。你拿一个在公开数据集上map很高的预训练模型过来,在这些图上往往连基本的裂缝都框不出来。

所以我把这个项目的第一个阶段就定义为“数据攻坚战”,模型反而是放到后期才定的。这也是我想强调的一点:缺陷检测项目的天花板,大部分时候不是由模型决定的,而是由你对数据和任务的理解深度决定的。

1.2 从业务需求倒推:检测目标到底定义到什么粒度

模型学什么、检测框里装的到底是什么,这个定义一定要在标注之前想清楚。我见过不止一个团队,一开始把缺陷类别列得很细,“细微裂缝”“网状裂缝”“纵向裂缝”“横向裂缝”全是独立类别,结果标注员看图看得崩溃,模型也学得混乱,最后map低的没法看。

桥梁巡检的真实业务诉求,其实可以拆成两个层次:第一层是“有没有缺陷”,第二层是“缺陷严不严重、属于什么类型”。对自动巡检系统来说,第一层是必须保证的,第二层是加分项。我在这个项目里最终把目标类别定为五类:

  • 裂缝:单条线状裂缝,不管走向
  • 露筋:钢筋外露,通常伴随混凝土剥落
  • 剥落:表层混凝土成块脱落
  • 蜂窝麻面:表面粗糙、有大量孔洞
  • 渗水:桥体表面明显的水迹、钙化痕迹

渗水这类缺陷其实不是结构安全问题,但它是巡检报告里必须记录的表观病害,能提示潜在渗漏通道,所以也纳入了检测范围。这么做的好处是标注标准清晰,每张图该打什么框不用纠结,模型的学习负担也更小。风险是“裂缝”这个大类下面混了好几种不同的图像形态,网络需要自己学会把这些形态归到同一个语义下,这就对训练数据的多样性提出了更高要求。

检验检测粒度的办法很简单:让两个标注员分别标同一张图,如果两人画的框重合度(通常用IoU衡量)能稳定在0.85以上,并且类别判定一致性在95%以上,那这个粒度就是合理的;如果每次都吵起来,说明粒度定义有问题,应该合并类别或者重新写标注规则。

2. 选型YOLO26之前的账,我算得很细

2.1 目标检测模型的路线,为什么最终落脚到YOLO26

目标检测这几年迭代非常快,从两阶段检测器到单阶段检测器,再到无锚框方案和基于Transformer的端到端检测,选择非常多。我对YOLO系列跟踪得比较久,从早期版本一直看到后来的v8、v9、v10系列,再到这次用的YOLO26版本。这个版本延续了YOLO系列轻量高效的传统,同时把一些新机制吸收进来:主干网络在保持较高特征分辨率的前提下加深了跨阶段连接,特征融合部分对不同尺度的信息交互更充分,检测头也从纯锚框方式转向更灵活的标签分配和预测方式。这些变化对通用目标检测来说可能只是几个点的map提升,但对裂缝这种极端长宽比、小像素占比的目标,影响就非常直接——高分辨率特征图保留得越多,细长度目标越不容易在降采样过程中丢失。

选型时我还有一个很现实的需求:这个模型要能在无人机地面站的边缘设备上跑起来,最好还能用推理框架加速。YOLO系列在部署侧的生态成熟度是其他很多模型比不了的,导出、量化、加速的踩坑资料多,遇到问题不会卡住。这一点对于工程落地来说,往往比纯精度指标更重要。

2.2 三个候选方案的对比表

我在正式定YOLO26之前,实际对比测试了三个方向,分别是YOLOv8、RT-DETR和YOLO26。测试数据就用第10409期无人机巡检数据集里的验证集,量级是几百张真实巡检影像。单卡训练同样多的epoch,在相近的推理速度下做对比,结果参考价值比较高。

对比项YOLOv8RT-DETRYOLO26
小目标召回率中等中等偏上较好
细长目标贴合度一般较好较好
训练收敛速度快中等快
边缘部署生态成熟一般成熟
后处理复杂度需要NMS无需NMS但阈值敏感需要NMS
调参友好度高中等高

这里每个模型的数字我不展开贴,因为不同版本、不同复现方式差异较大,说了反而误导。我想分享的是当时做决定时最关键的三个理由:一是YOLO26在同等推理耗时下,对小目标的召回率明显比v8好,这对裂缝检测来说是核心指标;二是它的训练策略和v8一脉相承,团队迁移成本低;三是部署工具链成熟,能直接走导出加速流程,不用额外花时间适配。RT-DETR在精度上没有拉开差距,部署适配成本反而更高,就排除了。

提示:选型不要只看榜单map。拿自己的数据、自己的标注规则、自己的推理设备去跑一轮对比,再富裕的模型论文数字也不如你自己训出来的一版结果可信。

3. 第10409期无人机巡检数据集的整理与标注全流程

3.1 原始影像的清洗与筛选:哪些图必须丢掉

无人机拍回来的原始素材是视频流和连续照片,里面大量帧是不可用的。我拿到第10409期数据的第一件事不是标注,而是做一轮严格清洗。清洗规则我列一下,基本可以作为这类项目的通用标准:

  • 运动模糊帧直接丢。无人机悬停不稳或者转弯时拍的帧,裂缝边缘全是拖影,模型学不到真实纹理。
  • 曝光严重失衡的帧视情况处理。桥底逆光场景经常暗成一片,如果只是局部阴影可以保留,如果整幅图都死黑或死白,丢掉。
  • 拍摄高度波动过大的帧分开归档。高度差异意味着尺度差异,可以把高、中、低三个高度段作为三个子集合,按比例放进训练集,避免模型只适应某一种尺度。
  • 遮挡严重的帧丢掉。桥下常有杂草、电线、施工脚手架,如果目标区域被遮掉一半以上,这个框即使标了,学出来的特征也是错的。

清洗完剩下的影像,还需要按地面分辨率做一次统计。我建议用“每像素对应实际毫米数”这个指标来管理数据,而不是单纯按飞行高度归档,因为不同镜头焦距下同样的高度差异很大。这个项目里的大部分影像地面分辨率在2到5毫米/像素之间,个别桥墩底部特写能到1毫米/像素左右,数据整体分布比较健康。如果发现某些分辨率的样本很少,就要考虑补充拍摄,而不是靠增强硬撑。

3.2 标注规范:裂缝框怎么打才符合模型特性

标注规范是整个项目里最容易被低估的环节。通用检测标注教的是“框住整个物体就行”,但裂缝不一样,框的态度直接决定训练效果。

我吃了不少亏之后,定下的标注规范是这样的:一条连续的、属于同一物理裂缝的缺陷,用尽可能贴合的最小外接矩形框住,但框的边不要紧贴裂缝边缘,留出2到3个像素的余量,避免框线把裂缝的暗色边缘截掉。如果一条裂缝在图上被阴影或遮挡分成两段,但肉眼能判断它们是同一条,我会标成一个框,宁可框里带一点背景,也不要拆成两个框去破坏连续性;如果两段裂缝明显呈不同走向,比如一条横向一条纵向,就分开标两个框。

这个规则的关键在于:模型学的是“裂缝作为一个整体目标”的模式,而不是学一堆碎片。如果标注时习惯性拆框,推理时模型就会倾向于把一条完整裂缝预测成好几段,后处理阶段怎么拼都拼不干净。

裂缝之外的四类缺陷,标注就简单多了,原则是框住缺陷主体区域,包含完整边缘。这里有个额外建议:收集一批“难负样本”作为背景图单独放着,比如干净但纹理复杂的混凝土面、带水渍的桥墩、生锈的栏杆。这些图不放任何标注框,偶尔混进训练批次里,能显著压低误检率。这个做法比单纯调置信度阈值有用得多。

3.3 数据集划分与类别不均衡处理

数据划分上有一个容易踩的坑:同一座桥不同角度、不同飞次的影像,内容高度相似,如果随机分割,模型可能在训练集里见过测试集的“远亲”,评估结果虚高。项目上我按桥梁对象来做分组建模,保证同一座桥的影像只出现在训练、验证、测试其中一个集合里,测试结果才是真实可信的。这一点在对外汇报精度时非常重要,不然你以为模型很好,一到新桥上一塌糊涂。

类别不均衡方面,第10409期数据集里裂缝样本占了大头,露筋和渗水相对少,蜂窝麻面更少。我做了几件事:一是对少样本类别做简单复制粘贴增强,把它们贴在干净背景上,同时保留原始样本;二是调整训练时的类别采样权重,让模型在每个batch里都能看到足够的少数类;三是对少样本类别的置信度阈值单独设置,推理时给它们更宽容的判定标准。这几个操作配合下来,少样本类别的召回率提升很明显,代价是误检略有上升,这个可以用后处理去压。

4. YOLO26训练实测:参数配置、loss曲线和踩坑记录

4.1 关键训练参数怎么定

模型确定之后,训练超参数的设置直接影响最终效果。我这个项目是在一张消费级显卡上做的实验,单卡训练量级大约在800到1000张有效标注影像,每张图平均2到3个实例。整体样本量不算大,所以训练策略比较保守。

输入分辨率我设置为640,但在做难例分析时会把重点图提升到1280再单独微调。原因很简单:细长裂缝在小分辨率下信息损失太严重,全用1280训练会非常慢,全用640又压不住特别细的裂缝。分阶段处理是我实际用下来性价比最高的方式。

基础训练参数可以参考这张表:

参数设置值说明
输入分辨率640常规阶段
训练轮数200 epoch用小学习率长训替代大学习率快训
批大小16显卡显存适中
优化器AdamW权重衰减更稳
初始学习率0.001带warmup
学习率调度cosine后期衰减更平滑
权重衰减5e-4防止过拟合
数据增强Mosaic、HSV、随机翻转、随机裁剪关闭过强混合增强

数据增强这里多说一句。Mosaic这种把四张图拼一起的增强对通用目标检测很好,但用在裂缝上有个副作用:四张图拼在一起会把裂缝边缘切碎,模型学到不少半截裂缝的模式,导致推理时把完整裂缝预测成碎段。我最后把Mosaic的启用概率从默认值降到一半以下,并用随机裁剪和翻转来补充多样性。如果你在训练时发现验证集上小目标召回率很低,可以参考这个方向排查。

4.2 训练过程中的三个“鬼故事”

第一件事是loss一开始下不去。第一轮训练跑完,loss数值几乎没动,检查之后发现是预训练权重加载时,主干网络的层被意外冻结了,只有检测头在学。特征提取器不更新,检测头再怎么学都是白搭。所以训练前务必打印每一层的requires_grad状态,不要只看loss有没有降。

第二件事是验证集的误检集中在“水渍”和“伸缩缝”上。模型学习到的是“图像上有暗色线条就报裂缝”,完全没理解纹理差异。这个问题的根因还是数据:水渍和伸缩缝都是自然出现的暗色线状结构,但标注里没有把它们作为负样本集合专门强调。我处理的办法是从训练集里挑出几百个纯水渍和伸缩缝的区域,截成patch,作为无目标的背景图喂给模型,并降低Mosaic增强比例。之后误检数量肉眼可见地下降。

第三件事是裂缝预测框被切碎。同一道裂缝明明在图上是一整条,模型却输出三段互相重叠的框。排查下来有两个因素:一是标注阶段有些裂缝被拆了框,模型学到了碎模式;二是推理时的非极大值抑制阈值设置得太激进,把上下文连贯的框压掉了。我把标注规则统一改成“能合则合”,推理时把NMS的IoU阈值从默认的0.5调到0.3到0.4之间,碎框问题明显缓解。如果你想复现,建议先检查标注再动NMS,顺序不能反。

5. 从模型到工程:桥梁巡检系统的落地部署

5.1 推理加速与边缘部署的选型

模型训练完只是第一步,真正到现场部署时,算力和功耗的限制就出来了。无人机地面站一般有两种方案:一是带一块稍好的笔记本GPU,二是用嵌入式设备放到机舱里做实时分析。我先在服务器上用TensorRT做了FP16精度加速,单帧处理耗时比PyTorch原始推理降了不少;然后把模型导出为ONNX,再转换到TensorRT引擎,整体流程顺下来比较省心。

如果你要在嵌入式设备上跑,建议直接测试FP16和INT8两档精度。FP16基本无感,INT8会有一定精度损失,但对裂缝这种对比度突出的目标,有时候损失可以接受。我的原则是:先把FP16跑稳,再看业务上能不能接受INT8。

推理阶段的batch设置也有讲究。桥梁巡检更多是事后批量分析,无人机拍完几万张图落地处理,这种模式推荐batch推理,显存利用率和吞吐量都高很多;如果是实时直播式巡检,那就单帧低延迟优先。两种场景我都在代码里做了开关,部署时按需切换就行。

5.2 误检后处理:从模型输出到巡检报告需要做的几件事

模型输出的是框、类别和置信度,但工程上直接拿这些去写报告是不行的。我在这里加了两层后处理逻辑。

第一层是规则过滤。裂缝框如果面积特别大但长宽比接近1:1,大概率是误检,因为真实裂缝不会有这种形状;框内所有像素方差特别低、像一块均匀暗色区域的,也大概率是水渍或阴影。这些规则对真实裂缝的召回几乎没有影响,但能把误检数量压缩掉很大一部分。

第二层是时序确认。无人机同一个缺陷通常会在连续多帧里出现,我把单帧检测结果按地理位置和时间戳关联起来,同一区域的多帧结果做一个投票式确认:至少有两帧检出同一缺陷,才进入最终报告。这个策略非常朴素,但效果极其稳定,能把偶发性的误检压到接近于零。代价是单帧漏检仍然可能漏掉整个缺陷,所以阈值策略上我宁可多报几个候选,也不让漏检发生。

最终生成的巡检报告需要包含缺陷类型、像素坐标、预估实际尺寸、置信度,以及对应的裁剪图和原图。像素坐标转实际尺寸需要用到拍摄时的无人机坐标和焦距信息,这个如果前面没存,后面补会很麻烦,建议数据采集阶段就把POS信息一并写入文件名或数据库里。

6. 精度实测与边界情况:哪些缺陷能被识别,哪些还不行

6.1 实测指标和一些有参考价值的提升点

模型在验证集上的最终指标我不想给一个孤零零的数字,因为不同数据分布下数字没有可比性。比较有参考价值的是同条件下YOLO26相对YOLOv8的提升幅度:在小目标裂缝上,召回率大约提升了5到8个百分点;细长裂缝的完整框占比(预测框能覆盖裂缝主体长度的比例)提升明显。这说明YOLO26的特征提取和标签分配机制对线性小目标确实更友好。

从类别维度看,剥落和渗水这两类因为目标的语义特征比裂缝强很多,精度一直很高,属于“模型一旦见过就不会再忘”的类别。露筋类别的识别依赖局部纹理细节,如果钢筋锈蚀表面颜色和背景混凝土区分度不高,偶尔会漏。蜂窝麻面因为形态变化太大,是目前五类里精度最低的,它的纹理和裂缝不同,更像一片有规律的点状图案,模型容易把它和粗糙的桥面混淆。

6.2 边界情况和后续迭代的具体路线

做得差不多了,我也得说说哪些情况下这套方案目前还不行。第一类是宽度小于1毫米的细微裂缝,在常见的5毫米/像素分辨率下只有不到0.2个像素宽,任何检测模型都白搭,这类只能靠更高分辨率拍摄或者图像超分辨率去解决,模型层面没有魔法。第二类是强阴影叠加的裂缝,如果裂缝刚好在桥墩背光侧,整条线的对比度都淹没在阴影梯度里,数据增强阶段虽然加了曝光扰动,但这类极端情况还是漏。第三类是结构缝和裂缝的区分问题,伸缩缝和施工缝本来就有设计上的规则走向,跟非规则裂缝在图像上难分难解,这部分我倾向于在业务层用手动确认兜底,而不是让模型硬扛。

后续迭代我给自己列了三条路线。一是把推理输入分辨率在难例上提升到1280,专门做一轮难例微调;二是尝试在语义分割模型辅助下把裂缝框修正成贴着裂缝走向的轮廓,让报告输出更专业;三是接入相机拍摄时的光照方向信息,用物理光照模型排除部分阴影干扰。这三条都不难,但每一条都需要一部分脏活累活的数据处理。

最后聊点个人体会。这套项目做下来,我最大的感触是模型迭代到后面,瓶颈已经不在网络结构上了,而在数据规范和工程配合。标注规则稍微含糊一点,训练出来的模型在真实场景里就会用很诡异的方式坏给你看。YOLO26确实好用,但如果没把前面那些标注、清洗、后处理的工作做到位,换成多强的模型都救不回来。你如果也要在类似项目上用这套方案,我建议先花两周时间把数据规范和评测流程定好,再开始训模型,进度反而会快很多。小技巧分享一个:训练过程中不要只盯loss曲线,每周把验证集上的预测框画出来人工扫一遍,很多问题在数值指标上根本看不出来,一看图就明白了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询