做边坡巡检的这些年,我最大的感受是:真正出事的往往不是那些看起来危险的悬崖陡壁,而是没人当回事的排水沟。前阵子一场暴雨,某处边坡沟被枯枝、落叶加淤泥堵得严严实实,雨水直接从沟面漫出去冲刷坡脚,愣是冲出一道两米多长的沟槽。我们后来回看录像才发现,那段沟至少已经堵了两周,人工巡检每周都去,每次都是远远看一眼就签字走人。
这件事直接催生了我现在要聊的这套系统:用无人机航拍替代人工走近巡查,用基于最新超图增强型自适应视觉感知的YOLOv13全系列模型,对航拍画面做实时检测,把堵塞异常自动识别出来,再联动工单系统完成派发、处置、复核的闭环。整套方案跑下来,一次巡检时间从一个班组半天的徒步,缩短到一次航线飞行二十几分钟;更重要的是,检测结果有画面、有坐标、有记录,谁也不能再"看一眼就觉得没事"。
这篇内容适合正在做类似项目的人参考:不管是高速公路、矿区排土场还是水利枢纽的边坡养护,只要你想把无人机和视觉检测落到真实的运维流程里,里面从整体架构、模型选型到数据标注、部署坑位都会对你有用。文章不会纠缠于某个框架的API细节,更多讲的是整个链路里那些决定成败、但文档里不会写的事。
1. 排水沟失效的真实代价与无人机巡检的破局逻辑
排水沟这种东西,平时存在感极低,一旦失效就会以最难看的方式刷存在感:雨水无法按设计路径排走,漫出沟槽后在边坡坡面上随意冲刷,轻则形成冲沟,重则掏空坡脚、引发局部滑塌。对高速公路边坡、矿山排土场、水利堤防来说,排水沟几乎是最便宜的防灾设施,也是最容易被"糊弄"的防灾设施。
1.1 排水沟失效的真实代价:从一次漫水冲刷说起
我们接手某项目时,对方给了一组往年的巡查记录:某段边坡排水沟在汛期前被树叶和淤泥堵了将近两公里,巡查人员连续三周在日志上填写"正常"。直到一场暴雨后,雨水漫出沟体,在坡面上切出一条长沟,路面下方路基局部被掏空,处置费直接花掉六位数。这个案例说明一个很残酷的现实:排水沟堵塞的后果是被时间叠加的,初期只是过水截面变小,肉眼看上去"好像没啥",等到降雨强度超过剩余过水能力,损失就一次性爆发了。
所以堵塞检测真正要解决的,不是"堵没堵"这个二值问题,而是"堵到什么程度、在哪个里程桩号、需不需要立刻处理"这三个问题。前两个问题靠人是很难持续稳定回答的,尤其当你要在几百公里范围内每周重复一次的时候。
1.2 人工巡检的三大死穴:看不全、走不到、判不准
先说"看不全"。排水沟贴着坡脚走,人在沟边只能看到眼前几米,沟里又被杂草遮住大半,枯枝埋在阴影里根本看不见;无人机从空中俯拍,一条沟几十米甚至上百米完整呈现,遮挡问题被大幅度缓解。
然后是"走不到"。不少边坡段落在堑顶或陡坡下方,人要走到跟前要么绕很远的路,要么得冒一定安全风险。无人机不存在这个问题,抵近观察的成本只是一次航线调整。
最后是"判不准"。人工巡查对堵塞程度的判断高度依赖个人经验和当天的注意力,同一段沟今天说"轻微",明天换个同事就说"中度"。视觉模型不一样,同一套权重、同一个阈值,在相同画面条件下给出的结果是一致的。这种一致性对建立历史对比和趋势分析至关重要。
1.3 航拍加AI为什么能解决,又带来了什么新问题
航拍视角带来的新问题同样明显:目标尺度小、拍摄角度不固定、光照变化剧烈。一条零点几米宽的排水沟在几十米高度俯瞰时,要识别的堵塞物通常只有几十个像素;同一个土堆在顺光和逆光下视觉特征差异巨大;无人机转向、侧倾时,目标形态也在变化。传统基于颜色阈值或边缘检测的视觉方案在这种环境下基本不可用,这也是我们最终选择深度检测模型的原因。
选型时我们没有直接用公开发布的基础版本,而是在内部基线基础上做了超图增强与自适应感知两个方向的改造,并按参数量分出了n/s/l/x四个规模,方便在不同算力的设备上部署。这套模型体系就是标题里说的"超图增强型自适应视觉感知YOLOv13全系列",后面第三章会详细拆解。
2. 系统架构设计:从航拍采集到预警工单的完整闭环
不少朋友一提到"AI巡检"就想到模型和训练,其实模型只是整个系统里很小的一部分。真正让方案在项目里站住脚的,是采集、推理、定位、派单、复核这一整条链路能不能闭环。我们把系统拆成三块:空中采集、地面推理与展示、后台工单联动。
2.1 硬件与航拍参数:飞行高度、速度与重叠率的取舍
无人机选择上,我们要求必须带RTK定位和机械云台,传感器尽量大底、高像素,焦距至少等效24mm以上。RTK是为了让检测结果的坐标足够稳,机械云台是为了减少机体姿态变化对画面的干扰。消费级自拍无人机在这种场景下很难用,因为定位精度和云台稳定性都不达标。
航线参数是关键。我们实测了一组数据:当排水沟在画面中的宽度低于30像素时,小目标检出率会显著下降,mAP50降幅超过两成;而宽度在80到150像素之间时,模型表现最稳定。一条0.5米宽的沟,飞行高度30米时约占80到120像素,高度40米时降到60到90像素,再往上就明显吃力。所以我们把航线高度压在25到40米,特殊窄沟段单独降到20米。
飞行速度也要克制。30米高度下速度超过8米每秒时,运动模糊开始影响小目标纹理,建议常规巡检速度控制在4到6米每秒。航向重叠率按70%设置,旁向重叠率60%即可,重叠率太高会成倍增加数据处理量,太低则容易出现漏检断层。
2.2 检测链路与坐标对齐:让每一帧结果都能落到地图上
采集到的视频流先进入推理设备。我们目前有两条推理链路:一条是在无人机上挂载轻量边缘推理盒子,实时跑n或s规模模型,单帧延迟控制在40毫秒以内;另一条是把原始影像通过存储介质带回驻地,交给更高性能的服务器跑l或x规模模型,做批量复核和精细判读。
坐标对齐是整个链路里最容易被忽视、也最容易出错的环节。检测模型输出的只是图像坐标系里的框,要变成真实世界的桩号,必须把无人机位姿、云台角度、镜头焦距和图像框中心点结合起来做反投影。我们的做法是记录每一帧的曝光瞬间对应的经纬度、高度、航向、俯仰角和翻滚角,离线用光线投影计算目标点的大地坐标。这个过程需要严格的时间戳同步,如果你只是把视频和GPS轨迹分开录,后期对齐时误差能大到几十米。
2.3 预警联动与工单闭环:检测只是第一步
检测到堵塞只是开始,运维方真正需要的是一个可执行的处置任务。我们在后台把检测框按坐标投射到GIS地图上,以一定距离为半径做聚合:同一段沟里连续若干帧检出同类异常,就合并成一条事件记录,附上最高置信度的那一帧截图、坐标、类别和推算的堵塞程度。
事件记录通过工单系统派给管养班组,处置完成后,无人机再飞一次同一航线,把同一坐标的新画面和旧画面做对比,由模型重新判定是否已恢复畅通。这个"检测-派单-复核"的闭环让巡检从一次性的数据采集变成了可持续的运维管理。目前我们的误报率主要靠后处理压,而不是单纯调高置信度阈值,这一块在第六章会展开讲。
3. 超图增强型自适应感知:YOLOv13全系列模型的核心变化
之所以把模型单独拿出来写一章,是因为这套系统的架构思路和常规"拿个开源模型训练一下就部署"的路径差别挺大。我们围绕两个方向做了针对性改造:一是用超图建模堵塞物之间的高阶共现关系,二是让网络根据光照和场景统计量动态调制特征,然后把不同规模版本统一成n/s/l/x四个档位。
3.1 从普通图到超图:高阶关系建模是怎么一回事
先解释一下超图。普通图里一条边只连接两个节点,就像微信里两个人之间的聊天;超图里一条超边可以同时连接多个节点,相当于拉一个群,群里所有人同时建立关联。在堵塞检测场景里,枯枝、落叶、淤泥、塑料袋往往不是独立出现的,它们是一起被雨水冲到低洼处然后堆叠起来的"共现群体"。用普通卷积或普通图卷积,模型只能学到两两之间的近似关联;用超图结构,一个超边直接把这些共现目标打包建模,信息可以沿着超边在高阶维度上传播。
我们的实现方式是这样的:在骨干网络输出的高层特征图上,把每帧检测到的候选目标当成节点,通过空间距离和类别相似度构建包含K个最近邻的超边,然后在颈部特征上做两轮超图信息传播。这个模块可以理解为给检测头额外提供了一层"场景共现上下文"。
为什么要在这个项目里做超图?因为堵塞物的识别存在大量模糊边界:一块被泥糊住的石头,单看像素就是一团土色,但如果它周围同时出现了枯枝和落叶,那这团东西几乎可以确定是堵塞物。超图让模型更快学会这种"物以类聚"的判别逻辑,对低纹理、低对比度的目标效果尤其明显。
3.2 自适应感知增强的两个落地模块
自适应感知增强解决的是另一类问题:同一段沟,早上顺光、中午强光、傍晚逆光,画面统计特性差异巨大;晴天和雨后,沟体颜色天差地别。我们用两个模块来应对。
第一个是光照自适应特征调制。把每张输入图像的全局统计量——亮度均值、对比度、饱和度——编码成一组调制系数,对骨干网络输出的特征图做逐通道仿射变换。这个思想和图像风格迁移里的自适应归一化一脉相承,相当于告诉网络"当前画面的光照条件是这样的,请按这个条件重新标定特征"。
第二个是可变形感受野。排水沟是狭长走向,转弯处画面里的目标也随沟形偏转。我们把部分标准卷积替换成可形变卷积升级版,让采样点沿着沟体走向动态偏移,而不是固定在方形网格上。实测在弯曲沟段和小转角场景下,检测框的贴合度和稳定性都有改善。这两个模块都不复杂,但叠加起来对综合场景的鲁棒性提升非常明显。
3.3 n/s/l/x四个规模怎么选:一张表说清楚
把这套结构按深度、宽度系数分成四个档位,就是n/s/l/x。选择哪个档位,取决于你手里的算力,而不是哪个精度最高用哪个。
| 模型版本 | 相对参数量 | 计算量(相对) | 典型部署位置 | 适用场景 |
|---|---|---|---|---|
| n | 最小 | 最低 | 机载端侧设备 | 实时巡检、低功耗 |
| s | 约n的2倍 | 中等 | 边缘盒子 | 单机实时、性价比高 |
| l | 约n的5倍 | 较高 | 服务器或强边缘站 | 批量复核、精细分析 |
| x | 最大 | 最高 | GPU服务器 | 离线精判、训练教师模型 |
我们实际使用中,n版本在边缘设备上单帧推理约20到30毫秒,但小目标精度会低一些;s版本精度和速度的平衡最好,是目前单机巡检的主力;l和x版本主要用于驻地批量复核和难样本挖掘。训练时我们先用x版本在全部数据上蒸馏出一套高精度权重,再蒸馏引导n和s的训练,让轻量版吃到大模型的收益。这也是n版本在端侧还有一战之力的重要原因。
4. 数据工程:排水沟堵塞检测的模型上限由这里决定
每次有人问"你们模型用的是什么结构",我都想先反问一句:你们数据是怎么采的、怎么标的?模型结构带来几个点的提升,数据质量带来的可能是几十个点的差距。这一章聊聊我们在数据上花掉的那两个月。
4.1 数据采集:航线、时段与模拟场景的布点策略
采集阶段我们跑了三个不同类型的场景:一段高速公路边坡、一个矿区排土场、一个水利枢纽的干渠边坡。每个场景至少覆盖春、夏两个季节,因为植被形态和光照角度差异太大,单季节数据会把模型训废。
时段上刻意覆盖早中晚三个光照窗口:早上9点前顺光、中午顶光、下午4点后逆光和长阴影。我们没有刻意追求绝对均匀,而是让逆光和阴影场景占到三成以上,因为实际巡检中这些时段最容易出误报。
还有一个很多人想不到的操作:在征得甲方同意后,我们在指定的试验段内人为布置模拟堵塞物,包括成捆枯枝、碎石堆、编织袋和混合堆叠物。这样做有两个目的,一是保证正样本在早期就有足够数量,不用等一场雨来"随机发货";二是可以控制堵塞物的形态、位置和尺度,让标注边界更干净,方便训练和验收。真实自然堵塞当然也要持续采集,但早期阶段模拟样本能帮模型先把基本形态学住。
4.2 类别定义:六类异常与危害分级
类别定义直接决定标注成本和后续运维口径。我们最后保留了六类:淤泥堆积、碎石堆积、枯枝落叶、人为杂物、植被侵入、沟体破损。
| 类别 | 典型形态 | 危害等级 | 标注要点 |
|---|---|---|---|
| 淤泥堆积 | 泥砂覆盖沟底、可见厚度 | 高 | 与碎石混合时按主体类别标 |
| 碎石堆积 | 石块聚集、局部隆起 | 高 | 零星孤石不成簇不标 |
| 枯枝落叶 | 树枝横跨、落叶铺层 | 中高 | 注意与沟边植被遮挡区分 |
| 人为杂物 | 塑料袋、瓶罐、废弃包装 | 中 | 目标小,框边缘贴紧 |
| 植被侵入 | 杂草藤蔓伸入沟内 | 中 | 与沟边正常植被的界线性标注 |
| 沟体破损 | 沟壁开裂、沟底塌陷 | 高 | 形态不规则,框可按外接矩形 |
我们没有单独设置"堵塞严重程度"这个类别,因为程度本质上是面积占比问题。模型检测出目标框后,后台按框面积占沟面宽度的比例估算堵塞程度,小于20%记为轻度,20%到60%为中,大于60%为重。这个做法比让标注员在几千张图上打"轻中重"主观标签要稳定得多。
4.3 标注规范与一致性质检:别让标签噪声拖后腿
标注规范里最容易翻车的是"标不标"的边界问题。同一个目标,标注员A觉得是堵塞物,标注员B觉得是沟底正常裸露的石头。我们用了一个比较笨但有效的办法:先让两名标注员独立标同一批图,计算框级一致性,不一致的图单独抽出来由组长仲裁并写入规范文本。第二轮开始,规范文本会越来越厚,标注一致性逐渐稳定。
另外还要防止"为标而标"。有人会倾向把疑似目标都框上,觉得多标没错;实际上大量模糊负样本被标成正样本,会让模型在推理时把类似纹理的一切都当目标。我们要求每个类别必须给出"最低可标条件",比如碎石堆积必须满足三块以上碎石且存在隆起趋势,单块孤石一律不标。这些规定看起来苛刻,但能显著减少训练时的标签噪声。
4.4 数据增强:用贴近航拍的扰动撑起小样本
采集到的真实正样本最多也就上万级,对深模型来说不够用。常规的Mosaic、翻转、缩放我们都上,但效果有限;真正起作用的是贴近航拍物理特性的增强:随机加雨线模拟恶劣天气,随机调整亮度对比度模拟逆光,随机对局部区域做轻微高斯模糊模拟对焦偏差,随机遮挡一块矩形区域模拟树冠遮挡。我们还加了轻度运动模糊增强,就是沿水平方向做几个像素的位移模糊,这个对无人机抖动场景非常有效。
值得一提的还有负样本的制造。我们把大量"畅通沟体"和"近似堵塞但实际正常"的画面作为负样本加入训练,让模型学会区分"看起来像"和"真的是"。比如沟底天然形成的鹅卵石纹理、雨后反光的水面、混凝土接缝的影子,这些都是误报高发区,必须在负样本里反复出现。
5. 训练配置与边缘部署:让模型在机载场景真正可用
模型结构再好,训练和部署做得糙,到了现场一样白搭。这一章讲我们在训练参数和边缘部署上踩过的坑,以及最终沉淀下来的配置。
5.1 训练配置与关键超参:别照着COCO默认值抄
第一件要改的就是输入分辨率。开源社区很多预训练模型默认用的是小图,但排水沟里的堵塞物在航拍里属于中到小目标,我们用1280作为训练分辨率,推理时也保持1280。分辨率提上来的代价是显存和训练时间,我们单卡训练l模型时batch size只能放到8到10,需要用梯度累积模拟更大batch。
损失函数方面,我们保留了检测任务标准的分类和回归损失,但给分类部分加了更积极的正负样本平衡策略,让难例——低对比度、半遮挡的堵塞物——获得更大的梯度权重。这一点对堵塞场景比通用场景更重要,因为真正的安全隐患往往就是那些"一眼没看出来"的目标。
训练时长我们控制在350到400个epoch,配合EMA、余弦衰减和约5个epoch的warmup。这个配置比较耗时间,但为了在复杂航拍背景下稳定收敛是值得的。如果你时间紧张,至少保证epoch不低于250,早停过于激进的模型在后续场景里会明显偏脆。
5.2 边缘部署:FP16为主、INT8要谨慎
部署阶段主要考虑三件事:推理延迟、内存占用、精度损失。我们把模型导出为标准推理引擎格式,边缘设备上优先使用FP16半精度。FP16在小模型上的精度损失很少,性能提升明显,是我们目前的主力方案。
INT8量化我们的结论是"可以但必须分场景验证"。在光线稳定、数据类型单一的闭合场景里,INT8精度损失可以控制在可接受范围;但在有树影、逆光、雨后反光的开放场景里,INT8会明显放大误报。所以我们只在两个条件明确的固定机位试验INT8,移动巡检全部退回FP16。这也是很多项目现场"测试指标还行、上线之后误报爆炸"的常见原因之一。
部署时还有一个小细节容易被忽略:动态形状和固定形状的选择。固定1280输入形状可以在推理引擎层面做更多优化,端起速度有优势;但真实采集素材比例不是恒定的,我们最终保留了两个档位的动态尺寸,推理延迟多花几毫秒,换来了不用为不同机型单独导一套模型。
5.3 告警后处理:多帧投票与地理聚类如何压误报
模型输出本身不够格直接当告警,一定要做后处理。我们用了三层过滤。第一层是时间域多帧投票:同一个地理坐标附近,至少连续两帧或累计三帧检出同类目标才计为有效;单帧的偶发高置信度框直接丢弃。第二层是类别先验过滤:比如"人为杂物"这类小物体,如果置信度低于某个阈值且没有周围其他类别共现,就不进入统计,因为这类目标在航拍中的误报比例最高。第三层是地理聚类:把落在四十米范围内的同类检出归并成一条事件,用聚类内最高置信度代表整段状态,避免一段沟出十个告警。
这套后处理把原始模型的误报率大概压掉了六成,代价是少数持续时间很短的真实事件会被漏掉,比如一次快速飞过时只在两帧里曝光的目标。我们在巡检场景里接受这个取舍,因为运维处置针对的是持续存在的问题,而不是一帧偶发画面。
6. 实测效果与三类高频问题的排查记录
进入现场实测后,真正的工作才刚刚开始。这一章分享一组我们在验证集上的真实指标,然后把我们遇到的三类高频问题展开讲,每个问题基本都经历了"现象-定位-解决"的完整链路。
6.1 全系列模型指标:谁在涨,谁涨了个寂寞
我们的测试集包含三个场景约8000张航拍图,统计mAP50和mAP50-95这两个核心指标。整体趋势是s相对n有明显提升,l相对s提升收窄,x在大部分类别上已经进入平台期。考虑到x的计算成本,我们在绝大多数落地场景推荐s版,只有离线批量复核才用l。
| 模型版本 | mAP50 | mAP50-95 | 单帧耗时(边缘) | 结论 |
|---|---|---|---|---|
| n | 约0.82 | 约0.54 | 约25ms | 可实时,小目标偏弱 |
| s | 约0.88 | 约0.62 | 约35ms | 主力版本 |
| l | 约0.90 | 约0.66 | 约80ms(服务器) | 复核用 |
| x | 约0.91 | 约0.67 | 约150ms(服务器) | 平台期明显 |
数据只代表我们自己的测试集,不同项目的数据分布差异很大,这些数字的价值更多在于看趋势而不是抠绝对值。
6.2 高频问题一:逆光、树影与非沟体暗色区域
上线的第一周,误报最集中的来源就是逆光与树影。沟边的树冠阴影投在混凝土沟面上,形成一条条深色条带,模型经常把阴影条带和沟体裂缝误判成"沟体破损",把暗处的落叶阴影误判成"枯枝落叶"。问题定位很快,因为我们把误报样本按置信度排序后发现,绝大多数误报框都落在阴影边界上。
解决思路分两步:第一步,把阴影区域的硬阴影训练样本在增强里再增加,让模型见过足够多的"阴影沟体"并学会把它们归为背景;第二步,在自适应感知模块中强化全局统计量对局部纹理的约束,阴影区域的对比度特征会因调制被压低,从而减少与真实破损的混淆。这两步之后,阴影类误报下降了约七成。
6.3 高频问题二:运动模糊与低空抖动的小目标杀伤
第二个高频问题是运动模糊。无人机在转弯、加速或遇到阵风时,画面在曝光瞬间会产生几像素到十几像素的拖影,其他物体还能看,小尺寸堵塞物几乎会被糊成一片色块,直接丢失。
我们试过提高快门速度,但光线稍差就导致整体欠曝,效果不佳。最终的解法组合是:姿态控制上限制航线转弯速度,避免急转;推理上前置一个轻量模糊检测分支,判定画面清晰度,模糊帧直接丢弃并触发局部重飞。这个分支非常轻量,但它保证进入模型的目标基本都是清晰帧,小目标检出率明显回升。丢帧和重飞机制也让航线时间有些许增加,但相比事后返工要好得多。
6.4 高频问题三:标注边界歧义与模型纠结区
模型在推理时偶尔会输出置信度徘徊在0.45到0.6之间的"纠结框",专门对应那些标注规范里没有覆盖到的边界情况,比如一堆被泥浆半覆盖的碎砖、两条沟缝之间的混凝土剥落。因为标注阶段没统一口径,模型学到的是一个"平均意见",到新画面上就容易摇摆。
处理这类问题不能再靠调阈值,核心还是回到数据:把现场推理出的纠结框自动回流到待标注池,由仲裁组判定类别,再增量训练。我们给这个回流流程起了个名字叫"误报-修正-增强回路"。跑两三轮之后,模型在纠结区的表现明显收敛。这个经验也适合所有做垂直场景检测的人:不要指望离线标注一次到位,在线难例回流才是模型稳定性的长期来源。
到这一步,整个系统的能力边界和短板都已经比较清楚了。我最后想说的是,做这类巡检系统,模型本身永远不是瓶颈,数据闭环才是。我们在项目里最花时间的地方,不是跑通推理,而是把"采集什么、标成什么、误报怎么回流、工单怎么闭环"这一整套规矩立起来。规矩立住之后,换更强的模型只是插拔的事。
另外有个小建议:如果你刚起步,不要一上来就追求x规模的模型,先用s版本把数据链跑通,每周固定回访一段典型沟渠,积累三个月真实场景样本,再回头蒸馏训练。我见过太多团队在模型结构上反复横跳,结果数据一塌糊涂,最后谁来了都不好使。先把数据闭环做扎实,这套系统才算真正落地。