如何根据训练出的输电线路缺陷数据集(绝缘子自爆,破损,闪络,鸟巢,防震锤脱落五种缺陷)权重,建立深度学习yolov8输电线缺陷检测系统
如何根据训练出的输电线路缺陷数据集(绝缘子自爆,破损,闪络,鸟巢,防震锤脱落五种缺陷)权重,建立深度学习yolov8输电线缺陷检测系统
文章目录
- ✅ 一、数据集概述
- ✅ 二、环境准备
- ✅ 一、数据集结构与说明
- 📁 推荐目录结构如下:
- ✅ 二、XML 转 YOLO TXT 标签脚本
- ✅ 三、划分数据集(train/val/test)
- ✅ 四、创建 `data.yaml` 文件
- ✅ 五、YOLOv8 模型训练命令
- ✅ 六、性能评估
- ✅ 七、推理与部署
- ✅ 八、模型导出(ONNX / TensorRT / OpenVINO)
- 1. 准备工作
- 2. 模型加载与推理
- 加载模型
- 单张图片推理
- 视频或摄像头实时检测
- 3. 结果分析与后处理
- 4. 部署
- Web 应用部署
- Docker 容器化部署
- 移动端或边缘设备部署
- 5. 系统集成与优化
输电线路数据集(绝缘子自爆,破损,闪络,鸟巢,防震锤脱落五种缺陷)
包括
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-mvenv powerline_envsourcepowerline_env/bin/activate# Windows: powerline_env\Scripts\activate# 安装依赖pipinstallultralytics 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 标签脚本
importosimportxml.etree.ElementTreeasET# 类别映射(请根据你的实际类别顺序填写)class_mapping={'insulator_burst':0,'insulator_damage':1,'flashover':2,'bird_nest':3,'damper_fall':4}defconvert_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)ifnotos.path.exists(img_path):print(f"Image{img_path}not found. Skipping.")returnsize=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')withopen(label_file,'w')asout_file:forobjinroot.findall('object'):cls=obj.find('name').textifclsnotinclass_mapping:continuecls_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)forxml_fileinos.listdir(annotations_dir):ifxml_file.endswith('.xml'):convert_xml_to_yolo(os.path.join(annotations_dir,xml_file),labels_output_dir,images_dir)✅ 三、划分数据集(train/val/test)
importosimportrandomimportshutil# 设置路径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=[fforfinos.listdir(images_dir)iff.endswith(('.jpg','.jpeg','.png'))]random.shuffle(all_images)# 划分比例train_ratio=0.8val_ratio=0.15train_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:]defcopy_files(files,src_img,src_lbl,dst_img,dst_lbl):forfileinfiles: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"ifos.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/trainval:./dataset/images/valtest:./dataset/images/testnc:5# 总共5个类别names:['insulator_burst','insulator_damage','flashover','bird_nest','damper_fall']✅ 五、YOLOv8 模型训练命令
yolotask=detectmode=trainmodel=yolov8s.ptdata=data.yamlepochs=100imgsz=640batch=16workers=4—
✅ 六、性能评估
yolotask=detectmode=valmodel=runs/detect/train/weights/best.ptdata=data.yaml✅ 七、推理与部署
# 单图推理yolotask=detectmode=predictmodel=best.ptsource=path/to/image.jpgsave=True# 视频或摄像头yolotask=detectmode=predictmodel=best.ptsource=path/to/video.mp4save=True✅ 八、模型导出(ONNX / TensorRT / OpenVINO)
# 导出 ONNXyoloexportmodel=best.ptformat=onnx# 导出 TensorRT(NVIDIA 设备)yoloexportmodel=best.ptformat=enginedevice=0# 导出 OpenVINO(Intel 设备)yoloexportmodel=best.ptformat=openvino基于训练好的权重建立一个深度学习输电线缺陷检测系统涉及多个步骤,
代码示例,仅供参考。
1. 准备工作
确保完成了模型的训练,并保存了最佳权重文件(如best.pt)。同时,确保你的环境中安装了必要的库:
pipinstallultralytics opencv-python-headless numpy tqdm2. 模型加载与推理
首先,需要加载训练好的模型,并使用它进行图像或视频的推理。
加载模型
fromultralyticsimportYOLO# 加载预训练模型model=YOLO('runs/detect/train/weights/best.pt')# 替换为你的最佳权重路径单张图片推理
importcv2defdetect_image(image_path):results=model(image_path)# 进行推理forrinresults:im_array=r.plot()# 绘制结果im=Image.fromarray(im_array[...,::-1])# 转换颜色通道顺序im.show()# 显示结果# 使用示例detect_image('path/to/image.jpg')视频或摄像头实时检测
defdetect_video(video_path=0):# 默认使用摄像头cap=cv2.VideoCapture(video_path)whilecap.isOpened():ret,frame=cap.read()ifnotret:breakresults=model(frame)annotated_frame=results[0].plot()cv2.imshow("Transmission Line Defect Detection",annotated_frame)ifcv2.waitKey(1)&0xFF==ord('q'):# 按 q 键退出breakcap.release()cv2.destroyAllWindows()# 使用示例detect_video()# 使用摄像头# 或者指定视频路径# detect_video('path/to/video.mp4')3. 结果分析与后处理
在得到模型预测结果后,可以根据需要对结果进行进一步分析和处理。例如,计算每个类别的检测数量,或者根据检测结果执行特定操作。
forresultinresults:boxes=result.boxes# 获取边界框forboxinboxes:cls=int(box.cls.item())# 类别IDconf=box.conf.item()# 置信度xyxy=box.xyxy.tolist()# 边界框坐标print(f"Detected{result.names[cls]}with confidence{conf:.2f}at{xyxy}")4. 部署
根据的需求选择合适的部署方式。
Web 应用部署
将模型封装成 API,使用 Flask 或 Django 等框架提供服务。
fromflaskimportFlask,request,jsonify app=Flask(__name__)@app.route('/predict',methods=['POST'])defpredict():file=request.files['image']img_bytes=file.read()results=model(img_bytes)# 假设模型支持直接从字节流读取# 处理结果并返回returnjsonify(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"]然后构建并运行容器:
dockerbuild-tdefect-detection.dockerrun-p5000:5000 defect-detection移动端或边缘设备部署
对于移动端或边缘设备(如 NVIDIA Jetson),你可以将模型导出为 TensorRT、ONNX 或 OpenVINO 格式以获得更好的性能。
yoloexportmodel=best.ptformat=enginedevice=0# 导出为 TensorRT5. 系统集成与优化
- 性能优化:考虑使用量化技术减少模型大小,提高推理速度。
- 用户界面:开发一个简单的 GUI 界面(如使用 Tkinter 或 PyQt)使系统更易于使用。
- 持续更新:定期收集新数据并重新训练模型以保持其准确性。
通过以上步骤,建立一个基于深度学习的输电线缺陷检测系统。
仅供参考学习,
