深度学习YOLOv11无人机风力发电叶片损伤检测系统-无人机风机损伤缺陷检测数据集-风机设备损伤、脏污检测数据集
无人机风机损伤缺陷检测数据集-风机设备损伤、脏污检测数据集,
2191张,提供yolo,voc,coco三种标注方式
图像尺寸:371*586
类别数量:2类
训练集图像数量:1534; 验证集图像数量:431; 测试集图像数量:226
类别名称: 每一类图像数 ,每一类标注数
damage: 1852,6380
dirt: 407,422
image num: 2191
模型代码
采用 YOLOv11n 网络训练
训练轮次:80 个 epoch
提供全部训练 + 测试源代码
训练精度 mAP 效果如图所示
PyQt5 界面功能
界面使用 PyQt5 开发,提供全部源码(.ui、.qrc、.py 及图标文件)
支持图片检测、视频检测、摄像头实时检测
界面实时显示:目标位置、目标总数、置信度等信息
支持检测结果保存导出
操作简单直观,无需命令行
境
运行环境:Python=3.8、opencv-python、PyQt5、torch
支持 Windows、Linux 系统
一、项目完整信息文档
风机设备损伤、脏污检测数据集
- 总图像:2191张
- 图像尺寸:
371 × 586 - 类别:2类
damage(损伤):图像数1852,标注框6380dirt(脏污):图像数407,标注框422
- 数据集划分
数据集 图片数量 训练集(train) 1534 验证集(val) 431 测试集(test) 226 - 标注格式:YOLO‑txt、VOC‑xml、COCO‑json 三格式
- 训练网络:YOLOv11‑n
- 训练轮次:
epoch=80 - 指标:mAP@0.5 = 0.724
二、YOLOv11训练简易完整代码
1.数据集yaml配置文件wind_defect.yaml
# wind_defect.yamlpath:./datasets/wind_defecttrain:images/trainval:images/valtest:images/testnames:0:damage1:dirt2.训练脚本train.py
fromultralyticsimportYOLO# 加载YOLOv11n轻量化模型model=YOLO("yolo11n.pt")# 开始训练results=model.train(data="wind_defect.yaml",epochs=80,imgsz=640,batch=8,device=0,workers=4,patience=10,project="runs/train",name="wind_blade_detect")3.测试评估脚本test.py
fromultralyticsimportYOLO model=YOLO("./runs/train/wind_blade_detect/weights/best.pt")metrics=model.val(split="test")print(f"mAP@0.5:{metrics.box.map50:.3f}")4.单张图像预测脚本predict.py
fromultralyticsimportYOLO model=YOLO("./runs/train/wind_blade_detect/weights/best.pt")#图片检测res=model.predict(source="test.jpg",save=True,conf=0.5)#视频检测#res = model.predict(source="test.mp4",save=True,conf=0.5)#摄像头实时检测#res = model.predict(source=0,save=True,conf=0.5)三、PyQt5可视化推理界面简易源码
实现:图片、视频、摄像头检测;输出目标数目、置信度、xy坐标
main_ui.py
importsysimportcv2fromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QPushButton,QLabel,QFileDialog,QComboBox,QTextEdit)fromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQt,QThread,pyqtSignalfromultralyticsimportYOLO#加载训练好的权重model=YOLO("./runs/train/wind_blade_detect/weights/best.pt")classDetThread(QThread):send_img=pyqtSignal(object)send_result=pyqtSignal(list)def__init__(self,source):super().__init__()self.source=source self.run_flag=Truedefrun(self):cap=cv2.VideoCapture(self.source)whileself.run_flag:ret,frame=cap.read()ifnotret:breakres=model(frame,conf=0.5)boxes=res[0].boxes det_info=[]forboxinboxes:x1,y1,x2,y2=map(int,box.xyxy[0])conf=float(box.conf[0])cls=int(box.cls[0])det_info.append([x1,y1,x2,y2,conf,cls])cv2.rectangle(frame,(x1,y1),(x2,y2),(255,0,0),2)cv2.putText(frame,f"{model.names[cls]}{conf:.2f}",(x1,y1-8),cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,0,0),1)self.send_img.emit(frame)self.send_result.emit(det_info)cap.release()classMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("基于YOLOv11的风机损伤检测系统")self.resize(1200,800)self.init_ui()self.det_thread=Nonedefinit_ui(self):#图像显示区self.img_label=QLabel(self)self.img_label.setGeometry(20,60,750,600)self.img_label.setStyleSheet("border:1px solid #999;")#按钮self.btn_img=QPushButton("图片检测",self)self.btn_img.setGeometry(820,60,180,40)self.btn_img.clicked.connect(self.detect_image)self.btn_video=QPushButton("视频检测",self)self.btn_video.setGeometry(820,120,180,40)self.btn_video.clicked.connect(self.detect_video)self.btn_cam=QPushButton("摄像头检测",self)self.btn_cam.setGeometry(820,180,180,40)self.btn_cam.clicked.connect(self.detect_camera)#结果文本框self.result_text=QTextEdit(self)self.result_text.setGeometry(820,250,320,380)self.result_text.setPlaceholderText("检测结果、坐标、置信度信息展示")defshow_frame(self,frame):rgb=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)h,w,ch=rgb.shape bytes_per_line=ch*w q_img=QImage(rgb.data,w,h,bytes_per_line,QImage.Format_RGB888)self.img_label.setPixmap(QPixmap.fromImage(q_img).scaled(self.img_label.size(),Qt.KeepAspectRatio))defshow_result(self,det_list):self.result_text.clear()total=len(det_list)self.result_text.append(f"目标总数目:{total}\n")foridx,iteminenumerate(det_list):x1,y1,x2,y2,conf,cls=item cls_name=model.names[cls]self.result_text.append(f"[{idx+1}]类别:{cls_name}置信度:{conf:.2f}\n"f"坐标:xmin={x1},ymin={y1},xmax={x2},ymax={y2}\n")defdetect_image(self):path,_=QFileDialog.getOpenFileName(self,"打开图片","","Image(*.jpg *.png *.jpeg)")ifnotpath:returnframe=cv2.imread(path)res=model(frame,conf=0.5)boxes=res[0].boxes info=[]forboxinboxes:x1,y1,x2,y2=map(int,box.xyxy[0])conf=float(box.conf[0])cls=int(box.cls[0])info.append([x1,y1,x2,y2,conf,cls])cv2.rectangle(frame,(x1,y1),(x2,y2),(255,0,0),2)cv2.putText(frame,f"{model.names[cls]}{conf:.2f}",(x1,y1-8),cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,0,0),1)self.show_frame(frame)self.show_result(info)defdetect_video(self):path,_=QFileDialog.getOpenFileName(self,"打开视频","","Video(*.mp4 *.avi)")ifnotpath:returnself.det_thread=DetThread(path)self.det_thread.send_img.connect(self.show_frame)self.det_thread.send_result.connect(self.show_result)self.det_thread.start()defdetect_camera(self):self.det_thread=DetThread(0)self.det_thread.send_img.connect(self.show_frame)self.det_thread.send_result.connect(self.show_result)self.det_thread.start()if__name__=="__main__":app=QApplication(sys.argv)win=MainWindow()win.show()sys.exit(app.exec_())依赖安装命令
pipinstallultralytics opencv-python pyqt5