☰
无人机航拍电缆植被检测数据集:VOC+YOLO双格式标注与训练实践
2026/10/22 18:59:59 网站建设 项目流程

无人机巡检拍回来的素材能不能真正用起来,关键就看数据集做得好不好。我最近在做的这个"无人机航拍电缆植被检测数据集6187张VOC+YOLO格式",就是冲着输电线路通道树障隐患排查去的。总共6187张航拍影像,标注了电缆和植被两类目标,同时输出VOC和YOLO两种格式,YOLO系列可以直接训练,VOC格式方便做迁移或者走传统检测流程。

这类数据集的定位很明确:给电力巡检的AI视觉模型当训练原料。别看只是"标注图片"四个字,从无人机采集、数据清洗、目标标注规范到格式转换,每一步都有大量细节。如果只是随便找人画几个框,训练出来的模型在真实线路上根本没法用。这篇就围绕这个数据集,把这套流程里踩过的坑、验证过的方法、以及经验心得完整写出来。

1. 项目全景:为什么输电线路非要盯紧植被

1.1 树障隐患到底有多危险

输电线路跨越距离长,走廊沿途地形复杂,树木生长、极端天气倒伏、两侧通道内的超高植被,都可能逼近带电导线。导线和树木之间的距离一旦突破安全净距,轻则放电跳闸,重则引燃山林。过去主要靠人工沿线巡视,肉眼观察或者用测距仪逐基塔测量,效率低、周期长,而且有些区段根本走不进去人。

无人机航拍解决了"到不了现场"的问题,但航拍素材产生量非常大。一个架次飞下来少说几百张照片,一个班组一周巡检就能积累上千张。如果全靠人工一张张看图找隐患,眼睛容易疲劳,漏判率很高。这时候就需要训练一个目标检测模型,让它自动从航拍画面里锁定电缆和植被的位置,再由人工复核,效率完全不一样。

我做的这份数据集,核心目标就是把"找隐患"这件事拆成两个检测对象:电缆本体和植被目标。模型学会在画面中框出电缆走向,同时把树木、密集灌木等植被区域标出来,后续计算距离、判断是否越限,都可以基于检测框做二次分析。

1.2 6187张图的定位与设计思路

6187张不是随手凑的数字。考虑到航拍场景的多样性,这个体量能覆盖常见的季节变化、光照变化、地形差异。数据集中包括晴天强光、阴天散射光、早晚低照度条件下的影像,也有不同飞行高度和拍摄角度带来的目标尺度变化。VOC和YOLO双格式输出,原因很实际:不同团队用的框架不一样,有人习惯YOLO的txt标签,有人需要用VOC的xml做数据增强或检测框可视化,两边都给省得自己转。

还有一个容易被忽视的点:这个数据集标注的是电缆和植被,而不是传统遥感数据集里的"地物分类"。电缆在画面里往往细长、弯曲、颜色和背景接近,植被则是边界模糊的大片区域,标注难度比普通目标高不少。设计标注规范时,得把这两类目标的特点考虑进去,后面我会展开讲。

2. 数据从哪来:航拍采集与筛选

2.1 采集设备与飞行参数

无人机航拍电缆植被检测,设备选型直接影响模型能不能学到有效特征。市面上消费级四旋翼用起来方便,但如果是高压输电线路巡检,建议使用带RTK模块的行业级无人机,定位精度高,可以沿线路走廊做航线规划。相机方面,可见光摄像头是主力,像素建议不低于2000万,因为电缆目标在画面中占比小,像素低了细节信息不够。

飞行高度很关键。飞得太高,电缆在画面里只有几个像素,人眼都看不清,模型更难学;飞得太低,单张照片覆盖范围太小,数据效率低,而且靠近带电设备还有安全风险。我采集时的经验是:杆塔周边和线路通道分两套高度采集,通道段保持在80到120米相对高度,相机云台角度控制在45度到90度之间,既能保证电缆有足够的像素宽度,又能把两侧植被纳入画面。

航线设计建议沿着线路走向做蛇形覆盖,航线间距根据相机视场角和重叠率算。一般航向重叠率70%左右,旁向重叠率60%以上,这样同一目标会出现在多张照片的不同位置,相当于天然做了数据增广。注意偏色和过曝问题,航拍晴天中午顶光非常强,电缆反光或者绝缘子过曝会变成一片白,这种图放进数据集就是纯噪声。

2.2 数据筛选的黄金法则

不是所有航拍照片都能进数据集。我在整理这6187张图时,花了大量时间做初筛,原则很简单:画面质量不达标、目标不可辨认的照片直接丢弃,不能为了凑数量降低整体质量。

具体筛掉几种典型废图:对焦不准的模糊图,无人机快速转弯时运动模糊严重,电缆在画面里拖成一条虚影;严重过曝或欠曝的图,直方图上看高光和暗部细节都已经丢失;目标被云层阴影大面积遮挡、或者被烟雾完全盖住的图;还有纯地面、纯天空、根本没有线路走廊内容的图,检测模型学了这种图只会增加背景误报。

筛选方法我建议用脚本辅助初筛,比如用OpenCV计算拉普拉斯方差判断清晰度,低于阈值自动标记;再结合直方图做曝光判断。但最终还是要人眼过一遍,因为电缆和植被的语义特征,算法判断不了。建议至少安排两个标注经验丰富的人背靠背看一遍,有争议的图拿出来讨论。

2.3 坐标与脱敏处理

电网线路坐标是敏感信息,做数据集必须脱敏。图片里如果带有明显的杆塔编号牌、路标、地标性建筑物,要么裁剪掉,要么做模糊处理。EXIF信息里的GPS坐标也应移除,避免数据集扩散后泄露线路位置。我处理这批数据时,统一用脚本清掉了EXIF,同时对画面中的标识牌做了遮罩处理,这个习惯应该成为做电力数据集的默认动作。

3. 标注规范:一份数据集的灵魂

3.1 目标定义要精确到边界

标注规范是所有后续工作的基础。植被类目标的边界尤其考验标注功底。一张航拍图里,树冠和灌木丛相互交错、阴影叠着阳光,不同标注员理解的"植被范围"可能差出好几倍。我最终定下来的规范是:凡是画面中高度明显超过线路走廊安全高度的树冠、灌木丛、竹林,整体作为单个目标框出;前景树木和背景树木重叠时,以像素面积更大、轮廓更清晰的为主体,不强行分开;枯树和正常绿树分开标,但类别名统一用"vegetation",后续做风险分析时再结合图像颜色判断枯死情况。

电缆的标注同样有讲究。电缆在画面里常常是一根细线,目标框如果严格按照线宽,就变成极端长宽比的细长矩形,对检测器不友好。实践下来,我采用"线段包围盒"策略:把一段连续的、走向一致的电缆作为一个目标,标注框包含电缆本体及其周围的电晕影响区,框的短边至少保证15到25个像素,避免太小导致模型学不到纹理特征。

3.2 标注工具选型和团队协作

工具方面我对比过LabelImg、labelme、RectLabel和某商业标注平台。VOC格式起步,用LabelImg最省事,直接输出xml;但6187张图如果一个人标,工作量巨大,建议小团队协作,然后用脚本合并。

我们实际操作时,三个人分工,每人负责不同的采集架次,保持标注风格一致。定期抽检,对同一张图让不同人独立标注,计算IoU一致性。如果两人对同一目标的标注框IoU低于0.7,说明规范理解有偏差,需要重新对齐。这个步骤特别重要,同一张图标注偏差大,模型训练时会学到互相矛盾的目标位置信息。

3.3 边界情况和易错点

标注过程中有几类情况非常容易出错。第一类是被遮挡的电缆:电缆穿过树冠,可见部分断断续续,标注员容易只标看得见的部分,导致一个完整目标被拆成好几段。我的处理方式是:只要遮挡空隙不超过电缆总长度的三分之一,就按完整目标标注,框住整段可见和不可见的范围;空隙太大则按多个独立目标处理。

第二类是植被密集区的漏标。画面里几百棵树连成一片,标注员容易标到后面失去耐心,只框了显眼的几棵。我在标注后台会做区域密度统计,发现植被覆盖率高的图标注框特别少,就退回重标。第三类是阴影误判:树影投在山坡上,形状很像树冠,反光和暗部交界的区域容易画错框。规范要求只标注实际植被本体,影子、倒影、水面反光统统不标。

4. VOC与YOLO格式:转换与校验

4.1 两种格式的本质区别

VOC格式核心是xml文件,每个目标一个object节点,包含name(类别名)、pose、truncated、difficult,以及bndbox里的xmin、ymin、xmax、ymax。坐标是绝对值,单位像素,方便人读。

YOLO格式是txt文件,每一行代表一个目标,格式为"class_id x_center y_center width height",坐标全部归一化到0到1范围,由绝对像素坐标除以图像宽高得到。

一个容易踩坑的地方:YOLO的坐标是中心点和宽高的归一化值,不是左上角和右下角。很多人第一次转换时,直接把xmin除以宽度当成x_center,结果标注框全部偏移到大半个图外面,训练时loss异常高。

4.2 批量转换脚本与执行细节

数据集中双格式并存,需要写转换脚本。VOC转YOLO的核心逻辑:

import os import xml.etree.ElementTree as ET def convert_voc_to_yolo(xml_path, target_dir, classes): tree = ET.parse(xml_path) root = tree.getroot() img_w = int(root.find('size').find('width').text) img_h = int(root.find('size').find('height').text) out_lines = [] for obj in root.iter('object'): cls_name = obj.find('name').text if cls_name not in classes: continue cls_id = classes.index(cls_name) bndbox = obj.find('bndbox') xmin = float(bndbox.find('xmin').text) ymin = float(bndbox.find('ymin').text) xmax = float(bndbox.find('xmax').text) ymax = float(bndbox.find('ymax').text) x_center = (xmin + xmax) / 2.0 / img_w y_center = (ymin + ymax) / 2.0 / img_h width = (xmax - xmin) / img_w height = (ymax - ymin) / img_h out_lines.append(f"{cls_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}") out_txt = os.path.join(target_dir, os.path.splitext(os.path.basename(xml_path))[0] + '.txt') with open(out_txt, 'w', encoding='utf-8') as f: f.write('\n'.join(out_lines))

classes列表按固定顺序,比如["cable", "vegetation"],对应class_id分别为0和1。这里有几个容易出错的地方:

  • 图片尺寸必须从xml读取,不能自己假设所有图像都是同一个尺寸。
  • 坐标越界的处理:模型可能预测越界框,但标注框在图中不应该越界。如果标注时不小心把框画到图外,脚本要做截断或过滤。
  • class_id顺序一旦确定就不能改动,否则训练好的模型和后续应用端label对不上,预测结果全乱套。

转换完成后必须做可视化验证。写一个脚本,读取txt里的归一化坐标,还原成像素坐标,用OpenCV在原图上画框,生成预览图,肉眼抽查几百张,确认框的位置准确。

4.3 数据集的划分技巧

数据集提供的VOC和YOLO格式目录里,train/valid/test划分建议按7:2:1或者8:1:1。划分时要特别注意:同一线路同一架次的图片,尽量放在同一个集合里,不能交叉。否则模型在训练时见过某个区段的特征,验证集里又是同一区段的不同照片,评估出来的指标虚高,实际部署到新线路上效果立刻缩水。

我用了一个很简单的策略:按拍摄日期和架次ID分组,然后按组划分数据集,而不是按单张图片随机划分。这样能保证训练集和验证集之间的场景重叠度最低。

5. 训练实战:从数据集到可用模型

5.1 基准模型选型与超参配置

有了双格式数据集,第一步先别急着堆模型,建议用YOLOv8s或者YOLOv5s作为baseline。选s而不是m、l,是因为电力巡检目标相对单一,不需要超大模型容量,s级模型在边缘设备或普通GPU上推理速度更快,便于后续嵌入式部署。

输入分辨率我定在1280而不是默认的640。原因是电缆目标细长,在640分辨率下只有十几个像素宽,特征太弱;放大到1280后,细节明显增强,mAP能提升3到5个百分点。代价是显存占用增大、训练时间变长,但这对检测效果来说完全值得。

训练超参可以参考以下配置:

# 基于YOLOv8s的配置 task: detect mode: train model: yolov8s.pt data: cable_vegetation.yaml epochs: 300 patience: 50 batch: 16 imgsz: 1280 optimizer: AdamW lr0: 0.001 weight_decay: 0.0005 mosaic: 1.0 mixup: 0.1 hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4

训练轮次可以跑300轮加早停机制。不要只看最后精度,要保存验证集上mAP最高的权重,而不是最后一轮的权重。这个细节容易被忽略,实际训练时后期轮次模型可能在小数据集上过拟合,验证集指标反而回落。

5.2 数据增强的取舍

航拍数据集和普通自然图像数据集的一个关键差异,是颜色和光照的多样性。树木在夏天是深绿色,秋天是黄色,冬天是枯枝,模型如果只在一种季节的数据上训练,换季时检测能力断崖式下跌。

因此在训练阶段,不要关闭颜色增强。HSV色域扰动对植被检测特别有效,把饱和度从0.6调到1.4,色相偏移正负10度,亮度在0.6到1.5之间变化,可以在一定程度上模拟不同季节的植被外观。mosaic增强也很好用,把4张图拼接在一起,相当于增加了每张图的上下文信息,同时让模型在小目标上的鲁棒性更好。

但有一个增强要慎用:随机旋转90度。无人机航拍时相机云台确实可能横竖构图切换,但电缆和植被目标的绝对方向在画面中通常保持一定规律,90度旋转会让模型学到错误的方向先验。我建议只做15度以内的微旋转,配合水平翻转,足够应对。

5.3 评估指标怎么看

模型训练完不能只看一张loss曲线就说"收敛了"。对这两类目标,我习惯重点看几个指标:

  • mAP@0.5:一般要超过0.85才能进入业务试用评估,低于这个数值漏检和误报都会比较多。
  • mAP@0.5:0.95:反映框回归的精细化程度,对电缆这种细长目标,框的贴合度影响后续距离计算精度。
  • 每类的精确率和召回率分开看。电缆目标少、尺度小,容易出现高精度低召回;植被目标面积大、边界模糊,容易出现高召回低精度。要分别调整置信度阈值。

训练完可以导出混淆矩阵和PR曲线。典型的失败模式是"电缆被预测成植被",即模型从背景纹理中学到了错误关联。这种情况通常需要回到标注阶段,检查电缆区域和植被区域是否存在大量重叠标注,或者在特征层面加大两类目标的差异。

6. 常见问题与排查技巧实录

6.1 小目标电缆漏检严重

现象:模型在植被上表现尚可,但远处细小的电缆段经常被漏掉,recall很低。

排查思路:先看数据集中电缆目标框的像素面积分布,如果小于32x32像素的实例占比过高,检测器下采样后特征图上的响应太弱,漏检是必然的。解决办法有三个方向:一是提高输入分辨率,从640升到1280甚至1536;二是在标注时把一段电缆作为完整目标,扩大框的覆盖范围,而不是标成碎片;三是在损失函数中给小目标更高的权重,或者在增强策略中多裁剪电缆附近的局部区域放大训练。

6.2 植被误检满天飞

现象:山坡草地、农田、低矮灌木丛大量被预测为植被目标,精确率严重下降。

本质上是背景和目标混淆。排查时先统计误检位置的特点,如果误检集中在地表纹理丰富的区域,说明模型学到的是"纹理复杂度高就是植被"。这种情况下,轻量手段是调整标注规范,把所有低矮植被区单独划归背景,只在训练集中保留高度明显、轮廓立体的树冠样本。更有效的办法是增加负样本——专门收集一批完全没有植被目标的线路通道背景图,标注为空,混入训练集。

6.3 类别不均衡导致模型偏科

6187张图里,植被目标动辄每张20多个实例,电缆目标有时一整张只有一两根,总数差异可能超过10倍。模型天然倾向于多数类,处理不好会出现对所有可能像树的区域都给出框,电缆却视而不见。

我的处理方案是分层采样:每个batch里保证含有电缆目标的图片占比至少40%,不能按原始比例随机抽取。实现上可以在数据加载阶段预先按图片分组,包含电缆目标的图单独建索引,训练时按权重抽样。

6.4 跨场景泛化能力不足

模型在A段线路测试效果很好,换到B段线路效果骤降。原因通常是B段的地形、植被类型、光照条件和训练集差异大。解决思路是在数据集层面增加地理多样性,采集时尽量覆盖平原、丘陵、山区、水田等不同地貌;在训练时使用大规模随机擦除,让模型不能过度依赖某一种背景特征。还有一个屡试不爽的土办法:训练时把一部分图的背景直接换成随机纹理或高斯噪声,逼模型把注意力集中在目标本身,而不是背景里的道路、河流等辅助特征。

7. 后续扩展:这套数据集还能往哪走

这个数据集现在能做的只是"检测目标位置",但放到更大的体系里,它只是整个链路的起点。后续可以考虑扩展的方向:

多类别细化:目前植被统一一个大类,实际业务中更关心树木类型、树高等级、与导线的距离等级。可以在现有数据基础上追加标注维度,比如按树高分为低矮、中等、超高三类,或者把电缆细分为导线、地线、光缆复合线,检测结果更贴合运维检修。

深度估计和三维重建:航拍单张图像可以配合无人机姿态数据做单目深度估计,实现植被到电缆的表观距离计算。这个方向需要的数据组织形式不同,但现有检测框可以作为深度估计的先验输入。

时序变化检测:同一线路不同月份航拍的图像,可以做成植被生长监测数据集。模型在这6187张中学习到的特征提取能力,可以作为预训练权重,显著减少时序数据所需的标注量。

模型轻量化与边缘部署:实测下来,把YOLOv8s剪枝量化后,在嵌入式设备上可以达到接近实时的推理速度,精度损失在可接受范围内。有部署需求的话,这个数据集就是现成的量化校准集。

实际做这个数据集最大的体会是:标注规范和工作流程的重要性,一点都不低于模型结构。很多人拿到数据第一件事就是开训练,结果反复调参效果都上不去,回头看才发现标注边界乱、类别定义模糊、数据划分泄漏,每一步都在给模型挖坑。把这套流程沉淀好,后续不管是新线路数据扩充、类目扩展,还是换更新版本的检测模型,都会顺很多。

最后分享一个小技巧:整个流程走完之后,把所有处理脚本——包括格式转换、可视化校验、数据划分、指标统计——整理成规范化的工具文件,连同数据集一起发布。这样拿到数据的人不会因为格式细节重写一遍轮子,训练出的模型也更容易复现。一个数据集的价值不只在于图片和标签,还在于整个链路中沉淀下来的处理逻辑。

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

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

立即咨询