ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

电线杆数据集实战:2127张YOLO+VOC双格式目标检测训练指南

电线杆数据集实战:2127张YOLO+VOC双格式目标检测训练指南 简介本资源为面向目标检测学习者的电线杆识别数据集适用于电力巡检、基础设施监测等场景下的模型训练与算法验证适合具备一定深度学习基础、正在开展YOLO或VOC格式目标检测实践的开发者与研究人员使用。压缩包共约2000个文件以1999个xml标注文件和1个说明txt为主另含对应图片与YOLO格式txt标签整体大小约128.26MB目录按图片、xml、txt三类文件分文件夹存放便于直接接入常见检测框架。数据集共2127张清晰图片标注单一类别telegraph pole矩形框总数达2700个标注准确合理未做数据增强可满足基础训练与对比实验需求。目前已有216人学习下载适合需要快速获取电线杆检测样本、验证模型效果或搭建巡检原型的读者参考使用。1. 电线杆数据集到底能拿来干什么2127 张 YOLOVOC 双格式的实战定位如果你正在做电力巡检、无人机航线避障或者遥感影像里的杆状物识别大概率绕不开一个尴尬公开数据集里电线杆的样本少得可怜自己从零标又费时费力。这份 2127 张的电线杆数据集价值就在于它把「目标检测」里最耗人力的标注环节直接跳过了——图片和标签都现成YOLO 和 VOC 两套格式同时给到省掉了格式转换那一步。它适合三类人想快速跑通 YOLO 训练流程的新手、需要电线杆作为负样本或干扰类补充检测模型的从业者、以及做电力场景微调但缺数据的团队。2127 张不算大但作为单类别检测的起步集够你把训练、验证、推理整条链路走一遍也能直接塞进 yolov8训练自己的数据集 这类常见流程里当练手素材。下面我按「先看清结构、再动手训练、最后避坑」的顺序拆开讲。2. 拆开压缩包先看什么目录结构、标注格式与类别分布拿到一个数据集我习惯先不急着写训练脚本而是把目录结构和标签文件翻一遍。这一步能提前发现 80% 的后续翻车比如标签坐标系不对、图片和 txt 对不上号、类别 id 从 1 开始还是从 0 开始。电线杆这种单类别数据集看似简单但恰恰因为简单很多人跳过检查结果训练 loss 不降还找不到原因。2.1 目录结构与文件命名规律解压后典型的结构是这样不同打包方式可能略有差异以实际为准电线杆数据集/ ├── images/ # 所有图片jpg 或 png │ ├── 000001.jpg │ └── ... ├── labels/ # YOLO 格式标签与图片同名 │ ├── 000001.txt │ └── ... ├── annotations/ # VOC 格式 XML 标签 │ ├── 000001.xml │ └── ... └── ImageSets/ # VOC 的划分文件部分打包会带 └── Main/先跑一条命令确认图片和标签数量是否一致这是最基本的自检# 统计图片数量 ls images/ | wc -l # 统计 YOLO 标签数量 ls labels/ | wc -l # 找出有图片但没有对应标签的文件潜在漏标 for f in images/*.jpg; do base$(basename $f .jpg) [ -f labels/$base.txt ] || echo 缺标签: $base done逻辑说明第三段循环是核心它逐个比对图片名和标签名。如果输出一堆「缺标签」说明这个包要么标签没打全要么命名规则不统一比如图片是.jpg标签却按.png命名。参数上没什么可调的basename去掉扩展名后拼.txt是 YOLO 的通用约定。这一步花两分钟能省掉后面几小时的排查。2.2 YOLO 与 VOC 两种格式的差异与选用同一批数据给了两套格式不是让你都用而是让你按框架选。YOLO 系列v5/v8/v11 等吃 txt每行是类别 x_center y_center width height坐标全部归一化到 0~1VOC 吃 XML存的是绝对像素坐标的xmin ymin xmax ymax。两者可以互转但转换时的取整和边界裁剪是经典坑点。格式文件类型坐标表示适用框架单类别 idYOLO.txt归一化中心点宽高YOLOv5/v8/v11、Darknet通常从 0 开始VOC.xml绝对像素左上右下Faster R-CNN、SSD、部分评估脚本从 1 开始或按 name 匹配看一个 YOLO 标签长什么样0 0.512 0.634 0.021 0.487这行意思是类别 0电线杆中心点在图片宽 51.2%、高 63.4% 的位置框宽占图宽 2.1%框高占图高 48.7%。电线杆是典型的「高瘦」目标宽高比经常到 1:20 以上这个特征后面调 anchor 时会用到。对应的 VOC XML 关键片段object namepole/name bndbox xmin512/xmin ymin210/ymin xmax530/xmax ymax690/ymax /bndbox /object提示先确认你的框架要哪种格式别两套都往训练目录里塞YOLO 训练时如果 labels 目录混进 XML 会直接报错或静默跳过。2.3 类别分布与宽高比统计单类别数据集也要看分布重点看两点每张图平均几个目标、目标的宽高比集中在什么范围。写个小脚本统计import os import glob ratios [] counts [] for txt in glob.glob(labels/*.txt): with open(txt) as f: lines [l for l in f.readlines() if l.strip()] counts.append(len(lines)) for l in lines: _, _, _, w, h map(float, l.split()) if w 0: ratios.append(h / w) # 高宽比 print(f图片数: {len(counts)}) print(f平均每图目标数: {sum(counts)/len(counts):.2f}) print(f最大目标数: {max(counts)}) print(f高宽比中位数: {sorted(ratios)[len(ratios)//2]:.1f})逻辑说明h/w算的是高宽比电线杆这个值通常很大。如果中位数超过 10说明绝大多数目标极度细长默认 anchor比如 YOLOv5 的 8/16/32 网格 anchor可能匹配不好需要重新聚类 anchor 或调anchor_t阈值。参数上counts用来判断有没有空标签文件目标数为 0 的图空标签在训练时会被当负样本如果数量太多会拖累召回。3. 用这份数据跑通 YOLO 训练从 data.yaml 到第一次推理数据检查完接下来就是把它喂进模型。这一章以 YOLOv8 为主线v5/v11 流程几乎一致把配置文件、训练命令、参数含义和验证方法讲透。你照着抄能跑起来跑起来之后知道每个数字在调什么。3.1 划分训练验证集与生成 data.yamlYOLO 训练不强制要求预先划分但规范做法是分 train/val。写个脚本按 8:2 划分并复制文件import os import random import shutil random.seed(42) img_dir, lbl_dir images, labels out_root dataset for split in [train, val]: os.makedirs(f{out_root}/images/{split}, exist_okTrue) os.makedirs(f{out_root}/labels/{split}, exist_okTrue) imgs [f for f in os.listdir(img_dir) if f.endswith((.jpg, .png))] random.shuffle(imgs) split_idx int(len(imgs) * 0.8) train_imgs, val_imgs imgs[:split_idx], imgs[split_idx:] for split, files in [(train, train_imgs), (val, val_imgs)]: for f in files: base os.path.splitext(f)[0] shutil.copy(f{img_dir}/{f}, f{out_root}/images/{split}/{f}) lbl f{lbl_dir}/{base}.txt if os.path.exists(lbl): shutil.copy(lbl, f{out_root}/labels/{split}/{base}.txt) print(ftrain: {len(train_imgs)}, val: {len(val_imgs)})逻辑说明random.seed(42)固定随机种子保证每次划分一致方便复现。8:2 是单类别小数据集的常用比例2127 张里约 1700 张训练、425 张验证。注意复制标签时做了os.path.exists判断防止前面发现的漏标文件导致脚本崩溃。然后写data.yamlpath: ./dataset train: images/train val: images/val nc: 1 names: [pole]参数说明nc是类别数单类别填 1names顺序必须和标签里的类别 id 对应这里 id 0 就是 pole。path用相对路径时训练命令要在data.yaml同级目录执行否则找不到图。3.2 训练命令与关键超参一条能跑的命令yolo detect train \ datadata.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/pole \ nameexp1逻辑说明modelyolov8n.pt用官方预训练权重做迁移学习小数据集从零训几乎不可能收敛这是血泪经验。imgsz640是输入分辨率电线杆细长分辨率太低会直接丢目标如果显存够可以上 960 或 1280。batch16按显存调V100 上 640 分辨率跑 32 甚至 64 都行。patience20是早停20 轮验证指标不升就停省时间。几个和电线杆强相关的参数anchor_tYOLOv5 里叫anchor_tv8 内部处理控制 anchor 匹配阈值细长目标建议适当放宽。mosaic默认开启但电线杆拼接后可能出现不自然的截断如果验证集 mAP 上不去可以试mosaic0。scale随机缩放对小目标有利但电线杆本身够大保持默认 0.5 即可。3.3 看训练日志判断是否正常训练启动后重点盯三行box_loss、cls_loss、mAP50。正常情况 box_loss 从 1.x 稳步降到 0.0xcls_loss 因为单类别很快趋近 0。如果 box_loss 卡在某个值不动八成是标签坐标系错了比如把 VOC 的绝对坐标直接当 YOLO 归一化坐标用。如果 mAP50 一直 0先查data.yaml的names和标签 id 是否对得上。验证和推理# 验证 yolo detect val modelruns/pole/exp1/weights/best.pt datadata.yaml # 单图推理 yolo detect predict modelruns/pole/exp1/weights/best.pt sourcetest.jpg conf0.25conf0.25是置信度阈值电线杆这种背景干扰多的场景可以调到 0.4 减少误检但会漏掉被遮挡的杆子需要按业务权衡。4. 避坑与排查电线杆数据集训练最容易翻车的五个地方这一章是我自己踩过和帮人排查过的真实问题每条按「现象 → 原因 → 解决」写。单类别数据集看着简单坑反而集中。现象一训练一开始就报「No labels found」。原因data.yaml里的train路径写成了绝对路径或层级不对YOLO 找不到 labels 目录或者标签文件名和图片名大小写不一致Linux 区分大小写。 解决用ls dataset/labels/train | head确认标签存在路径统一用相对data.yaml的相对路径命名统一小写。现象二box_loss 不降mAP 始终接近 0。原因标签坐标系用错。常见是把 VOC 的绝对像素坐标直接写进了 txt没做归一化导致所有框都跑到图片外。 解决抽查一个 txt确认四个值都在 0~1 之间。如果大于 1说明是绝对坐标需要除以图片宽高重新归一化。现象三验证集 mAP 高但实际推理漏检严重。原因训练集和验证集划分时没打乱或者同一根杆子的多张连拍图被分到了两边造成数据泄漏验证指标虚高。 解决划分前random.shuffle如果图片来自视频抽帧最好按视频段划分而不是按帧随机分。现象四显存爆了CUDA out of memory。原因imgsz或batch设太大电线杆数据集图片分辨率可能本身很高。 解决先降 batch 到 8再考虑降 imgsz或者开启ampTrue混合精度V100 上能省近一半显存。现象五推理时同一根杆子出多个框。原因NMS 的iou阈值默认 0.7细长目标重叠区域小NMS 压不干净。 解决推理时调低iou0.5或训练时用overlap_mask相关参数单类别场景也可以直接调max_det限制输出数量。注意改任何参数后先跑 5 个 epoch 看 loss 趋势别一上来就 100 轮浪费时间。5. 把 2127 张用到极致小数据集的增强策略与迁移技巧2127 张对目标检测来说属于小数据集直接训容易过拟合验证集 mAP 看着不错换个场景就崩。这一章讲几个我常用的增强和迁移手段都是在这类单类别细长目标上验证过有效的。5.1 针对细长目标的增强组合YOLO 内置增强里对电线杆最有用的是这几项在训练命令里直接加yolo detect train \ datadata.yaml \ modelyolov8n.pt \ epochs150 \ imgsz960 \ batch8 \ degrees10.0 \ translate0.1 \ scale0.3 \ fliplr0.5 \ mosaic0.5 \ mixup0.1 \ copy_paste0.1参数说明degrees10小角度旋转模拟无人机不同航向fliplr0.5水平翻转电线杆左右翻转后语义不变安全scale0.3缩放幅度让模型适应不同拍摄距离mosaic0.5比默认 1.0 低因为四图拼接会让细长杆子被截断比例太高反而有害copy_paste0.1把目标复制粘贴到其他图对小数据集扩充很有效但比例别高否则背景失真。5.2 用预训练权重和冻结策略稳住训练小数据集最忌讳从零训。yolov8n.pt这类在 COCO 上预训练的权重已经学到了边缘、纹理等通用特征迁移过来能大幅加速收敛。如果数据量特别少比如你只取其中 500 张做实验可以冻结 backbone 前几层yolo detect train modelyolov8n.pt datadata.yaml epochs100 freeze10freeze10表示冻结前 10 层只训后面的检测头。等 loss 稳定后再解冻全量微调这是常见的两阶段做法。注意冻结层数别太多否则模型学不到电线杆的专属特征。5.3 验证方法别只看 mAP单类别数据集的 mAP 容易虚高我一般会额外做两件事。第一把验证集里预测框和真实框画出来肉眼过一遍重点看漏检的杆子是不是被遮挡或太细。第二用一批完全没参与训练的图比如从别的渠道找的电力场景图做交叉验证看模型泛化。如果交叉验证掉得厉害说明过拟合回去加增强或减模型复杂度。from ultralytics import YOLO model YOLO(runs/pole/exp1/weights/best.pt) results model.predict(unseen_images/, conf0.3, iou0.5, saveTrue) # 统计每张图的检测数量和预期对比 for r in results: print(r.path, len(r.boxes))逻辑说明conf0.3比默认低一点宁可多检也别漏人工再筛。iou0.5压重叠框。打印每张图的检测数如果某张图预期有 3 根杆子却只检出 1 根这张图就值得单独看。从那以后我每次拿到新数据集都强制先跑一遍「图片标签数量比对 坐标范围检查 划分后交叉验证」这三步再开始正式训练。这套流程帮我省下的返工时间远比多训几个 epoch 值。希望这份电线杆数据集和上面的流程能帮你把电力场景检测的第一步走稳。本文还有配套的精品资源点击获取
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表