j基于深度学习Yolov8竹签计数检测系统,带pyqt界面YOLOv8+PYQT5竹签计数检测系统 YOLOV8模型如何训练竹签计数检测数据集

张开发
2026/5/23 16:48:07 15 分钟阅读
j基于深度学习Yolov8竹签计数检测系统,带pyqt界面YOLOv8+PYQT5竹签计数检测系统 YOLOV8模型如何训练竹签计数检测数据集
深度学习框架-Yolov8竹签计数检测系统带pyqt界面竹签计数检测系统项目编号T0010可检测图片、检测视频、支持摄像头实时检测检测借口已封装好并优化代码可读性强竹签计数检测数据集。yolo标签。标签类别序号为0。注意编号从0开始计数共1类。这是一个基于 YOLOv8 PyQt5 的竹签计数检测系统。该系统利用深度学习模型实现对复杂堆叠场景下竹签的高精度识别与计数。系统支持图片、视频及摄像头实时检测适用于自动化包装质检、库存盘点等工业场景。以下是完整的项目配置说明及核心代码实现。 项目配置属性说明项目名称竹签计数检测系统 (T0010)开发环境Python 3.8核心框架Ultralytics YOLOv8, PyQt5检测类别竹签(共 1 类标签序号0)输入模式图片、视频、摄像头实时流输出带检测框和 ID 的图像、总数统计、坐标信息 核心代码实现以下代码封装了界面逻辑与 YOLOv8 检测引擎。你需要安装ultralytics和PyQt5库。1. 项目结构bamboo_stick_counter/ ├── main.py # 主程序 ├── weights/ │ └── best.pt # 训练好的竹签检测模型 └── classes.txt # 类别文件 (内容: stick)2. 主程序代码 (main.py)importsysimportcv2importtimeimporttorchimportnumpyasnpfromPyQt5.QtWidgetsimportQMainWindow,QApplication,QLabel,QPushButton,QVBoxLayout,QWidget,QFileDialog,QTextEdit,QComboBox,QSlider,QHBoxLayoutfromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQTimer,QtfromultralyticsimportYOLOclassBambooStickCounter(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(竹签计数检测系统 - T0010)self.setGeometry(100,100,1200,800)# --- 1. 加载YOLOv8模型 ---# 注意请确保 weights/best.pt 存在self.model_pathweights/best.ptself.modelNoneself.load_model()# --- 2. 界面布局 ---central_widgetQWidget(self)self.setCentralWidget(central_widget)main_layoutQHBoxLayout(central_widget)# 左侧控制栏left_panelQVBoxLayout()self.load_weights_btnQPushButton(加载Weights)self.load_weights_btn.clicked.connect(self.load_model)left_panel.addWidget(self.load_weights_btn)self.image_det_btnQPushButton(图片检测)self.image_det_btn.clicked.connect(self.detect_image)left_panel.addWidget(self.image_det_btn)self.video_det_btnQPushButton(视频检测)self.video_det_btn.clicked.connect(self.detect_video)left_panel.addWidget(self.video_det_btn)self.open_cam_btnQPushButton(打开摄像头)self.open_cam_btn.clicked.connect(self.open_camera)left_panel.addWidget(self.open_cam_btn)self.close_cam_btnQPushButton(关闭摄像头)self.close_cam_btn.clicked.connect(self.close_camera)left_panel.addWidget(self.close_cam_btn)# 参数设置left_panel.addWidget(QLabel(IoU阈值:))self.iou_sliderQSlider(Qt.Horizontal)self.iou_slider.setRange(0,100)self.iou_slider.setValue(45)left_panel.addWidget(self.iou_slider)left_panel.addWidget(QLabel(Conf阈值:))self.conf_sliderQSlider(Qt.Horizontal)self.conf_slider.setRange(0,100)self.conf_slider.setValue(25)left_panel.addWidget(self.conf_slider)# 日志输出self.log_textQTextEdit()self.log_text.setReadOnly(True)left_panel.addWidget(self.log_text)# 右侧显示区right_panelQVBoxLayout()self.image_labelQLabel(显示区域)self.image_label.setAlignment(Qt.AlignCenter)self.image_label.setFixedSize(800,600)right_panel.addWidget(self.image_label)# 底部状态栏self.status_labelQLabel(f状态: 等待加载模型...{time.strftime(%Y-%m-%d %H:%M:%S)})self.setStatusBar(self.status_label)# 组合布局main_layout.addLayout(left_panel,1)main_layout.addLayout(right_panel,3)# --- 3. 变量初始化 ---self.capNoneself.timerQTimer(self)self.timer.timeout.connect(self.update_frame)defload_model(self):加载YOLOv8模型try:ifnotos.path.exists(self.model_path):self.log(错误: weights/best.pt 文件不存在)returnself.modelYOLO(self.model_path)self.log(f模型加载成功:{self.model_path})self.status_label.setText(状态: 模型加载成功)exceptExceptionase:self.log(f加载模型失败:{e})deflog(self,msg):打印日志self.log_text.append(msg)defdetect_image(self):图片检测ifnotself.model:self.log(请先加载模型)returnfile_path,_QFileDialog.getOpenFileName(self,选择图片,,Images (*.png *.xpm *.jpg *.bmp *.jpeg))ifnotfile_path:returnframecv2.imread(file_path)resultsself.model(frame,confself.conf_slider.value()/100,iouself.iou_slider.value()/100)# 解析结果annotated_frameresults[0].plot()countlen(results[0].boxes)cv2.putText(annotated_frame,fNum:{count},(10,50),cv2.FONT_HERSHEY_SIMPLEX,1.5,(0,0,255),3)# 显示self.display_image(annotated_frame)self.log(f图片检测完成总数:{count})defdetect_video(self):视频检测# 类似图片检测使用 cv2.VideoCapture 循环读取帧passdefopen_camera(self):打开摄像头实时检测ifnotself.model:self.log(请先加载模型)returnself.capcv2.VideoCapture(0)ifself.cap.isOpened():self.timer.start(30)# 30ms 刷新一次self.log(摄像头已打开开始实时检测...)defclose_camera(self):关闭摄像头ifself.cap:self.cap.release()self.capNoneself.timer.stop()self.log(摄像头已关闭)defupdate_frame(self):摄像头实时帧处理ret,frameself.cap.read()ifret:# YOLOv8 推理resultsself.model(frame,confself.conf_slider.value()/100,iouself.iou_slider.value()/100)# 绘制结果annotated_frameresults[0].plot()countlen(results[0].boxes)cv2.putText(annotated_frame,fNum:{count},(10,50),cv2.FONT_HERSHEY_SIMPLEX,1.5,(0,0,255),3)# 显示self.display_image(annotated_frame)defdisplay_image(self,img):将OpenCV图像转换为QImage并显示h,w,cimg.shape q_imgQImage(img.data,w,h,w*c,QImage.Format_BGR888)pixmapQPixmap.fromImage(q_img)self.image_label.setPixmap(pixmap.scaled(self.image_label.size(),Qt.KeepAspectRatio))if__name____main__:appQApplication(sys.argv)windowBambooStickCounter()window.show()sys.exit(app.exec_()) 数据集说明 (用于训练best.pt)虽然您已经有了权重文件但为了完整性以下是数据集的标注规范供您参考或扩展数据集标签格式YOLO 格式 (.txt)类别数量1 类类别名称stick(竹签)标注文件内容示例 (image.txt):0 0.500 0.450 0.100 0.150 # 格式: class x_center y_center width height (归一化) 0 0.600 0.350 0.080 0.120 ...data.yaml配置文件path:./datasets/bambootrain:images/trainval:images/valnc:1names:[stick] 如何训练自己的模型 (简要)如果您想基于该数据集重新训练或优化模型请在终端运行以下命令# 假设您已经安装了 ultralyticsyolotaskdetectmodetrainmodelyolov8n.ptdatadata.yamlepochs100imgsz640可以直接替换weights/best.pt来实现对其他物体的计数。

更多文章