ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

无人机工地巡检材料识别实战:从数据集构建到模型训练

无人机工地巡检材料识别实战:从数据集构建到模型训练

这几年智慧工地喊得特别响,但真正把无人机巡检数据用起来、把材料识别做到自动化的项目其实并不多。我前一阵子刚好在做一个工地砖块识别、木材和钢材检测的视觉方案,也整理了一套无人机工地巡检数据集。第10350期这个编号看着挺吓人,其实指的就是我们在持续迭代过程中产出的第10350批标注样本。趁今天有空,我把整个项目从场景拆解、数据采集到模型训练的完整思路写出来,给正在做类似材料检测自动化的朋友一个参考。

先说结论:工地材料识别这件事,难的不是模型,而是你怎么定义"识别"这两个字。砖块、木材、钢材在图像里的表现差异极大,光照、堆叠方式、无人机视角都会让同一个目标呈现出完全不同的样子。如果不先把场景问题拆透,再牛的检测网络扔进去也是白搭。

1. 为什么工地巡检要先解决"材料识别"

1.1 材料检测自动化的三种核心驱动力

做过工地项目管理的人应该都清楚,材料到场之后的清点、验收、堆放、使用跟踪,几乎全靠人工。钢筋来了,监理要数捆数、抽直径;砖块进场,要估方量、看破损率;木材就更麻烦,不同规格的方木和模板混在一起,工人领料的时候全凭经验。我见过不少工地因为材料盘点不准,导致进度款结算时对不上账,最后扯皮扯了好几个月。

无人机巡检能飞一圈带回大量俯拍图像,但这些图像如果只靠人眼去看,效率反而比人工到场清点还低。真正有价值的是让算法自动回答三个问题:场地里有没有这类材料、材料大概堆了多少、堆放位置符不符合安全规范。这三个问题落到视觉层面,就分别是目标检测、密度估算和场景分割的任务。

1.2 无人机视角带来的识别挑战

这里要特别提醒第一次接触无人机巡检数据的朋友:无人机拍到的材料图像,和你站在地面上用手机拍的完全是两回事。飞行高度通常在30到80米之间,视角是俯视或大角度倾斜,光线条件受天气和时间影响极大。砖块堆在俯视视角下是一个个规则的矩形阵列,但午间强光会让砖缝产生密集阴影,傍晚低角度光照又会让砖面变成一片暖色,特征被严重压缩。

钢材更是如此,螺纹钢表面有规律的花纹,但在无人机高度下这些花纹基本不可见,你能依赖的只有长条形的几何轮廓和锈迹颜色。木材则要看断面和堆放方向,原木和方木在俯视图上的投影差异非常大。所以这个项目从一开始就没打算只做一个通用目标检测模型,而是按照材料类别分别设计了特征提取的侧重点。

1.3 识别结果的业务闭环价值

材料识别真正值钱的地方在于它能接入业务闭环。比如钢材识别结果可以联动库存管理系统,当检测到某堆钢材连续多天没有位移变化时,系统自动标记为闲置物资;砖块识别结果可以辅助计算消耗速率,和施工进度计划做比对,提前预警材料短缺。这样一来,算法输出就不只是"图上有砖"这种空洞的标签,而是一个能参与决策的结构化数据。

我在方案设计阶段就坚持一个原则:检测模型的输出必须带位置信息、类别置信度和时间戳,三项缺一不可。位置信息用于空间统计,类别置信度用于人工复核过滤,时间戳用于动态变化追踪。事实证明,这个设计在后面做材料变化检测时省了非常多的事。

2. 砖块、木材、钢材的视觉特征拆解与标注规范

2.1 三类材料的特征对比

既然要做材料检测自动化,第一步就是搞清楚目标长什么样。我把三类材料的视觉特征做了系统梳理,先看表格。

材料类别典型颜色特征几何形状特征俯拍视角下的关键判据干扰因素
砖块红色、青灰色、深褐色规则矩形块体,成堆排列整齐的边线、规则网格状纹理砖缝阴影、防尘网覆盖、堆叠遮挡
木材浅黄、黄褐、深棕长条形、圆形断面端面圆形/矩形排列、长条平行走向树皮色彩干扰、切割断面反光、新旧色差
钢材银灰、锈红、暗黑细长条、环形捆扎成捆的平行线条、端面整齐排列水渍反光、锈迹与泥土颜色混淆、钢筋网密集交叉

砖块在俯视视角下最好认的一点是它的规则性。砖垛通常是按垛堆放的,每层砖的方向一致,边缘线平直,这些直线特征即便在低分辨率图像里也相当突出。难的是不同厂家的砖尺寸和颜色有差异,红色砖和红色防尘网混在一起时,必须靠边缘纹理而不是单纯的颜色来区分。

木材在工地上的存在形式主要有三种:原木堆、方木堆和木模板堆。原木堆有大量圆形端面,看起来像蜂窝,这个特征非常明显;方木堆则是矩形截面整齐排列,端面连成一片平面;木模板通常是大面积的板材平放或斜靠,俯拍时像一大块浅色地面,容易和地面背景混淆。我后来单独给木模板增加了一个分类,而不是统一归到木材类,因为它们的辨识度差异太大了。

钢材里最典型的是螺纹钢和盘圆。螺纹钢成捆时端面呈现密集的圆点阵列,侧面看是一根根平行线条,这两个特征非常稳定。盘圆则是螺旋形的圆环,颜色通常是亮银色或锈红色。钢管类钢材表面有中空圆形截面,和实心螺纹钢又不一样。实际项目里我把钢材细分为长条钢、盘圆、钢管三类,单独建模的效果比一个大类好很多。

2.2 标注规范怎么定才能少走弯路

数据标注是整个项目里最容易被低估的环节。我一开始用的是通用的矩形框标注,标注员对着无人机图像把砖块、木材、钢材框出来,看起来没毛病,但训练出来的模型表现很差。后来复盘发现,问题出在标注框的粒度不统一:有的人把一整堆砖框成一个大框,有的人又把砖堆里的每一层单独框出来,完全没有一致性。

后面我重新定了标注规范,核心原则是"按堆标注,不按件标注"。一堆砖块算一个目标,用最小外接矩形覆盖整堆;一堆木材算一个目标,覆盖所有可见端面;成捆钢材算一个目标,单根散落的钢材允许单独框出来。为什么要这样?因为无人机巡检的核心诉求是材料存在性和堆量估算,不是数单件数量。按堆标注让模型的学习目标更清晰,同时人工复核的工作量也大幅下降。

这里给出我们项目实际使用的一份标注JSON结构作为参考,字段并不复杂,但每一项都有它的作用。

{ "image_id": "DJI_20250618_143200_0012", "capture_info": { "altitude_m": 55, "camera_angle_deg": 90, "weather": "clear" }, "annotations": [ { "category": "brick_stack", "bbox": [1240, 860, 512, 380], "occluded_ratio": 0.15, "covered_by_net": false }, { "category": "steel_rebar_bundle", "bbox": [80, 420, 1000, 220], "occluded_ratio": 0.05, "covered_by_net": false } ] }

我在标注规范里加了两个字段:occluded_ratio(遮挡比例)和covered_by_net(是否被防尘网覆盖)。这是从多次训练失败里总结出来的。无人机图像里大量材料堆被绿色或黑色防尘网罩住,如果你不把这种状态明确告诉模型,模型就会把防尘网本身学成一种特征,导致露天的砖块反而检测不到。标注规范里显式标出遮挡状态后,模型学会了区分"被网覆盖的堆"和"露天堆",实际效果提升非常明显。

后来又补了一条细节规定:框选砖垛时,框边界必须紧贴可见砖块的外边缘,不能把砖垛周围的地面阴影包进来。原因也很简单,砖垛周围经常有洒水降尘造成的地面深色水渍,这些水渍的形状和砖垛边缘很像,包进来之后模型的边框回归会一直抖动,损失函数降不下去。

3. 无人机工地巡检数据集的采集与构建细节

3.1 航线规划与图像质量控制的实测经验

数据集的源头质量直接决定了模型效果的上限。我在采集阶段犯过的最大错误是贪多求全,一次飞行想覆盖整个工地,结果飞得太高,图像里材料堆占的比例太小,目标在整张图里就是几十个像素的小点,检测模型根本学不到有效特征。

后来固定了一套采集参数:飞行高度30至60米,镜头垂直向下或前视45度,航向重叠率80%,旁向重叠率70%。在30米高度下,一块标准砖的长度大约占据40到60个像素,这个分辨率足够模型识别砖缝纹理;60米高度用于获取整体堆场布局,30米高度用于逐堆精细巡检。两个高度层级的数据都需要,因为实际使用时无人机不可能每次都在同一个高度飞。

光线控制是采集阶段另一个容易被忽略的坑。我一开始什么时段都飞,结果发现正午时段的图像整体偏亮,砖块的高光区域和阴影区域反差过大,检测框在阴影边缘反复抖动;傍晚时段的图像偏暗,木材的纹理信息丢失严重。后面我规定采集窗口集中在上午9点到11点、下午3点到5点,云层较厚时全天可飞。这个简单的时段筛选,让标注难度和训练难度都降了一截。

图像清晰度方面,我加了一个自动化筛选流程:用拉普拉斯算子计算图像的方差,低于阈值的判为模糊图直接丢弃。无人机在风速较大时悬停拍摄,图像会出现轻微运动模糊,这类图人眼觉得"还行",但训练时就是噪声来源。实测下来,经过清晰度筛选的数据集,模型mAP平均能提升2到3个百分点。

3.2 数据清洗与类别平衡策略

原始数据采集回来以后,我统计了一下类别分布,砖块图像占了将近六成,钢材只占两成,木材更少。这个比例直接训练会出现明显的类别偏置,模型对砖块的召回率很高,对木材的漏检率却让人头疼。解决思路不是简单地复制少量类别的样本做过采样,而是通过改变采集路线来补拍。

重新规划飞行路线时,我让无人机重点飞过木材加工棚、钢筋加工棚和模板堆放区,专门补拍这些区域。同时还做了一个很有效的小动作:在同一批图像里做随机裁剪增强,把包含木材和钢材目标的大图裁成多个小图,相当于把稀疏的样本密度提上来了。

类别不平衡还有一个容易被忽视的层面,就是负样本。工地上的蓝色铁皮围挡、绿色防尘网、白色水泥袋,这些物体在颜色和形状上都容易和材料目标产生混淆。我在数据集里专门加入了一批不含任何材料目标的纯背景图,数量占总量的一成左右。这些负样本让模型的误检率控制在了可接受范围。

3.3 数据增强组合怎么调才有效

针对无人机视角的数据增强,我试过不少方案,最后固定下来一套组合。随机旋转肯定要做,因为无人机航向角每次都不一样,砖垛在图像里的朝向完全随机;亮度对比度增强要做,主要模拟不同天气条件;随机裁剪和缩放模拟不同飞行高度带来的尺度变化。

这里有个特别重要的增强手段:MixUp。无人机图像中不同材料堆经常挨得很近,砖垛旁边就是钢筋堆,模型容易混淆边界。用MixUp把不同类别的图像混合起来训练,能让模型学会在复杂背景下同时关注多个目标。我自己用消融实验对比过,加上MixUp之后,边界的检测稳定性提升明显。

另外提醒一句,不要对无人机图像做水平翻转增强,如果做也要谨慎。因为工地堆场有较强的方向性特征,材料堆放朝向往往和场地道路布局相关,你随便翻转可能会制造出一种现实中不存在的布局模式,浪费模型的拟合能力。后期我只做小角度的旋转,正负15度以内,配合竖直翻转。

4. 模型选型与训练调参的实战过程

4.1 检测框架选型:不要盲目追求最新

模型选型阶段,我先确定了几个硬性要求:必须支持任意角度检测、必须能在边缘设备上部署、推理速度要达到实时或接近实时。市面上成熟的开源检测模型不少,但真正适合无人机俯拍小目标场景的并不多。我去掉了两阶段检测器,因为推理速度满足不了巡检无人机边飞边处理的需求,最后锚定在一众单阶段检测模型上。

单阶段模型里我也做了取舍。有的框架精度不错但对小目标支持一般,有的框架部署生态不完善。落地项目最重要的是可维护性和部署文档的完整度,而不是论文里的刷分数字。我最终选了一个社区活跃度高、端侧工具链完善的框架,虽然它拉满精度需要调一些参数,但胜在从训练到部署的链路顺畅。

作为参考,我把当时对比过的几个方案整理成了表格,结论未必适用所有项目,但思路可以复用。

对比维度方案A方案B方案C
俯拍小目标精度中高中高
边缘设备推理速度快较慢快
部署生态成熟度高中中
自定义数据集适配难度低中高

综合下来,方案B精度最高但速度差点,方案A胜在稳定,方案C适合有专门算法团队的情况。我最后选了方案B,因为巡检任务对精度的容忍度比对速度更低,而且我们部署的算力卡性能足够覆盖它多出来的那点延迟。

4.2 训练参数配置经验与常见坑

训练参数这块,我踩过的坑比模型选型多得多。先说输入分辨率。无人机原始图像是4000乘3000级别的,直接整图送进网络显存会爆,而且砖垛这类目标在整图里占比太小,降采样之后特征直接消失。我采用的做法是先按检测框裁剪出包含目标的子图区域,再用滑窗策略从大图上切出1280乘1280的瓦片输入模型。训练时统一缩放到这个尺寸,推理时也用同样的瓦片策略,保证训练和推理的尺度一致性。

Batch Size的设置也遇到过经典问题。工地图像里目标密集,砖垛可能一张图里就有一二十个,如果Batch Size设得太大,正负样本的比例会失衡,模型收敛速度反而变慢。我实测下来Batch Size设在16到32之间最稳,配合梯度累积,既照顾了显存,也保证了训练的稳定性。

学习率策略我推荐线性预热加余弦衰减的组合。无人机数据集中不同批次的图像分布差异较大,如果一开始就用大步长,模型容易在前面几个batch就被带偏。预热阶段用较小的学习率跑几个epoch,让模型先看到足够多样的目标形态,再逐步加大更新步长。余弦衰减则让训练后期的收敛更平滑,不容易在最优解附近震荡。

最后说说类别权重。分类损失里我给木材类加了更高的权重,因为木材目标的视觉显著性最弱,模型天然倾向于忽略它。加权重不是拍脑袋,我统计过各类别在验证集上的召回率,木材明显偏低,于是把它的损失权重往上调了0.2左右,训练两轮之后召回率提升接近6个百分点。

4.3 验证与指标:mAP之外还要盯什么

评估模型时只看mAP不够,尤其是工地巡检这种典型的长尾分布场景。mAP是被所有类别的平均结果,它掩盖了单个类别的表现差异。我除了计算常规的mAP,还会单独看每一类在IoU=0.5和IoU=0.75下的AP值,重点对比砖块类和木材类。

实际项目里最有价值的指标是"漏检率"和"误检率"的联合统计。我们在测试集里专门划出了一批包含大量密集堆叠目标的图像,统计模型在这些图上的漏检情况。漏检率反映了模型在真实复杂场景下的可靠度,这比整体mAP更能指导是否可上线使用。

我记得有一次模型在验证集上的mAP已经到0.82了,看起来不错,但拿到现场试点一跑,防尘网覆盖的砖堆漏掉了将近三成。原因在于训练数据里覆盖防尘网的样本占比太低,模型没见过足够多这样的场景。后面专项补充了一大波防尘网覆盖样本,又挑了一部分做在线难例挖掘,才把这个坑填上。

5. 无人机视角下的专项问题处理

5.1 小目标检测的三层优化思路

无人机巡检图像中的材料堆虽然不像车辆行人那么小,但在60米高度下,单块砖、单根木材确实只有几十像素,属于典型的小目标问题。我处理这个问题分了三层来做。

第一层是图像金字塔。推理阶段把原始大图按0.5、1.0、1.5三种尺度缩放,分别送入模型检测,再把结果映射回原图坐标做融合。这个操作能让模型在不同尺度下都有机会捕捉到目标,代价是推理时间变长。实测下来,在巡检这种非实时强约束的场景里,耗时增加可以接受。

第二层是特征融合强化。模型本身输出的高层特征图对语义信息有优势,但小目标更需要底层特征里的边缘和纹理信息。我在模型结构里加了额外的特征融合路径,让底层特征能够跨越更多层级传递到检测头。很多检测框架都有类似的设计,关键是找到适合自己数据的融合深度,过深反而容易引入背景干扰。

第三层是专门的瓦片重叠策略。滑窗裁图时让相邻瓦片有10%到15%的重叠区域,确保目标不会恰好被切成两半。一条长钢筋如果被瓦片裁切处一分为二,两个半段都只贡献了部分信息,模型极有可能把它们都判成背景。重叠策略保证了目标在至少一个瓦片里呈现出完整形态。

5.2 运动模糊与曝光异常的处理

无人机在飞行中拍摄会产生运动模糊,这类图像直接送进模型会拉低整体精度。我在采集端加了一个防抖逻辑:悬停稳定2秒后才触发拍照。听起来很笨但非常有效,它把模糊图像的比例直接砍掉了一大半。

曝光异常单独处理。逆光场景下砖垛会变成黑色剪影,纯靠颜色特征完全没法识别;强反光场景下钢材表面会产生大面积高光,遮盖了纹理。我在预处理里加了一个简单的自适应直方图均衡化,效果有限但不增加推理成本。更有效的做法是在训练数据里故意混入欠曝、过曝的增强样本,让模型对极端曝光情况有容忍度。

5.3 相机标定与坐标映射

检测模型输出的是一张图像上的像素坐标,但业务系统需要的是材料堆在工地坐标系里的位置。所以相机标定环节不能省。我用无人机自带的位置信息结合已知地面控制点求解单应矩阵,把图像坐标映射到平面地图坐标。

这个过程有个细节:工地地面天然不平整,堆场有坡度,简单的单应变换在大范围场景下误差会累积。我采用分块标定策略,把整个场地按区域划分,每个区域内单独计算单应矩阵。虽然实现起来麻烦一些,但最终的定位精度从之前的十几米误差降到了三米以内,对材料堆放管理来说已经够用了。

坐标映射的意义之深远超想象。有了地理坐标之后,系统才能自动判断"这堆砖是否在规划的存放区域内",也才能和工地管理系统里的材料台账一一对应。我做了一个自动对比模块,当检测到的材料堆位置和台账记录位置偏差过大时,会自动提示核查,这个功能大大降低了管理员的日常巡检工作量。

6. 实测效果与工程化落地中的关键决策

6.1 现场测试结果与性能瓶颈

实测阶段选在一个中等规模的房建工地,场地面积约两万平方米,材料堆数量在40到60堆之间。无人机按预设航线飞行20分钟,采集图像约300张,整体检测流程在边缘计算设备上跑完,耗时约8分钟。这个速度虽然称不上实时,但作为巡检任务已经够用,毕竟巡检本身是低频事件,不是每秒钟都在跑。

识别精度方面,砖块堆的检测率达到九成以上,钢材捆的检测率约八成半,木材堆偏低,在八成左右。误检主要来源是工地地面上堆放的预制管件和水泥预制板,它们从无人机视角看和木材堆的几何形状非常相似,模型在个别角度下会混淆。

性能瓶颈出在图像预处理环节。300张大图的瓦片切分和读取耗时占了整个推理流程的三分之一以上。我后来改成离线切好瓦片、推理时直接读取缓存,把预处理耗时压缩了一半多。这个优化让我明白一个道理:算法性能不只是模型推理本身,整个数据管线的吞吐量才是系统实际能力的上限。

6.2 报警阈值与人工复核机制的配合

机器识别不可能做到100%准确,工程化系统一定要设计人工复核的兜底机制。我在系统里设置了三级置信度区间:高置信度结果直接入库,中等置信度结果推送给管理员快速确认,低置信度结果直接丢弃。这个机制让管理员每天只需要花十几分钟处理异常告警,不用盯着每一条检测结果看。

报警阈值还需要结合场景动态调整。大风天气后材料堆可能被吹散移位,这时候检测结果的置信度普遍下降,机械地按固定阈值处理会漏报。我在系统里加入了一个简单的经验规则:当某一区域内连续两天检测到的材料堆数量变化超过三成时,自动降低该区域的置信度阈值,触发一次细致的复查任务。这套动态阈值逻辑让系统的实用价值上了一个台阶。

6.3 从检测到管理的扩展路径

材料识别检测模块跑通之后,后续能做的扩展非常多。我这边已经验证过的有两条路径:一条是结合时序图像做材料变化检测,自动生成各堆材料的消耗速度曲线;另一条是叠加安全帽、人员闯入等安防检测能力,让同一套无人机巡检系统同时服务材料管理和安全管理。

两条路径的落地难度都不小。材料消耗速度曲线需要对同一堆材料做跨时间的匹配,考察的是数据关联能力;安全管理检测则是完全不同的模型任务,需要重新标注数据。但基础的数据采集平台、瓦片处理流水线、模型部署框架都是共用的,前期的工程投入可以在这些扩展场景里持续复用,这是这个项目最让我满意的部分。

材料识别这件事单独看只是一个检测功能,但它一旦和工地管理的业务流程绑定,就会从"能看见"变成"能管用"。我在实际项目里最深的一点体会是:不要把所有精力都花在刷模型精度上,多想想检测结果出来之后怎么用,才是一个智慧工地项目真正拉开差距的地方。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进