尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

电力遥感电杆塔检测数据集:VOC+YOLO双格式与YOLOv8训练实战

电力遥感电杆塔检测数据集:VOC+YOLO双格式与YOLOv8训练实战 简介本资源为电力场景遥感电杆塔检测数据集面向从事电力巡检、遥感图像目标检测的算法工程师与高校研究者可用于训练和验证杆塔识别模型。数据集采用Pascal VOC与YOLO双格式标注包含400张jpg图片及一一对应的400个xml和400个txt标注文件标注类别为sdgt电杆塔共680个矩形框使用labelImg工具完成标注标注准确合理。压缩包为7z格式共1202个文件以jpg图像、xml标注和txt标签为主整体约136.93MB目录结构清晰便于直接接入主流检测框架。目前已有605人学习下载适合需要快速构建电力杆塔检测基线、验证模型效果或进行数据增强实验的读者参考使用。1. 电力场景遥感电杆塔检测数据集400张VOCYOLO双格式到底能训出什么电力巡检的遥感图像里电杆塔目标小、背景杂、标注成本高很多人卡在第一步——找不到一份能直接跑通训练流程的杆塔数据集。这份400张、单类别、同时提供VOC和YOLO两种标注格式的遥感电杆塔检测数据集解决的就是“从零验证检测链路”的问题。它适合两类人一是刚接触遥感目标检测、想用最小成本跑通YOLO训练全流程的工程师二是需要快速验证某个改进模块在电力小目标场景下是否有效的研究者。400张的规模不大但胜在格式齐全、类别单一、场景聚焦拿来当baseline的起点比拿COCO去筛电力子集要省事得多。VOC和YOLO双格式意味着你不用写转换脚本就能分别喂给不同框架这一点在实际折腾环境时能省下不少时间。2. VOC与YOLO双格式的差异为什么400张也要给两套标注2.1 两种格式在文件结构和坐标表达上的本质区别VOC格式的核心是每张图对应一个XML文件里面用object标签记录类别名和bndbox的xmin、ymin、xmax、ymax四个绝对像素坐标。YOLO格式则是每张图对应一个txt文件每行是类别索引 cx cy w h全部归一化到0到1之间。这两种格式看起来只是坐标表达不同但在实际训练流程里影响很大。VOC的绝对坐标在可视化时直接可用调试标注质量很方便YOLO的归一化坐标则要求你先确认图像尺寸没有在预处理阶段被意外改变否则框会整体偏移。我一般会先用VOC格式做一轮标注质量抽检因为XML可读性好写个脚本统计一下框的宽高分布就能发现异常标注。确认没问题后再转成YOLO格式去训练这样排查问题的路径更清晰。400张的规模抽检20到30张就能对整体标注质量有个基本判断。2.2 从VOC到YOLO的转换脚本与三个必须校验的参数转换逻辑本身不复杂但有几个参数不校验就容易翻车。下面是我常用的转换脚本核心部分import xml.etree.ElementTree as ET import os # 类别列表单类别场景下就是[tower] classes [tower] def voc_to_yolo(xml_path, img_w, img_h, output_dir): tree ET.parse(xml_path) root tree.getroot() # 用图片实际尺寸不要用XML里可能缺失的size字段 lines [] for obj in root.iter(object): cls_name obj.find(name).text.strip() if cls_name not in classes: continue cls_id classes.index(cls_name) bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 归一化注意clamp到0-1防止越界 cx max(0, min(1, (xmin xmax) / 2.0 / img_w)) cy max(0, min(1, (ymin ymax) / 2.0 / img_h)) w max(0, min(1, (xmax - xmin) / img_w)) h max(0, min(1, (ymax - ymin) / img_h)) lines.append(f{cls_id} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}) # 写入同名txt base os.path.splitext(os.path.basename(xml_path))[0] with open(os.path.join(output_dir, base .txt), w) as f: f.write(\n.join(lines))这段代码里第一个要校验的是img_w和img_h的来源。很多XML里的size字段和实际图片尺寸不一致尤其是经过裁剪或缩放的数据。我一般用OpenCV直接读图片拿shape不信任XML里的size。第二个要校验的是坐标越界遥感图像里偶尔会出现标注框超出图像边界的脏数据归一化后如果不clampYOLO训练时可能报错或产生异常梯度。第三个要校验的是空标注文件有些图可能没有目标转换后会生成空txtYOLO训练时默认会跳过但如果你用了自定义dataloader空文件可能导致batch内样本数不一致。2.3 用Python批量校验转换结果的完整性转换完成后不要直接开训先跑一遍校验。我通常检查三件事txt文件数量是否和图片数量一致、每个txt的行数分布是否合理、随机抽10张可视化确认框位置正确。import os import cv2 import numpy as np img_dir images txt_dir labels img_files [f for f in os.listdir(img_dir) if f.endswith((.jpg, .png))] txt_files [f for f in os.listdir(txt_dir) if f.endswith(.txt)] # 检查数量一致性 print(f图片数: {len(img_files)}, 标注数: {len(txt_files)}) missing [f for f in img_files if os.path.splitext(f)[0] .txt not in txt_files] print(f缺失标注的图片: {missing[:5]}) # 统计每张图的框数量 box_counts [] for tf in txt_files: with open(os.path.join(txt_dir, tf)) as f: lines [l for l in f.readlines() if l.strip()] box_counts.append(len(lines)) print(f框数量统计: min{min(box_counts)}, max{max(box_counts)}, mean{np.mean(box_counts):.1f})框数量统计能帮你快速发现异常。如果某张图有几十个框大概率是标注时误操作如果大量图片框数为0说明标注覆盖率有问题。400张的规模下正常情况每张图应该有1到10个杆塔目标具体取决于遥感图像的分辨率和拍摄高度。3. 用YOLOv8训练电杆塔检测模型从环境配置到首轮收敛3.1 环境配置与数据目录组织YOLOv8的环境配置现在比较成熟我一般用conda建一个干净环境避免和系统里的其他包冲突。核心依赖就是ultralytics和opencv-pythonGPU版本需要确认CUDA和PyTorch的版本匹配。conda create -n tower_det python3.10 -y conda activate tower_det pip install ultralytics opencv-python # 确认GPU可用 python -c import torch; print(torch.cuda.is_available())数据目录按YOLO的标准结构组织images和labels分开train和val分开放。400张的数据量我一般按8:2划分320张训练、80张验证。如果要做交叉验证可以再细分但400张的规模下5折交叉验证每折只有320张训练方差会比较大不如固定一个验证集反复调参。dataset/ images/ train/ # 320张 val/ # 80张 labels/ train/ val/划分时要注意遥感图像的场景分布。如果数据里包含不同地形、不同光照条件的杆塔尽量让训练集和验证集的场景分布接近。我一般会先按文件名排序然后均匀采样划分避免某个场景全部落在验证集里导致指标虚高。3.2 data.yaml的五个关键字段与常见配置错误YOLOv8的data.yaml看起来简单但字段写错会导致训练直接失败或者指标异常。下面是一个标准配置path: /home/user/dataset train: images/train val: images/val nc: 1 names: [tower]path是数据集根目录train和val是相对路径。常见错误有三个一是path用了相对路径训练时工作目录一变就找不到数据二是nc和names长度不一致单类别场景下nc: 1和names: [tower]必须匹配三是names里用了中文或特殊字符YOLOv8内部处理时可能出问题。我一般用纯英文小写避免编码相关的玄学问题。3.3 首轮训练命令与batch size的确定方法400张图、单类别、YOLOv8n或YOLOv8s作为起点比较合适。模型太大容易过拟合太小可能欠拟合。我一般先用YOLOv8n跑一轮baseline确认链路通畅后再换更大的模型。yolo detect train \ datadataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/tower \ namebaselinebatch size的确定要看显存。400张图、640分辨率、YOLOv8n16的batch在8GB显存上基本能跑满。如果显存不够先降到8再不够就降到4。不要为了追求大batch而把imgsz降到320遥感图像里杆塔目标本来就小降分辨率会直接丢失小目标特征。patience20表示20轮验证指标不提升就早停400张的数据量下这个设置能防止过拟合浪费算力。3.4 训练过程中的指标解读与早停判断训练启动后重点看三个指标box_loss、cls_loss和mAP50。box_loss反映定位精度cls_loss反映分类精度单类别场景下cls_loss应该很快降到接近0。如果cls_loss一直不降大概率是data.yaml的names配置有问题。mAP50在400张数据上YOLOv8n通常能在50到80轮之间收敛到0.7以上。如果100轮后还在0.5以下需要检查标注质量或者调整学习率。我遇到过一种情况是mAP50震荡严重最后发现是验证集里混了几张标注错误的图修正后指标就稳定了。训练日志里如果看到nan损失一般是学习率太大或者数据里有异常框先把lr0降到0.001试试。4. 电杆塔检测的避坑与排查400张小数据集训练的五个血泪教训4.1 现象训练loss正常但mAP始终为0原因YOLO格式的类别索引从0开始但有些转换脚本会写成从1开始导致模型学到的类别和验证时的类别对不上。解决打开任意一个txt文件确认第一列是0而不是1。如果是1批量减1即可。4.2 现象验证集mAP远高于训练集原因400张数据量小如果验证集里恰好都是背景简单、目标清晰的图指标会虚高。解决重新划分验证集确保包含不同场景。我一般会手动检查验证集的前20张图确认场景多样性。4.3 现象模型把电线杆之间的连线也框进去了原因遥感图像里杆塔和连线在低分辨率下容易混淆标注时如果框选范围过大模型会学到错误的特征。解决回看标注把框收紧到杆塔主体不要包含连线。400张的规模下修正几十张标注就能明显改善。4.4 现象训练到一半突然报CUDA out of memory原因YOLOv8默认会缓存数据加载如果imgsz或batch设置过大显存会在某个epoch突然爆掉。解决把batch降到8或者在训练命令里加cacheFalse关闭数据缓存。400张图不缓存也很快。4.5 现象推理时框的位置整体偏移原因训练时用了letterbox填充推理时没有做同样的预处理。解决用ultralytics的predict接口时它会自动处理letterbox不要自己写预处理。如果自己写记得把填充后的坐标映射回原图。5. 小数据集上的进阶技巧用预训练权重和冻结策略把mAP再提一截400张的数据量从头训练很难达到理想效果用COCO预训练权重是标配。但直接fine-tune所有层在小数据集上容易过拟合。我一般会先冻结backbone训练10轮让检测头先适应电杆塔的特征然后再解冻全部层做微调。# 第一阶段冻结backbone只训练检测头 yolo detect train \ datadataset/data.yaml \ modelyolov8n.pt \ epochs30 \ imgsz640 \ batch16 \ freeze10 \ lr00.01 \ projectruns/tower \ namefrozen_head # 第二阶段解冻全部层小学习率微调 yolo detect train \ datadataset/data.yaml \ modelruns/tower/frozen_head/weights/best.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.001 \ projectruns/tower \ namefinetunefreeze10表示冻结前10层YOLOv8n的backbone大概就是这个层数。第一阶段的学习率可以大一点因为只训练检测头不会破坏预训练特征。第二阶段学习率降到0.001让整个网络在电杆塔数据上做精细调整。两阶段加起来130轮在400张数据上大概半小时到一小时能跑完比一次性训200轮效果更稳。另一个技巧是数据增强。遥感图像的杆塔检测我一般会开mosaic和mixup但会把scale的范围调小因为杆塔的尺度变化本身不大过度缩放反而引入噪声。YOLOv8默认的增强参数在default.yaml里可以通过命令行覆盖yolo detect train \ datadataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ scale0.3 \ mosaic0.8 \ mixup0.1 \ projectruns/tower \ nameaug_tunedscale0.3表示随机缩放范围是正负30%比默认的0.5更保守。mosaic0.8表示80%的概率做mosaic增强mixup0.1表示10%的概率做mixup。这些参数没有绝对的最优值400张数据上我一般会跑两组对比一组默认增强一组调小scale看验证集mAP哪个更高。最后说一个我踩过的坑不要用验证集调参太多次。400张数据验证集只有80张反复根据验证集指标调整超参很容易过拟合到验证集。我一般会留一个测试集20张左右只在最后评估时用一次。如果测试集指标和验证集差距很大说明验证集划分有问题需要重新划分。这个习惯帮我避免了好几次“验证集涨了但实际部署效果差”的情况。希望帮到你。本文还有配套的精品资源点击获取
返回列表