基于 YOLO11 的电力线路绝缘子智能检测系统
让无人机拍回来的几千张巡检图,自动告诉运维"画面里几串绝缘子,分别在哪"。
一、背景
视频演示与源码下载
https://www.bilibili.com/video/BV1fmar6PEkJ/
包含:
📦完整项目源码
📦预训练模型权重
🗂️数据集
1.1 行业痛点
输配电线路是城市电网的"动脉",绝缘子作为支撑导线、防止漏电的关键金具,长期暴露在高压、雨雪、紫外辐射下,极易出现自爆、闪络、污秽。绝缘子位置定位是巡检的第一步,也是后续"缺陷分类、状态评估、自动告警"等所有自动化任务的入口。
传统巡检的痛点:
- 输电塔少则三五公里一座,多则横跨山区,靠人去爬塔费时费力还危险;
- 改用无人机航拍 + 人工看片:拍 1 公里能产出几百张图,运维盯着电脑找绝缘子常常一天看不完;
- 不同塔型、不同视角下绝缘子尺度差异巨大(一串 vs 一片),传统模板匹配根本扛不住。
本项目用 YOLO11n 把"绝缘子在哪"做成一个单类高召回的检测模型,配套 Streamlit 前端,让运维从"翻图"变成"上传 → 看结果 → 导出 ROI"。
1.2 项目运行效果
1.3 项目介绍
核心创新点:
| 维度 | 说明 |
|---|---|
| 单类聚焦 | nc=1, names=['绝缘子'],只解决"在哪",不混"什么缺陷",召回率拉满 |
| 多源接入 | 支持航拍图、巡检视频、现场摄像头三类输入;前端一键切换 |
| 多尺度鲁棒 | 训练集涵盖近景特写(一串绝缘子)到远景全景(整段杆塔),imgsz=640 + DFL 回归对小目标更稳 |
| 工程化 | 模型 ≈ 6MB,可下沉到边缘 AI 盒子(无人机机载 / 路口杆塔 IPC) |
| 行业话术 | UI 用国网蓝 + 高压警示橙,侧栏直接显示行业方向、典型场景、部署位置 |
技术栈:
| 层 | 选型 |
|---|---|
| 检测模型 | YOLO11n(ultralytics 官方,预训练 yolo11n.pt) |
| 训练框架 | ultralytics ≥ 8.3 |
| 后端推理 | Python 3.10 + PyTorch(CPU / MPS / CUDA / NVIDIA Jetson 自适应) |
| 前端 | Streamlit + Plotly |
| 视频解码 | OpenCV + imageio-ffmpeg |
| 部署形态 | Streamlit / Docker;可导出 ONNX 给机载推理 |
二、设计框架
┌──────────────────────────────────────────────┐ │ 巡检终端 │ │ 无人机 RTK 影像 / 巡检视频 / 杆塔现场摄像头 │ └─────────────┬────────────────────────────────┘ ▼ HTTP(默认 8501) ┌──────────────────────────────────────────────┐ │ Streamlit 应用 app/streamlit_app.py │ │ ├─ 单张航拍图 / 批量巡检图 / 视频 / 摄像头 │ │ ├─ infer_image_path() 单帧推理 │ │ └─ render_batch_analysis() 类别 + 数量图表 │ └─────────────┬────────────────────────────────┘ ▼ ultralytics.YOLO ┌──────────────────────────────────────────────┐ │ YOLO11n 推理引擎 │ │ model/best.pt(单类:绝缘子) │ └──────────────────────────────────────────────┘YOLO11 网络结构(一图速通):
输入 640×640 │ ┌───▼──── Backbone(C3k2 + SPPF) ────┐ │ 多尺度特征 P3 / P4 / P5 │ └───┬───────────────────────────────┘ │ ┌───▼──── Neck(FPN + PAN) ─────────┐ │ 小目标(远景绝缘子)特征上采样融合 │ └───┬───────────────────────────────┘ │ ┌───▼── Head(Decoupled + DFL) ─────┐ │ 分类(1 类)+ DFL 边框回归 │ └───┬───────────────────────────────┘ │ 输出:N×(x1,y1,x2,y2,conf,绝缘子)YOLO11 相比 YOLOv8:Backbone 用 C3k2 取代 C2f,参数下降;Head 引入 DFL 让边框定位更稳;保留 Anchor-Free + Decoupled Head。绝缘子在巡检图里尺度跨度大、长宽比悬殊(细长串联结构),YOLO11 的多尺度特征 + DFL 是非常合适的组合。
检测流程:
航拍图/视频帧 ──▶ letterbox 640 ──▶ YOLO11n 推理 │ ▼ conf ≥ 0.30 + NMS(IoU 0.7) │ ▼ result.plot() 画框 │ ▼ Pandas 整理 → 每图目标数 / 平均置信度 → 图表三、代码结构(核心 50 行)
# app/streamlit_app.py(节选)frompathlibimportPathimportstreamlitasst,pandasaspd,yamlfromultralyticsimportYOLO ROOT=Path(__file__).parent.parent MODEL_PATH=ROOT/"model"/"best.pt"CFG=yaml.safe_load(open(ROOT/"configs"/"project.yaml",encoding="utf-8"))INFER_CFG=CFG.get("inference",{})DEFAULT_CONF=float(INFER_CFG.get("conf",0.30))# 巡检场景默认 0.30,避免漏检@st.cache_resource(show_spinner=False)defload_model(p:str)->YOLO:returnYOLO(p)# ① 权重只加载一次definfer_image_path(model:YOLO,image_path:Path,conf:float):result=model.predict(str(image_path),conf=conf,verbose=False)[0]# ② 单帧推理annotated=result.plot()# ③ 画框rows=[]ifresult.boxesisnotNone:forboxinresult.boxes:cls_id=int(box.cls.item())x1,y1,x2,y2=[float(v)forvinbox.xyxy[0].tolist()]rows.append({"class_name":result.names[cls_id],"confidence":round(float(box.conf.item()),4),"x1":round(x1,1),"y1":round(y1,1),"x2":round(x2,1),"y2":round(y2,1),})returnannotated[:,:,::-1],pd.DataFrame(rows)# ④ BGR→RGB + 结构化结果# ---------- Streamlit 入口(航拍图分支) ----------st.set_page_config(page_title=CFG["app"]["title"],layout="wide")conf=st.sidebar.slider("置信度阈值",0.1,0.9,DEFAULT_CONF,0.05)model=load_model(str(MODEL_PATH))mode=st.radio("输入类型",["航拍 / 巡检图片","批量巡检图","巡检视频","现场摄像头"],horizontal=True)ifmode=="航拍 / 巡检图片":up=st.file_uploader("上传巡检图片",type=["jpg","jpeg","png","webp","bmp"])ifupisnotNone:annotated,df=infer_image_path(model,Path(up.name),conf)col1,col2=st.columns(2)col1.image(up.getvalue(),caption="原图")col2.image(annotated,caption="检测结果")st.dataframe(df)5 段解析:
@st.cache_resource—— YOLO 权重缓存,从冷启动 ~1.5s 降到首屏 50ms。DEFAULT_CONF=0.30—— 巡检场景比通用场景更怕漏检(漏掉一串绝缘子可能错过隐患),所以阈值刻意调低于一般默认 0.25 + NMS 0.7 的组合。model.predict(...)[0]—— ultralytics 一行完成 letterbox、推理、NMS;[0]因接口默认返回 list(视频每帧一个 Result)。result.plot()—— 直接拿到带框的可视化图,运维一眼能看清"几串绝缘子+分别在哪"。mode = st.radio(...)—— 用 Streamlit 路由把单图、批量、视频、摄像头四类输入统一进同一个 app,下游 ROI 导出、缺陷子模型都能复用。
四、训练效果
模型基于yolo11n.pt在 2000 张真实电力巡检图(含不同地理环境、天气条件)上训练 200 个 epoch,imgsz=640、batch=16。最终训练表现:
| 指标 | 数值 |
|---|---|
| Precision | 0.896 |
| Recall | 0.958 |
| mAP@0.5 | 0.975 |
| mAP@0.5:0.95 | 0.868 |
训练曲线总览:
box / cls / dfl 三路损失在 80 个 epoch 后收敛,mAP@0.5 长期稳定在 0.97 附近,mAP@0.5:0.95 也有 0.86,说明边框回归质量很高(不仅"找到",而且"框得准")。
PR 曲线:
PR 曲线几乎贴着右上角的边——单类目标 + 数据集质量较高的典型表现。
归一化混淆矩阵:
对角线接近 1,"绝缘子 → 绝缘子"几乎全召回;剩余的少量误差落在 background(被山体或塔架严重遮挡的远景),属于工程上可以接受的范围,下一步可通过加入跟踪、多帧融合解决。
五、项目总结
做对了什么:
- 任务拆解到位:先把"在哪"做穿(高召回单类检测),再让下游缺陷子模型基于 ROI 做分类,比一上来就堆多类多任务靠谱得多。
- 轻量化部署:6MB 权重 + ONNX 导出能力,适配无人机机载、杆塔 IPC、巡检平板等多种边缘形态。
- 配置驱动 UI:行业方向、典型场景、部署位置全在
configs/project.yaml,下次复用到换"杆塔金具"或"导线断股"只要改 yaml + 换权重。
还能怎么做:
- 增加缺陷子模型:自爆、闪络、串型变形等做多标签分类,与本项目串联;
- 多模态:可见光 + 红外双模 ROI 拼接,能更稳地识别加热异常;
- 跟踪 + 历史对比:与上一次航拍图做 ROI 对齐,自动告警"这串绝缘子上次没有今天有"。
一句话总结:把"绝缘子在哪"这一块做穿做透,让无人机拍的几千张巡检图自动分流出"需人工复核"的小集合,是 YOLO11n 在电力运维里的一个非常对症的落点。