ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

遥感电杆塔检测:400张YOLO数据集从训练到部署全流程

遥感电杆塔检测:400张YOLO数据集从训练到部署全流程 简介电力场景遥感数电杆塔检测数据集面向目标检测算法研究与工程落地的开发者。资源包含400张真实电力场景下的遥感数电杆塔影像统一标注为1个类别“sdgt”合计680个标注框既提供Pascal VOC格式的xml标注也提供YOLO格式的txt标注文件可直接适配主流检测框架进行训练与验证。压缩包共1202个文件含400张jpg原图、400个xml标注、402个txt标注及相关说明整体约136.93MB目录结构清晰方便分类取用。目前已有604人学习下载适用于电力设施巡检、遥感图像目标检测等场景的模型训练与精度测试。该数据集由labelImg人工画框完成标注准确规范能帮助开发者省去数据采集和清洗环节集中精力调优算法。1. 400张电杆塔检测数据集遥感目标检测里最容易被低估的起点说句反直觉的话对一个只有 1 个类别的遥感检测任务来说400 张标注图配 VOCYOLO 双格式是能撑起一套从训练到部署的完整链路的。电杆塔在遥感影像里是典型的纹理规则、尺度小、背景碎裂的目标它不需要 COCO 那种几十万张的规模去硬学特征更需要的是标注格式统一、目录结构清晰、能直接喂进 YOLO 训练管道的数据组织方式。这份数据集的价值不在量在于它把电力巡检、无人机航拍、卫星影像分析里最常见的电杆塔检测需求压缩成了一个可以跑通的最小闭环。适合两类人一是刚接触 YOLO 目标检测、想拿真实业务数据练手的工程师二是电力行业做巡检智能化的算法岗需要一个干净的单类数据做预研、跑基线或者验证新网络结构。2. 遥感电塔检测的难点与数据集格式适配先搞懂为什么别扭拿到VOCYOLO双格式的数据集先别急着解压训练。遥感场景下的电杆塔检测和普通地面摄像头目标检测有本质差异这些差异会直接决定你在训练时怎么设参、在转换格式时怎么校验。2.1 遥感影像里的电塔为什么难检背景、尺度与视角电杆塔在遥感影像里通常只有 20×20 到 100×100 像素对应 COCO 定义里的中小目标。它周围是什么是农田、山体、建筑、裸地灰度纹理高度接近铁塔本身。普通的行人检测模型在这种背景下很容易把田埂、电线杆阴影、屋顶桁架当成目标这就是遥感检测最经典的背景 clutter问题。其次是视角问题。地面拍摄的电塔是完整的侧面轮廓而遥感影像是俯视视角铁塔往往呈现为几个交叉的线状结构、一个中心点带四角拉线塔身和塔基的形态差异极大。这要求模型学的不是塔的形状而是塔在俯视视角下的纹理模式。所以我一般拿到这种单类数据集第一件事不是改网络而是看一眼标注框的尺寸分布——如果大多数框的长宽比集中在 0.8 到 1.5 之间说明这是俯视塔基或塔顶的标注方式如果长宽比很分散就要怀疑是不是把拉线也标进去了。这个判断决定了后续要不要用方形 anchor 或者改目标尺度的分配策略。2.2 VOC 与 YOLO 双格式的目录结构拿到压缩包后先做什么.7z压缩包解压后常见的组织方式是VOC和YOLO两个目录因为两种格式的目录约定差别很大。VOC 格式要求 JPEGImages、Annotations、ImageSets 三个子目录而 YOLO 格式只需要 images 和 labels 两个目录标注文件是每张图一个.txt每行class x_center y_center width height坐标归一化到 0-1。7-Zip 或系统自带解压工具都可以解压后先用tree命令核对层级别让路径里多出一层嵌套目录这会在后面配置数据描述文件时多踩一个坑。7z x 电力场景遥感数电杆塔检测数据集VOCYOLO格式400张1类别.7z tree -L 2解压后立即检查两件事一是图片和标注文件是否一一对应二是 YOLO 格式的 txt 是否为空文件。遥感数据集里经常有大幅面影像被裁切成小块后、某些块恰好没有目标标注工具会生成空 txt这在训练时会触发AssertionError或者被自动跳过不同框架处理方式不一致最好统一删除空标注及其对应图片。2.3 用 Python 脚本校验并互转 VOC 与 YOLO 标注双格式存在的意义是兼容两套工具链labelImg 打标输出 VOC 的 xml训练时 YOLO 需要 txt。虽然这份数据集已经给了双格式但我仍然建议自己写一个转换脚本理由有两个一是能校验两套标注是否一致二是将来你补充自己的数据时必须保证增量数据能融进现有管道。下面这个脚本从 VOC 转 YOLO顺带把类别表、空标注问题一起处理掉。import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_path, out_dir, class_names): tree ET.parse(xml_path) root tree.getroot() size root.find(size) img_w, img_h int(size.find(width).text), int(size.find(height).text) lines [] for obj in root.iter(object): name obj.find(name).text if name not in class_names: continue cls_id class_names.index(name) box obj.find(bndbox) x1, y1, x2, y2 [float(box.find(v).text) for v in (xmin, ymin, xmax, ymax)] x_center ((x1 x2) / 2) / img_w y_center ((y1 y2) / 2) / img_h w (x2 - x1) / img_w h (y2 - y1) / img_h # 四舍五入到6位避免浮点数过长 lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) base os.path.splitext(os.path.basename(xml_path))[0] with open(os.path.join(out_dir, base .txt), w) as f: f.write(\n.join(lines)) class_names [electric_pylon] voc_to_yolo(annotations/001.xml, labels, class_names)这段代码里有两个值得抠的细节obj.iter(object)而不是root.findall(object)是因为有些标注文件里 object 会嵌套在group标签下iter能兜底坐标归一化用的除数是图片真实宽高而不是 416 或 640YOLO 格式要求的是相对原始图片的比例任何先缩放图片再归一化的做法都会引入配对错误。跑完转换后随机抽几对 xml/txt用 OpenCV 把框画回来对比一遍这一步只花五分钟能省掉训练中定位标注是不是错了的大量排查时间。3. 用 YOLO 训练自己的电塔检测模型从环境到最小命令热词里反复出现的yolo训练自己的数据集yolo环境搭建说明这是绝大多数人的第一道坎。YOLO 的生态现在默认指 Ultralytics 的 YOLOv8 系列它在 API 和 CLI 上做了统一封装对单类别数据集格外友好。下面按环境、数据配置、训练参数、输出监控四步走。3.1 Anaconda 创建 YOLO 环境的推荐配置用 Anaconda 建独立环境是避免把系统 Python 弄脏的最稳妥做法。我没有用最新版 CUDA而是选了一组目前兼容面最广的版本组合避免出现 torch 与 CUDA 版本错位导致的CUDA unavailable。conda create -n yolo python3.10 -y conda activate yolo pip install ultralytics torch torchvision --index-url https://download.pytorch.org/whl/cu118装完跑一句python -c from ultralytics import YOLO; YOLO(yolov8n.pt)能打印模型结构就说明环境通了。CUDA 版本的选择逻辑是PyTorch 的 cu118 轮子对 RTX 30/40 系显卡都兼容且不强制要求本机装的驱动 SDK 版本如果你机器的驱动只支持 CUDA 12再把cu118换成cu121即可模型和训练结果不受影响。3.2 数据配置文件400 张图的 train/val 划分与类别定义YOLOv8 用 YAML 文件描述数据集路径建议写绝对路径避免相对路径在不同工作目录下解析出错。目录结构保持images/train、images/val、labels/train、labels/val四件套YOLO 会在labels下自动找与images同名的 txt 文件。path: /data/power_remote_sensing train: images/train val: images/val nc: 1 names: 0: electric_pylon关于划分比例400 张图做单类检测我更建议挖 20% 出来做验证集而不是死守 8:2 之外的什么黄金比例。数据量小验证集占比太低会导致 mAP 波动很大一组实验换一次随机种子指标能差三五个点你根本分不清是模型改了还是验证集太小。划分时用sklearn.model_selection.train_test_split对图片文件名做分层抽样确保验证集里包含不同地形背景的样本而不是恰好全抽到同一批航带。3.3 训练参数里的必调项imgsz、batch 与预训练权重训练命令本身不长但参数里有三个直接影响遥感小目标召回率的项需要解释清楚。yolo train \ datapower_pylon.yaml \ modelyolov8s.pt \ epochs120 \ imgsz1280 \ batch16 \ patience20 \ workers8 \ cacheram \ device0参数建议值说明imgsz1280电塔在影像中通常小于 64×64 像素640 输入尺寸下只占 10% 面积特征图上的响应极弱提到 1280 等于把目标面积放大四倍是召回率提升最明显的一个参数batch16受限于显存。如果 OOM优先降 batch 而不是降 imgsz1280 分辨率下batch8配合梯度累积同样可用modelyolov8s.pt不要用yolov8n.pt。n 模型对遥感小目标的表征能力偏弱s 模型在单类任务上速度损失可忽略epochs120400 张图大概在 80 到 100 轮收敛120 轮配合早停留足余量patience20连续 20 轮验证集指标不涨则自动停止防止过拟合训练时的损失函数也值得盯一下。YOLOv8 的损失由三部分组成box_loss计算预测框和真实框的 IoU 偏差cls_loss是分类的 BCE 损失dfl_loss是分布 focal loss负责细化边框回归。单类别任务里cls_loss几乎没有区分压力你重点应该看box_loss和dfl_loss是否同步下降。如果box_loss已经收敛但dfl_loss还在抖说明框的边界定位不稳这时优先回调imgsz而不是加训练轮数。3.4 训练输出里必须看的三个文件训练结束在runs/detect/train/下我只看三样东西confusion_matrix.png看误检和漏检的比例results.png里看val/box_loss是否有反弹PR_curve.png看在召回率 0.8 附近精度掉不掉。遥感电塔检测最典型的病态是精度高、召回低——模型把最像塔的塔都检出来了但每张图上总会漏掉一两个被阴影或云遮挡的。这种情况不要急着调模型先去看验证集里漏检的图是什么样的如果集中在特定地形说明训练集里这类背景欠采样回去补图比改网络有用得多。4. 推理与误检治理遥感部署时把置信度门限调明白训练完的模型只是半成品遥感场景部署时最常遇到的三个问题是置信度调多少合适、大影像上的小目标怎么检、误检率压不下来怎么办。这一章的思路同样适用于任何单类遥感检测模型。4.1 置信度门限和 IoU 门限的联动调整YOLO 推理时有两个参数决定最终输出conf过滤低置信度框iou在 NMS 阶段合并重叠框。很多部署文档推荐conf0.25, iou0.45这是 COCO 多类别任务的通用值直接搬到遥感电塔检测上会出问题。from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) results model.predict(sourcetest_imgs, conf0.15, iou0.5, saveTrue, imgsz1280)这里conf0.15是有意放低的。电塔检测的漏检代价远高于误检——巡检任务里漏掉一座塔意味着要重新飞一遍航线而误检一个目标花费的只是一次人工复核。低置信度配合iou0.5会让输出密集一些后续用规则去筛。如果发现输出框杂乱优先往上调iou到 0.6-0.7让 NMS 把重叠的候选框合并得更激进而不是直接调高conf。应用场景conf 建议值原因无人机巡检实时检测0.35-0.45视频流有连续帧单帧误检可以被时间维度的跟踪消除卫星影像离线普查0.10-0.20离线处理允许低置信度全部输出靠人工或规则复核追求召回优先边缘设备RK3588/NVIDIA Jetson0.30-0.40量化后置信度普遍偏低先跑一遍测试集看分布再定4.2 遥感大图的切片推理不让电塔消失在缩放里电力遥感影像往往是 4000×4000 像素起跳的大图直接把整张图缩到 1280 再推理电塔就只剩十几个像素了神仙模型也检不出来。常见做法是滑窗裁剪把大图切成 1280×1280 的 patch带重叠地推理最后合并结果。重叠区保留 15%-20%避免目标恰好被切在边界上导致只露出一半。import numpy as np from ultralytics import YOLO model YOLO(best.pt) img cv2.imread(big_image.tif) patch_size, overlap 1280, 0.2 stride int(patch_size * (1 - overlap)) detections [] for y in range(0, img.shape[0], stride): for x in range(0, img.shape[1], stride): patch img[y:ypatch_size, x:xpatch_size] results model.predict(patch, conf0.15, imgsz1280)[0] for box, score in zip(results.boxes.xyxy.cpu().numpy(), results.boxes.conf.cpu().numpy()): # 把patch坐标还原到原图坐标 detections.append([x box[0], y box[1], x box[2], y box[3], score])切块推理后要做一步跨 patch 的去重同一个塔落在两个 patch 的重叠区会被检出两次用普通 NMS 或按 IoU 阈值合并取置信度高的一次。这里stride的计算决定了推理总耗时——重叠 20% 大约会比无重叠多 25% 的推理量换来的边界漏检率下降是值得的。光线不好的影像建议先做一次对比度增强再切块遥感影像的 JPEG 压缩痕迹在 1280 尺度下会被模型放大成噪声。4.3 当误检压不下来时的排查顺序模型在验证集上 mAP 还可以部署到新区域就乱检这是遥感场景的常见问题。排查顺序固定三步先看误检目标的形态是不是集中在特定纹理上比如山脊线、高压线走廊的塔基阴影再看输入图像的波段和预处理很多遥感影像带地理编码信息但只有单波段模型没见过这种输入分布最后再考虑降低imgsz到 960 重新推理有些误检是过大的感受野把局部纹理错误放大导致的。如果三步走完误检仍然高且误检集中在某一种地形背景基本可以断定是训练集的地形覆盖不足用难例挖掘补充数据是比调参更有效的解题路径。5. 400 张不嫌少单类别电塔数据集的三类进阶玩法小数据集有小的玩法。场景在海量背景干扰中做稀疏目标检测把 400 张的潜力榨干靠三个手段。第一将训练转化为冻结浅层参数的迁移学习。用yolov8s.pt做初始化冻结 backbone 的前 10 层再训练相当于把模型当特征提取器用只让检测头和近层适应遥感域。冻结浅层比全量微调在小数据集上更稳因为它保住了 ImageNet 预训练学到的边缘与纹理基底防止 400 张图把底层特征带偏。实现上在 YOLO 的模型定义里给frozenTrue设置即可。第二把已训练模型当作难例筛选器来扩大数据集。带标注的数据只有 400 张但无标注的电力巡航空拍影像往往有几千张。用现有模型在未标注影像上跑一遍把conf在 0.3-0.6 之间的候选框取出来人工复核——这个区间的目标最可能是训练集没覆盖到的塔形变体或特殊地形背景筛出来补标注后加入训练集比随机抽帧标注的效率至少高一倍。第三对单类检测任务可以绕开 mAP 直接对齐业务指标。电塔检测的最终问题是整段线路是否被全部覆盖对应到工程上是你跑完一遍离线普查后把置信度排序最低的 20% 检出框全部翻出来核对是塔还是误检。如果最低置信度的一批里错一半说明你的置信度门限下界应该上调如果最低置信度的一批里大多是正确目标说明模型还有余量可以把门限再降一点换取更高召回。这套方法不需要重新训练只用一个推理脚本加一次人工复核就能完成是对 400 张数据集最实用的一次调优。本文还有配套的精品资源点击获取
返回列表