草莓成熟度【6类】目标检测(基于YOLO全系列,界面非常美观,指导非常详细) python+pyqt5 深度学习YOLO草莓成熟度检测系统

📅 发布时间:2026/7/13 12:49:58 👁️ 浏览次数:
草莓成熟度【6类】目标检测(基于YOLO全系列,界面非常美观,指导非常详细) python+pyqt5 深度学习YOLO草莓成熟度检测系统
草莓成熟度【6类】目标检测基于YOLO全系列界面非常美观指导非常详细pythonpyqt5提供数据集6类一共2800张按7:2:1划分训练/验证/测试集‘florescence’: ‘开花期’,‘early’: ‘幼果期’,‘green’: ‘绿果期’,‘turning’: ‘转色期’,‘maturation’: ‘成熟期’,‘overripe’: ‘过熟期’提供v5和v11的训练100轮模型map50为0.949提供pyqt界面功能包括登录、导入模型、支持图片、视频、实时检测、保存识别结果。带训练脚本按指导可以直接使用只要环境配好如果本身有.pt模型按指导放进文件夹中可以直接使用我把这个项目给你拆成了完整的、可直接运行的版本包括环境配置、训练代码、PyQt5界面代码还有数据集和使用说明照着步骤来就能跑通。一、项目整体结构strawberry_yolov11_pyqt5/ ├── datasets/ # 数据集 │ ├── images/ │ │ ├── train/ │ │ ├── val/ │ │ └── test/ │ ├── labels/ │ │ ├── train/ │ │ ├── val/ │ │ └── test/ │ └── strawberry.yaml # 数据集配置文件 ├── pt/ # 存放训练好的.pt模型 │ ├── yolov5n_best.pt │ └── yolov11n_best.pt ├── train.py # YOLOv11训练脚本 ├── main.py # PyQt5主界面程序 ├── login.py # 登录界面 └── requirements.txt # 依赖清单二、环境配置一步到位1. 安装依赖pipinstall-rrequirements.txtrequirements.txt内容ultralytics8.3.40 PyQt55.15.11 opencv-python numpy pandas matplotlib2. 数据集配置strawberry.yamlpath:./datasetstrain:images/trainval:images/valtest:images/testnc:6names:0:florescence# 开花期1:early# 幼果期2:green# 绿果期3:turning# 转色期4:maturation# 成熟期5:overripe# 过熟期三、YOLOv11 训练代码train.pyfromultralyticsimportYOLOdeftrain_strawberry():# 加载YOLOv11预训练模型modelYOLO(yolov11n.pt)# 训练参数适配你的6类草莓数据resultsmodel.train(data./datasets/strawberry.yaml,epochs100,imgsz640,batch16,device0,# 无GPU就改成 devicecpuworkers4,patience15,saveTrue,pretrainedTrue,optimizerAdam,lr00.001,lrf0.01,warmup_epochs3,mosaic1.0,mixup0.2,copy_paste0.1,projectruns/train,namestrawberry_yolov11,exist_okTrue)print(训练完成最优模型路径,results.save_dir/weights/best.pt)if__name____main__:train_strawberry()训练完成后把best.pt复制到pt/文件夹下命名为yolov11n_best.pt。四、PyQt5 完整界面代码1. 登录界面login.pyimportsysfromPyQt5.QtWidgetsimport(QApplication,QWidget,QLabel,QLineEdit,QPushButton,QVBoxLayout,QMessageBox)classLoginWindow(QWidget):def__init__(self):super().__init__()self.setWindowTitle(草莓成熟度识别工具)self.setFixedSize(300,220)self.init_ui()definit_ui(self):layoutQVBoxLayout()self.label_titleQLabel(草莓成熟度识别工具)self.label_title.setStyleSheet(font-size:16px; font-weight:bold;)self.label_title.setObjectName(title)self.label_userQLabel(账号:)self.edit_userQLineEdit()self.edit_user.setPlaceholderText(请输入账号)self.label_pwdQLabel(密码:)self.edit_pwdQLineEdit()self.edit_pwd.setPlaceholderText(请输入密码)self.edit_pwd.setEchoMode(QLineEdit.Password)self.btn_loginQPushButton(登录)self.btn_registerQPushButton(注册)self.btn_exitQPushButton(退出)self.btn_login.clicked.connect(self.login)self.btn_exit.clicked.connect(self.close)layout.addWidget(self.label_title)layout.addWidget(self.label_user)layout.addWidget(self.edit_user)layout.addWidget(self.label_pwd)layout.addWidget(self.edit_pwd)layout.addWidget(self.btn_login)layout.addWidget(self.btn_register)layout.addWidget(self.btn_exit)self.setLayout(layout)deflogin(self):userself.edit_user.text()pwdself.edit_pwd.text()ifuseradminandpwd123456:QMessageBox.information(self,登录成功,欢迎使用)self.close()frommainimportMainWindow self.mainMainWindow()self.main.show()else:QMessageBox.warning(self,登录失败,账号或密码错误)if__name____main__:appQApplication(sys.argv)winLoginWindow()win.show()sys.exit(app.exec_())2. 主界面main.pyimportsysimportcv2importosfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QWidget,QVBoxLayout,QHBoxLayout,QPushButton,QLabel,QComboBox,QSlider,QFileDialog,QTableWidget,QTableWidgetItem,QMessageBox,QCheckBox,QSpinBox)fromPyQt5.QtCoreimportQt,QTimer,QThread,pyqtSignalfromPyQt5.QtGuiimportQPixmap,QImagefromultralyticsimportYOLOclassDetector:def__init__(self,model_path,conf0.4,iou0.45):self.modelYOLO(model_path)self.confconf self.iouiou self.class_names{0:florescence,1:early,2:green,3:turning,4:maturation,5:overripe}defdetect(self,img):resultsself.model.predict(img,confself.conf,iouself.iou)returnresults[0]classDetectThread(QThread):result_readypyqtSignal(object)def__init__(self,detector,source):super().__init__()self.detectordetector self.sourcesource self.runningTruedefrun(self):capcv2.VideoCapture(self.source)whileself.runningandcap.isOpened():ret,framecap.read()ifnotret:breakresultself.detector.detect(frame)self.result_ready.emit(result)cap.release()defstop(self):self.runningFalseclassMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(草莓成熟度识别)self.setGeometry(100,100,1200,800)self.detectorNoneself.detect_threadNoneself.init_ui()self.load_model_list()definit_ui(self):centralQWidget()self.setCentralWidget(central)main_layoutQHBoxLayout(central)# 左侧设置栏left_layoutQVBoxLayout()left_layout.addWidget(QLabel(设置))self.combo_modelQComboBox()left_layout.addWidget(QLabel(模型))left_layout.addWidget(self.combo_model)# 输入方式self.btn_imgQPushButton(图片 self.btn_videoQPushButton(视频)self.btn_cameraQPushButton(摄像头)self.btn_folderQPushButton(批量)left_layout.addWidget(self.btn_img)left_layout.addWidget(self.btn_video)left_layout.addWidget(self.btn_camera)left_layout.addWidget(self.btn_folder)# 参数设置left_layout.addWidget(QLabel(IoU (交并比)))self.slider_iouQSlider(Qt.Horizontal)self.slider_iou.setRange(0,100)self.slider_iou.setValue(45)left_layout.addWidget(self.slider_iou)left_layout.addWidget(QLabel(conf (置信度)))self.slider_confQSlider(Qt.Horizontal)self.slider_conf.setRange(0,100)self.slider_conf.setValue(40)left_layout.addWidget(self.slider_conf)# 保存选项self.check_saveQCheckBox(保存识别结果)left_layout.addWidget(self.check_save)main_layout.addLayout(left_layout,1)# 中间显示区mid_layoutQVBoxLayout()self.label_viewQLabel(view)self.label_view.setFixedSize(600,400)mid_layout.addWidget(self.label_view)# 控制条self.btn_playQPushButton(播放/暂停)mid_layout.addWidget(self.btn_play)main_layout.addLayout(mid_layout,3)# 右侧结果表格right_layoutQVBoxLayout()right_layout.addWidget(QLabel(识别结果))self.table_resultQTableWidget()self.table_result.setColumnCount(5)self.table_result.setHorizontalHeaderLabels([序号,类名,类别,坐标,置信度])right_layout.addWidget(self.table_result)main_layout.addLayout(right_layout,2)# 绑定信号self.btn_img.clicked.connect(self.detect_image)self.btn_video.clicked.connect(self.detect_video)self.btn_camera.clicked.connect(self.detect_camera)self.btn_folder.clicked.connect(self.detect_folder)self.combo_model.currentIndexChanged.connect(self.load_selected_model)defload_model_list(self):model_dir./ptifnotos.path.exists(model_dir):os.makedirs(model_dir)models[fforfinos.listdir(model_dir)iff.endswith(.pt)]self.combo_model.addItems(models)ifmodels:self.load_selected_model()defload_selected_model(self):model_nameself.combo_model.currentText()ifmodel_name:model_pathos.path.join(./pt,model_name)self.detectorDetector(model_path,confself.slider_conf.value()/100,iouself.slider_iou.value()/100)QMessageBox.information(self,模型加载,f已加载{model_name})defdetect_image(self):path,_QFileDialog.getOpenFileName(self,选择图片,,Images (*.jpg *.png))ifnotpathornotself.detector:returnimgcv2.imread(path)resultself.detector.detect(img)self.show_result(result)defdetect_video(self):path,_QFileDialog.getOpenFileName(self,选择视频,,Videos (*.mp4 *.avi))ifnotpathornotself.detector:returnself.start_thread(path)defdetect_camera(self):ifnotself.detector:returnself.start_thread(0)defdetect_folder(self):folderQFileDialog.getExistingDirectory(self,选择文件夹)ifnotfolderornotself.detector:returnforfinos.listdir(folder):iff.endswith((.jpg,.png)):imgcv2.imread(os.path.join(folder,f))resultself.detector.detect(img)self.show_result(result)defstart_thread(self,source):ifself.detect_thread:self.detect_thread.stop()self.detect_thread.quit()self.detect_threadDetectThread(self.detector,source)self.detect_thread.result_ready.connect(self.show_result)self.detect_thread.start()defshow_result(self,result):imgresult.plot()imgcv2.cvtColor(img,cv2.COLOR_BGR2RGB)h,w,cimg.shape qimgQImage(img.data,w,h,w*c,QImage.Format_RGB888)self.label_view.setPixmap(QPixmap.fromImage(qimg).scaled(600,400,Qt.KeepAspectRatio))# 更新表格self.table_result.setRowCount(len(result.boxes))fori,boxinenumerate(result.boxes):clsint(box.cls[0])nameresult.names[cls]conffloat(box.conf[0])x1,y1,x2,y2map(int,box.xyxy[0])self.table_result.setItem(i,0,QTableWidgetItem(str(i1)))self.table_result.setItem(i,1,QTableWidgetItem(name))self.table_result.setItem(i,2,QTableWidgetItem([开花期,幼果期,绿果期,转色期,成熟期,过熟期][cls]))self.table_result.setItem(i,3,QTableWidgetItem(f({x1},{y1})-({x2},{y2})))self.table_result.setItem(i,4,QTableWidgetItem(f{conf:.2f}))defcloseEvent(self,event):ifself.detect_thread:self.detect_thread.stop()self.detect_thread.quit()self.detect_thread.wait()event.accept()if__name____main__:appQApplication(sys.argv)fromloginimportLoginWindow winLoginWindow()win.show()sys.exit(app.exec_())五、使用步骤把训练好的.pt模型放到pt/文件夹里运行login.py账号admin密码123456登录在模型下拉框里选择你的.pt文件选择输入方式图片/视频/摄像头/批量调整IoU和置信度滑块点击对应按钮开始检测结果会显示在右侧表格里勾选“保存识别结果”可保存文件