如何根据训练出的输电线路缺陷数据集(绝缘子自爆,破损,闪络,鸟巢,防震锤脱落五种缺陷)权重,建立深度学习yolov8输电线缺陷检测系统

如何根据训练出的输电线路缺陷数据集(绝缘子自爆,破损,闪络,鸟巢,防震锤脱落五种缺陷)权重,建立深度学习yolov8输电线缺陷检测系统

输电线路数据集(绝缘子自爆,破损,闪络,鸟巢,防震锤脱落五种缺陷)
包括
在这里插入图片描述

1.绝缘子自爆
2.绝缘子破损绝、闪络
3.鸟巢
4.防震锤脱落

可单卖

数据增强后的数量
对应数量:1828,1467,4370,1050,2185
在这里插入图片描述

用Lableme标注的,每张图片都会有一个相应的xml文件在旁边,,如何用于深度学习目标检测研究?

输电线路缺陷检测数据集 包含五种常见电力设备缺陷类型,非常适合用于深度学习目标检测研究(如YOLO、Faster R-CNN、SSD等模型)。以下是使用 YOLOv8 模型训练这套数据集的完整流程指南,涵盖从数据准备、预处理、模型训练、评估到部署的全流程。

以下文字及代码仅供参考学习


✅ 一、数据集概述

缺陷类别数量
绝缘子自爆1828 张
绝缘子破损1467 张
闪络与“绝缘子破损”共用?请确认是否为独立类别
鸟巢4370 张
防震锤脱落2185 张
总计~10900 张(增强后)
  • 标注格式:Labelme 的 XML文件
  • 输出格式需转换为 YOLO 格式 .txt(类别 + 归一化坐标)
  • 图像格式:JPG 或 PNG
  • 可用于:目标检测、工业巡检、无人机图像分析等场景

✅ 二、环境准备

# 创建虚拟环境(可选)
python -m venv powerline_env
source powerline_env/bin/activate  # Windows: powerline_env\Scripts\activate

# 安装依赖
pip install ultralytics opencv-python-headless numpy tqdm albumentations labelme

数据集是 XML 格式标注的(LabelImg / VOC 风格)**。

基于 XML 标注文件的数据处理流程 + YOLOv8 的训练方案,包括:

✅ XML 转换为 YOLO 格式 .txt
✅ 数据集划分(train/val/test)
✅ 创建 data.yaml
✅ 使用 YOLOv8 进行模型训练、评估、推理和部署


✅ 一、数据集结构与说明

输电线路缺陷检测数据集使用 XML 格式标注,每张图像都有一个对应的 .xml 文件,格式如下:

<annotation>
    <filename>image1.jpg</filename>
    <size>
        <width>640</width>
        <height>480</height>
        <depth>3</depth>
    </size>
    <object>
        <name>insulator_burst</name>
        <bndbox>
            <xmin>100</xmin>
            <ymin>200</ymin>
            <xmax>150</xmax>
            <ymax>250</ymax>
        </bndbox>
    </object>
</annotation>

📁 推荐目录结构如下:

powerline_dataset/
├── images/
│   ├── image1.jpg
│   └── ...
├── annotations/
│   ├── image1.xml
│   └── ...

✅ 二、XML 转 YOLO TXT 标签脚本

import os
import xml.etree.ElementTree as ET

# 类别映射(请根据你的实际类别顺序填写)
class_mapping = {
    'insulator_burst': 0,
    'insulator_damage': 1,
    'flashover': 2,
    'bird_nest': 3,
    'damper_fall': 4
}

def convert_xml_to_yolo(xml_file, output_dir, img_dir):
    tree = ET.parse(xml_file)
    root = tree.getroot()

    filename = root.find('filename').text
    img_path = os.path.join(img_dir, filename)
    if not os.path.exists(img_path):
        print(f"Image {img_path} not found. Skipping.")
        return

    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    label_file = os.path.join(output_dir, os.path.splitext(filename)[0] + '.txt')

    with open(label_file, 'w') as out_file:
        for obj in root.findall('object'):
            cls = obj.find('name').text
            if cls not in class_mapping:
                continue

            cls_id = class_mapping[cls]
            xml_box = obj.find('bndbox')
            xmin = int(xml_box.find('xmin').text)
            ymin = int(xml_box.find('ymin').text)
            xmax = int(xml_box.find('xmax').text)
            ymax = int(xml_box.find('ymax').text)

            # 归一化坐标
            xc = (xmin + xmax) / 2 / w
            yc = (ymin + ymax) / 2 / h
            bw = (xmax - xmin) / w
            bh = (ymax - ymin) / h

            out_file.write(f"{cls_id} {xc:.6f} {yc:.6f} {bw:.6f} {bh:.6f}\n")

# 批量转换
annotations_dir = "powerline_dataset/annotations"
images_dir = "powerline_dataset/images"
labels_output_dir = "powerline_dataset/labels"

os.makedirs(labels_output_dir, exist_ok=True)

for xml_file in os.listdir(annotations_dir):
    if xml_file.endswith('.xml'):
        convert_xml_to_yolo(os.path.join(annotations_dir, xml_file), labels_output_dir, images_dir)

✅ 三、划分数据集(train/val/test)

import os
import random
import shutil

# 设置路径
images_dir = "powerline_dataset/images"
labels_dir = "powerline_dataset/labels"

# 创建目录
os.makedirs("dataset/images/train", exist_ok=True)
os.makedirs("dataset/images/val", exist_ok=True)
os.makedirs("dataset/images/test", exist_ok=True)

os.makedirs("dataset/labels/train", exist_ok=True)
os.makedirs("dataset/labels/val", exist_ok=True)
os.makedirs("dataset/labels/test", exist_ok=True)

# 获取所有图片名称
all_images = [f for f in os.listdir(images_dir) if f.endswith(('.jpg', '.jpeg', '.png'))]
random.shuffle(all_images)

# 划分比例
train_ratio = 0.8
val_ratio = 0.15

train_split = int(len(all_images) * train_ratio)
val_split = train_split + int(len(all_images) * val_ratio)

train_files = all_images[:train_split]
val_files = all_images[train_split:val_split]
test_files = all_images[val_split:]

def copy_files(files, src_img, src_lbl, dst_img, dst_lbl):
    for file in files:
        base_name = os.path.splitext(file)[0]
        shutil.copy(os.path.join(src_img, file), os.path.join(dst_img, file))
        label_file = base_name + ".txt"
        if os.path.exists(os.path.join(src_lbl, label_file)):
            shutil.copy(os.path.join(src_lbl, label_file), os.path.join(dst_lbl, label_file))

copy_files(train_files, images_dir, labels_dir, "dataset/images/train", "dataset/labels/train")
copy_files(val_files, images_dir, labels_dir, "dataset/images/val", "dataset/labels/val")
copy_files(test_files, images_dir, labels_dir, "dataset/images/test", "dataset/labels/test")

✅ 四、创建 data.yaml 文件

在项目根目录下创建 data.yaml

train: ./dataset/images/train
val: ./dataset/images/val
test: ./dataset/images/test

nc: 5  # 总共5个类别
names: ['insulator_burst', 'insulator_damage', 'flashover', 'bird_nest', 'damper_fall']

✅ 五、YOLOv8 模型训练命令

yolo task=detect mode=train model=yolov8s.pt data=data.yaml epochs=100 imgsz=640 batch=16 workers=4

在这里插入图片描述

✅ 六、性能评估

yolo task=detect mode=val model=runs/detect/train/weights/best.pt data=data.yaml

在这里插入图片描述

✅ 七、推理与部署

# 单图推理
yolo task=detect mode=predict model=best.pt source=path/to/image.jpg save=True

# 视频或摄像头
yolo task=detect mode=predict model=best.pt source=path/to/video.mp4 save=True

在这里插入图片描述

✅ 八、模型导出(ONNX / TensorRT / OpenVINO)

# 导出 ONNX
yolo export model=best.pt format=onnx

# 导出 TensorRT(NVIDIA 设备)
yolo export model=best.pt format=engine device=0

# 导出 OpenVINO(Intel 设备)
yolo export model=best.pt format=openvino

基于训练好的权重建立一个深度学习输电线缺陷检测系统涉及多个步骤,

代码示例,仅供参考。

1. 准备工作

确保完成了模型的训练,并保存了最佳权重文件(如 best.pt)。同时,确保你的环境中安装了必要的库:

pip install ultralytics opencv-python-headless numpy tqdm

2. 模型加载与推理

首先,需要加载训练好的模型,并使用它进行图像或视频的推理。

加载模型
from ultralytics import YOLO

# 加载预训练模型
model = YOLO('runs/detect/train/weights/best.pt')  # 替换为你的最佳权重路径
单张图片推理
import cv2

def detect_image(image_path):
    results = model(image_path)  # 进行推理
    
    for r in results:
        im_array = r.plot()  # 绘制结果
        im = Image.fromarray(im_array[..., ::-1])  # 转换颜色通道顺序
        im.show()  # 显示结果

# 使用示例
detect_image('path/to/image.jpg')
视频或摄像头实时检测
def detect_video(video_path=0):  # 默认使用摄像头
    cap = cv2.VideoCapture(video_path)
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        results = model(frame)
        annotated_frame = results[0].plot()
        cv2.imshow("Transmission Line Defect Detection", annotated_frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):  # 按 q 键退出
            break
    cap.release()
    cv2.destroyAllWindows()

# 使用示例
detect_video()  # 使用摄像头
# 或者指定视频路径
# detect_video('path/to/video.mp4')

3. 结果分析与后处理

在得到模型预测结果后,可以根据需要对结果进行进一步分析和处理。例如,计算每个类别的检测数量,或者根据检测结果执行特定操作。

for result in results:
    boxes = result.boxes  # 获取边界框
    for box in boxes:
        cls = int(box.cls.item())  # 类别ID
        conf = box.conf.item()  # 置信度
        xyxy = box.xyxy.tolist()  # 边界框坐标
        print(f"Detected {result.names[cls]} with confidence {conf:.2f} at {xyxy}")

4. 部署

根据的需求选择合适的部署方式。

Web 应用部署

将模型封装成 API,使用 Flask 或 Django 等框架提供服务。

from flask import Flask, request, jsonify
app = Flask(__name__)

@app.route('/predict', methods=['POST'])
def predict():
    file = request.files['image']
    img_bytes = file.read()
    results = model(img_bytes)  # 假设模型支持直接从字节流读取
    # 处理结果并返回
    return jsonify(results)

if __name__ == '__main__':
    app.run(port=5000)
Docker 容器化部署

创建一个 Dockerfile 来打包你的应用程序及其依赖项,便于部署到任何支持 Docker 的环境。

FROM python:3.8-slim

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["python", "app.py"]

然后构建并运行容器:

docker build -t defect-detection .
docker run -p 5000:5000 defect-detection
移动端或边缘设备部署

对于移动端或边缘设备(如 NVIDIA Jetson),你可以将模型导出为 TensorRT、ONNX 或 OpenVINO 格式以获得更好的性能。

yolo export model=best.pt format=engine device=0  # 导出为 TensorRT

5. 系统集成与优化

  • 性能优化:考虑使用量化技术减少模型大小,提高推理速度。
  • 用户界面:开发一个简单的 GUI 界面(如使用 Tkinter 或 PyQt)使系统更易于使用。
  • 持续更新:定期收集新数据并重新训练模型以保持其准确性。

通过以上步骤,建立一个基于深度学习的输电线缺陷检测系统。


仅供参考学习,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值