基于 YOLO11 的电力线路绝缘子智能检测系统
让无人机拍回来的几千张巡检图,自动告诉运维"画面里几串绝缘子,分别在哪"。
一、背景

视频演示与源码下载

包含: 📦完整项目源码
📦 预训练 模型权重
🗂️数据集
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(节选)
from pathlib import Path
import streamlit as st, pandas as pd, yaml
from ultralytics import YOLO
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)
def load_model(p: str) -> YOLO:
return YOLO(p) # ① 权重只加载一次
def infer_image_path(model: YOLO, image_path: Path, conf: float):
result = model.predict(str(image_path), conf=conf, verbose=False)[0] # ② 单帧推理
annotated = result.plot() # ③ 画框
rows = []
if result.boxes is not None:
for box in result.boxes:
cls_id = int(box.cls.item())
x1, y1, x2, y2 = [float(v) for v in box.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),
})
return annotated[:, :, ::-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)
if mode == "航拍 / 巡检图片":
up = st.file_uploader("上传巡检图片", type=["jpg", "jpeg", "png", "webp", "bmp"])
if up is not None:
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 在电力运维里的一个非常对症的落点。