智慧电力-基于YOLOv8深度学习的输电线路异物检测系统基于YOLOv8 PyQt5的输电线路异物检测系统的完整实现方案。该系统支持图片、视频和摄像头的实时检测能够识别鸟巢、风筝、气球等异物。以下是详细的代码构建步骤。环境依赖首先确保安装了以下库pipinstallPyQt5 ultralytics opencv-python pandas openpyxl项目结构建议创建以下文件夹结构以保持整洁PowerLine_Detection/ ├── main.py # 主程序入口 ├── ui_main.py # UI界面代码 ├── detect.py # 检测逻辑核心 ├── models/ │ └── best.pt # 训练好的YOLOv8模型权重 ├── test_images/ │ └── test.jpg # 测试图片 └── datasets/ └── data.yaml # 数据集配置文件核心代码实现UI 界面代码 (ui_main.py)此代码生成了你提供的截图中的界面布局包含打开图片/视频、结果显示表格等。# -*- coding: utf-8 -*-fromPyQt5.QtWidgetsimport(QMainWindow,QWidget,QVBoxLayout,QHBoxLayout,QPushButton,QLabel,QTableWidget,QTableWidgetItem,QFileDialog,QComboBox,QSlider,QApplication,QStyleFactory)fromPyQt5.QtGuiimportQPixmap,QImage,QFontfromPyQt5.QtCoreimportQt,QTimer,QThread,pyqtSignalimportsysimportosclassMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(基于深度学习的输电线路异物检测系统)self.setGeometry(100,100,1200,800)# 设置样式self.setStyleSheet( QMainWindow { background-color: #f0f0f0; } QLabel { color: #333; font-size: 14px; } QPushButton { background-color: #007BFF; color: white; border: none; padding: 8px 16px; border-radius: 4px; font-size: 14px; } QPushButton:hover { background-color: #0056b3; } QPushButton#saveBtn { background-color: #28a745; } QPushButton#exitBtn { background-color: #dc3545; } QGroupBox { border: 1px solid #ccc; margin-top: 10px; font-weight: bold; } QGroupBox::title { subcontrol-origin: margin; left: 10px; padding: 0 5px; } )central_widgetQWidget()self.setCentralWidget(central_widget)main_layoutQHBoxLayout(central_widget)# 左侧图像显示区域left_layoutQVBoxLayout()self.image_labelQLabel(图像显示区域)self.image_label.setAlignment(Qt.AlignCenter)self.image_label.setStyleSheet(border: 2px dashed #aaa; background-color: #eee;)left_layout.addWidget(self.image_label)# 右侧控制与结果区域right_layoutQVBoxLayout()# 参数设置 GroupBoxfromPyQt5.QtWidgetsimportQGroupBox,QFormLayout,QDoubleSpinBox param_groupQGroupBox(检测参数设置)param_layoutQFormLayout()self.conf_spinQDoubleSpinBox()self.conf_spin.setRange(0.0,1.0)self.conf_spin.setValue(0.25)self.conf_spin.setSingleStep(0.05)self.iou_spinQDoubleSpinBox()self.iou_spin.setRange(0.0,1.0)self.iou_spin.setValue(0.45)self.iou_spin.setSingleStep(0.05)self.show_labelsQCheckBox(显示标签名称与置信度)self.show_labels.setChecked(True)param_layout.addRow(置信度阈值:,self.conf_spin)param_layout.addRow(交并比阈值:,self.iou_spin)param_layout.addRow(self.show_labels)param_group.setLayout(param_layout)# 检测结果 GroupBoxresult_groupQGroupBox(检测结果)result_layoutQVBoxLayout()self.time_labelQLabel(用时: -- s)self.count_labelQLabel(目标数目: --)self.type_labelQLabel(类型: --)self.confidence_labelQLabel(置信度: --%)self.position_labelQLabel(目标位置: \nxmin: --\nymin: --\nxmax: --\nymax: --)result_layout.addWidget(self.time_label)result_layout.addWidget(self.count_label)result_layout.addWidget(self.type_label)result_layout.addWidget(self.confidence_label)result_layout.addWidget(self.position_label)result_group.setLayout(result_layout)# 操作按钮btn_layoutQHBoxLayout()self.btn_imgQPushButton(打开图片)self.btn_videoQPushButton(打开视频)self.btn_cameraQPushButton(打开摄像头)self.btn_saveQPushButton(保存)self.btn_exitQPushButton(退出)self.btn_save.setObjectName(saveBtn)self.btn_exit.setObjectName(exitBtn)btn_layout.addWidget(self.btn_img)btn_layout.addWidget(self.btn_video)btn_layout.addWidget(self.btn_camera)btn_layout.addWidget(self.btn_save)btn_layout.addWidget(self.btn_exit)# 表格显示self.tableQTableWidget()self.table.setColumnCount(6)self.table.setHorizontalHeaderLabels([序号,文件路径,类别,置信度,坐标位置,操作])self.table.horizontalHeader().setStretchLastSection(True)right_layout.addWidget(param_group)right_layout.addWidget(result_group)right_layout.addLayout(btn_layout)right_layout.addWidget(self.table)main_layout.addLayout(left_layout,60)# 左侧占60%宽度main_layout.addLayout(right_layout,40)# 右侧占40%宽度# 初始化self.capNoneself.timerQTimer(self)self.timer.timeout.connect(self.update_frame)检测逻辑核心 (detect.py)此模块负责加载 YOLOv8 模型并执行推理。# detect.pyfromultralyticsimportYOLOimportcv2importtimeimporttorchclassDetector:def__init__(self,model_pathmodels/best.pt,conf0.25,iou0.45):# 检查设备self.devicecudaiftorch.cuda.is_available()elsecpuprint(fUsing device:{self.device})# 加载模型self.modelYOLO(model_path)self.model.to(self.device)# 设置参数self.confconf self.iouiou# 类别名称 (根据你的数据集修改)self.names[nest,kite,balloon]# 示例鸟巢、风筝、气球defpredict(self,img):执行推理start_timetime.time()# 使用 YOLOv8 的 predict 方法resultsself.model.predict(img,confself.conf,iouself.iou,imgsz640,deviceself.device,verboseFalse)# 解析结果boxes[]scores[]classes[]forresultinresults:ifresult.boxesisnotNone:forboxinresult.boxes:xyxybox.xyxy[0].cpu().numpy()scorebox.conf[0].cpu().numpy()clsint(box.cls[0].cpu().numpy())boxes.append(xyxy)scores.append(score)classes.append(cls)elapsed_timetime.time()-start_timereturnboxes,scores,classes,elapsed_timedefdraw_results(self,img,boxes,scores,classes,show_labelsTrue):在图像上绘制结果forbox,score,clsinzip(boxes,scores,classes):x1,y1,x2,y2map(int,box)color(0,255,0)# BGRcv2.rectangle(img,(x1,y1),(x2,y2),color,2)ifshow_labels:labelf{self.names[cls]}{score:.2f}(w,h),_cv2.getTextSize(label,cv2.FONT_HERSHEY_SIMPLEX,0.6,1)cv2.rectangle(img,(x1,y1-20),(x1w,y1),color,-1)cv2.putText(img,label,(x1,y1-5),cv2.FONT_HERSHEY_SIMPLEX,0.6,(255,255,255),1,cv2.LINE_AA)returnimg主程序 (main.py)连接 UI 和 检测逻辑。# main.pyimportsysimportcv2importosfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QFileDialog,QMessageBoxfromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQt,QTimerimportpandasaspdfromui_mainimportMainWindowfromdetectimportDetectorclassApp(MainWindow):def__init__(self):super().__init__()# 初始化检测器self.detectorDetector()# 连接信号与槽self.btn_img.clicked.connect(self.open_image)self.btn_video.clicked.connect(self.open_video)self.btn_camera.clicked.connect(self.open_camera)self.btn_save.clicked.connect(self.save_results)self.btn_exit.clicked.connect(self.close)self.is_camera_openFalsedefopen_image(self):打开图片并检测file_path,_QFileDialog.getOpenFileName(self,选择图片,,Images (*.jpg *.jpeg *.png))iffile_path:imgcv2.imread(file_path)imgcv2.cvtColor(img,cv2.COLOR_BGR2RGB)self.process_and_display(img,file_path)defopen_video(self):打开视频文件file_path,_QFileDialog.getOpenFileName(self,选择视频,,Videos (*.mp4 *.avi))iffile_path:self.capcv2.VideoCapture(file_path)self.timer.start(30)self.is_camera_openFalsedefopen_camera(self):打开摄像头self.capcv2.VideoCapture(0)ifnotself.cap.isOpened():QMessageBox.warning(self,错误,无法打开摄像头)returnself.timer.start(30)self.is_camera_openTruedefupdate_frame(self):定时器更新视频帧ret,frameself.cap.read()ifret:framecv2.cvtColor(frame,cv2.COLOR_BGR2RGB)file_pathcamera_frame.jpgifself.is_camera_openelsevideo_frame.jpgself.process_and_display(frame,file_path,update_labelFalse)else:self.timer.stop()ifself.is_camera_open:self.cap.release()defprocess_and_display(self,img,file_path,update_labelTrue):处理图像并更新界面boxes,scores,classes,time_usedself.detector.predict(img)img_showself.detector.draw_results(img.copy(),boxes,scores,classes,self.show_labels.isChecked())# 更新图像显示h,w,cimg_show.shape q_imgQImage(img_show.data,w,h,w*c,QImage.Format_RGB888)self.image_label.setPixmap(QPixmap.fromImage(q_img).scaled(self.image_label.size(),Qt.KeepAspectRatio))# 更新结果文本ifupdate_label:self.time_label.setText(f用时:{time_used:.3f}s)self.count_label.setText(f目标数目:{len(boxes)})ifboxes:# 只显示第一个检测到的目标的详细信息可根据需求修改boxboxes[0]scorescores[0]clsclasses[0]self.type_label.setText(f类型:{self.detector.names[cls]})self.confidence_label.setText(f置信度:{score*100:.2f}%)self.position_label.setText(f目标位置: \nxmin:{int(box[0])}\nymin:{int(box[1])}\nxmax:{int(box[2])}\nymax:{int(box[3])})else:self.type_label.setText(类型: 无)self.confidence_label.setText(置信度: --)self.position_label.setText(目标位置: \nxmin: --\nymin: --\nxmax: --\nymax: --)# 更新表格row_positionself.table.rowCount()self.table.insertRow(row_position)self.table.setItem(row_position,0,QTableWidgetItem(str(row_position1)))self.table.setItem(row_position,1,QTableWidgetItem(file_path))self.table.setItem(row_position,2,QTableWidgetItem(self.detector.names[classes[0]]ifclasseselse无))self.table.setItem(row_position,3,QTableWidgetItem(f{scores[0]*100:.2f}%ifscoreselse--))self.table.setItem(row_position,4,QTableWidgetItem(str(boxes[0])ifboxeselse--))defsave_results(self):保存检测结果到Exceldata[]forrowinrange(self.table.rowCount()):row_data[]forcolinrange(5):# 前5列itemself.table.item(row,col)row_data.append(item.text()ifitemelse)data.append(row_data)dfpd.DataFrame(data,columns[序号,文件路径,类别,置信度,坐标位置])save_path,_QFileDialog.getSaveFileName(self,保存结果,detection_results.xlsx,Excel Files (*.xlsx))ifsave_path:df.to_excel(save_path,indexFalse)QMessageBox.information(self,成功,结果已保存)if__name____main__:appQApplication(sys.argv)windowApp()window.show()sys.exit(app.exec_())使用说明将best.pt放入models/文件夹。运行main.py。点击“打开图片”选择测试图片系统将自动进行检测并在右侧显示结果。支持切换为视频或摄像头模式。