深度学习框架YOLOV8模型如何训练水下生物检测数据集 构建基于YOLOv8➕pyqt5的水下生物检测系统 海胆‘, ‘海参‘, ‘扇贝‘, ‘海星‘, ‘水草
享基于YOLOv8➕pyqt5的水下生物检测系统内含7600张水下生物数据集包括[‘海胆’, ‘海参’, ‘扇贝’, ‘海星’, ‘水草’]5类也可自行替换模型使用该界面做其他检测这是一个非常经典的计算机视觉应用项目结合了深度学习的目标检测YOLOv8和桌面端图形界面PyQt5。这种系统常用于海洋生物普查、水产养殖监控等领域。以下是为您整理的详细项目文档和核心代码实现。该代码结构清晰您可以直接下载使用或者将模型替换为您自己的权重文件.pt来检测其他物体。 项目文档基于YOLOv8的水下生物检测系统1. 项目环境配置在运行代码前请确保已安装以下依赖库。建议使用 Python 3.8 和虚拟环境。# 创建并激活虚拟环境 (可选)conda create-nyolo_envpython3.9conda activate yolo_env# 安装核心库pipinstallPyQt5 opencv-python numpy pandas pipinstallultralytics# YOLOv8官方库2. 项目文件结构为了让代码能够顺利运行请按照以下结构组织文件underwater_detection/ ├── main.py # 主程序入口 ├── ui_main.py # PyQt5生成的界面代码 (或直接写在main里) ├── weights/ │ └── best.pt # 您的YOLOv8训练权重文件 (7600张数据集训练结果) ├── datasets/ │ └── classes.txt # 类别文件 (海胆,海参,扇贝,海星,水草) └── resources/ └── logo.png # 系统图标 系统核心代码 (main.py)这份代码包含了界面绘制、视频流处理、检测逻辑和结果展示的完整流程。importsysimportcv2importtimeimporttorchimportnumpyasnpfromPyQt5.QtWidgetsimportQMainWindow,QApplication,QLabel,QPushButton,QFileDialog,QVBoxLayout,QWidget,QTableWidget,QTableWidgetItem,QComboBox,QProgressBarfromPyQt5.QtGuiimportQImage,QPixmap,QFontfromPyQt5.QtCoreimportQTimer,QtfromultralyticsimportYOLOimportpandasaspd# # 1. 检测器类 (封装YOLOv8逻辑)# classDetector:def__init__(self,weights_path,conf_threshold0.25):# 加载YOLOv8模型 (自动检测CPU/GPU)self.modelYOLO(weights_path)self.conf_thresholdconf_threshold self.namesself.model.names# 获取类别名称列表defpredict(self,img): 执行推理 :param img: BGR格式的numpy图像 :return: 带标注的图像, 检测结果列表 # YOLOv8推理resultsself.model(img,confself.conf_threshold,imgsz640)# 解析结果annotated_frameresults[0].plot()# 获取带有框和标签的图像boxesresults[0].boxes.xyxy.cpu().numpy()# 边界框confsresults[0].boxes.conf.cpu().numpy()# 置信度clssresults[0].boxes.cls.cpu().numpy()# 类别ID# 构建结果字典detections[]foriinrange(len(boxes)):x1,y1,x2,y2map(int,boxes[i])confround(confs[i],2)cls_idint(clss[i])cls_nameself.names[cls_id]detections.append({name:cls_name,conf:conf,bbox:(x1,y1,x2,y2),cls_id:cls_id})returnannotated_frame,detections# # 2. 主窗口界面 (PyQt5 GUI)# classMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(基于深度学习的水下生物检测系统)self.setGeometry(100,50,1200,800)self.setFixedSize(1200,800)# --- 初始化变量 ---self.capNoneself.timerQTimer()self.timer.timeout.connect(self.update_frame)self.detectorDetector(weights/best.pt,conf_threshold0.3)# 加载模型self.current_imageNoneself.detection_results[]# --- 界面布局 ---central_widgetQWidget()self.setCentralWidget(central_widget)main_layoutQVBoxLayout(central_widget)# 顶部Logo和标题title_labelQLabel( 基于深度学习的水下生物检测系统)title_label.setFont(QFont(Arial,24,QFont.Bold))title_label.setAlignment(Qt.AlignCenter)main_layout.addWidget(title_label)# 中间左右布局 (图像显示 控制面板)fromPyQt5.QtWidgetsimportQHBoxLayout content_layoutQHBoxLayout()# 左侧图像显示区域self.image_labelQLabel(等待图像输入...)self.image_label.setFixedSize(800,600)self.image_label.setStyleSheet(border: 2px solid #4CAF50; background-color: #222;)self.image_label.setAlignment(Qt.AlignCenter)# 右侧控制与结果面板right_panelQVBoxLayout()# 检测参数设置self.conf_sliderself.create_slider(置信度阈值,25,100,30)self.iou_sliderself.create_slider(交并比阈值,20,100,45)# 按钮区域btn_styleQPushButton {background-color: #4CAF50; color: white; padding: 10px; font-size: 14px; border-radius: 5px;}self.btn_imageQPushButton(️ 打开图片)self.btn_videoQPushButton( 打开视频)self.btn_cameraQPushButton( 打开摄像头)self.btn_stopQPushButton(⏹️ 停止检测)self.btn_image.setStyleSheet(btn_style)self.btn_video.setStyleSheet(btn_style)self.btn_camera.setStyleSheet(btn_style)self.btn_stop.setStyleSheet(QPushButton {background-color: #F44336;})# 结果显示表格self.result_tableQTableWidget()self.result_table.setColumnCount(5)self.result_table.setHorizontalHeaderLabels([序号,类别,置信度,位置(XY),文件路径])self.result_table.horizontalHeader().setStretchLastSection(True)# 添加到右侧布局right_panel.addWidget(self.conf_slider)right_panel.addWidget(self.iou_slider)right_panel.addWidget(self.btn_image)right_panel.addWidget(self.btn_video)right_panel.addWidget(self.btn_camera)right_panel.addWidget(self.btn_stop)right_panel.addWidget(self.result_table)# 组合布局content_layout.addWidget(self.image_label)content_layout.addLayout(right_panel)main_layout.addLayout(content_layout)# --- 信号连接 ---self.btn_image.clicked.connect(self.load_image)self.btn_video.clicked.connect(self.load_video)self.btn_camera.clicked.connect(self.open_camera)self.btn_stop.clicked.connect(self.stop_detection)defcreate_slider(self,name,min_val,max_val,default):fromPyQt5.QtWidgetsimportQLabel,QSlider layoutQVBoxLayout()labelQLabel(f{name}:{default/100:.2f})sliderQSlider(Qt.Horizontal)slider.setMinimum(min_val)slider.setMaximum(max_val)slider.setValue(default)slider.setTickInterval(5)slider.setTickPosition(QSlider.TicksBelow)defupdate_label(val):label.setText(f{name}:{val/100:.2f})slider.valueChanged.connect(update_label)layout.addWidget(label)layout.addWidget(slider)containerQWidget()container.setLayout(layout)returncontainer# --- 功能函数 ---defload_image(self):file_path,_QFileDialog.getOpenFileName(self,选择图片,./,Images (*.png *.xpm *.jpg *.bmp *.gif))iffile_path:self.stop_detection()# 停止之前的任务imgcv2.imread(file_path)self.current_imageimg self.detect_and_display(img,file_path)defload_video(self):file_path,_QFileDialog.getOpenFileName(self,选择视频,./,Videos (*.mp4 *.avi *.mov))iffile_path:self.stop_detection()self.capcv2.VideoCapture(file_path)self.timer.start(30)defopen_camera(self):self.stop_detection()self.capcv2.VideoCapture(0)self.timer.start(30)defstop_detection(self):self.timer.stop()ifself.cap:self.cap.release()self.capNoneself.image_label.setText(摄像头已关闭)defupdate_frame(self):ifself.capandself.cap.isOpened():ret,frameself.cap.read()ifret:# 获取滑块数值confself.conf_slider.findChildren(QSlider)[0].value()/100.0iouself.iou_slider.findChildren(QSlider)[0].value()/100.0# 更新检测器阈值self.detector.conf_thresholdconf# 推理result_img,detectionsself.detector.predict(frame)# 显示图像self.display_image(result_img)# 更新表格 (简化版)self.update_result_table(detections,实时流)else:self.stop_detection()defdetect_and_display(self,img,file_path):# 推理result_img,detectionsself.detector.predict(img)# 显示self.display_image(result_img)# 更新表格self.update_result_table(detections,file_path)defdisplay_image(self,img):# BGR to RGBimgcv2.cvtColor(img,cv2.COLOR_BGR2RGB)h,w,cimg.shape q_imgQImage(img.data,w,h,w*c,QImage.Format_RGB888)pixmapQPixmap.fromImage(q_img).scaled(self.image_label.size(),Qt.KeepAspectRatio,Qt.SmoothTransformation)self.image_label.setPixmap(pixmap)defupdate_result_table(self,detections,source_path):self.result_table.setRowCount(len(detections))forrow,detinenumerate(detections):self.result_table.setItem(row,0,QTableWidgetItem(str(row1)))self.result_table.setItem(row,1,QTableWidgetItem(det[name]))self.result_table.setItem(row,2,QTableWidgetItem(str(det[conf])))self.result_table.setItem(row,3,QTableWidgetItem(f({det[bbox][0]},{det[bbox][1]})))self.result_table.setItem(row,4,QTableWidgetItem(source_path))# # 3. 启动程序# if__name____main__:appQApplication(sys.argv)windowMainWindow()window.show()sys.exit(app.exec_()) 代码说明模型加载 (Detector类)使用ultralytics.YOLO加载您的best.pt权重。predict方法返回带有标注的图像和检测结果列表。界面布局 (MainWindow类)使用QVBoxLayout和QHBoxLayout组织界面。左侧QLabel用于显示实时视频流或图片。右侧包含滑动条调节置信度和IOU、按钮和表格。事件处理load_image/load_video读取本地文件。open_camera调用默认摄像头索引0。update_frame定时器触发每一帧都进行推理。结果显示使用QTableWidget动态更新检测到的物体类别、置信度和位置。 如何运行将上述代码保存为main.py。确保weights/best.pt路径正确即您训练好的7600张数据集的模型。安装依赖库。运行python main.py。支持图片、视频和实时摄像头三种输入源。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2475529.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!