news 2026/4/15 10:26:32

基于深度学习YOLOv12的固体垃圾废物识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于深度学习YOLOv12的固体垃圾废物识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

一、项目介绍

本项目旨在开发一个基于前沿目标检测模型YOLOv12的固体废物自动识别系统。系统专注于对两种最常见的可回收物——瓶类(Bottle)罐类(Cans)进行高精度、实时的检测与定位。通过对包含近8000张图像的数据集进行模型训练与优化,该模型能够有效学习瓶罐类废物的视觉特征,为后续的自动化垃圾分类、回收流程提供核心的视觉感知能力,是推动智慧环保和城市垃圾智能化管理的关键技术实践。

目录

一、项目介绍

二、项目功能展示

2.1 用户登录系统

2.2 检测功能

2.3 检测结果显示

2.4 参数配置

2.5 其他功能

3. 技术特点

4. 系统流程

三、数据集介绍

数据集配置文件

四、项目环境配置

创建虚拟环境

安装所需要库

五、模型训练

训练代码

训练结果

六、核心代码

🔐登录注册验证

🎯 多重检测模式

🖼️ 沉浸式可视化

⚙️ 参数配置系统

✨ UI美学设计

🔄 智能工作流

七、项目源码(视频简介)


基于深度学习YOLOv12的固体垃圾废物识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)_哔哩哔哩_bilibili

基于深度学习YOLOv12的固体垃圾废物识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

二、项目功能展示

✅ 用户登录注册:支持密码检测和安全性验证。

✅ 三种检测模式:基于YOLOv12模型,支持图片、视频和实时摄像头三种检测,精准识别目标。

✅ 双画面对比:同屏显示原始画面与检测结果。

✅ 数据可视化:实时表格展示检测目标的类别、置信度及坐标。

✅智能参数调节:提供置信度滑块,动态优化检测精度,适应不同场景需求。

✅科幻风交互界面:深色主题搭配动态光效,减少视觉疲劳,提升操作体验。

✅多线程高性能架构:独立检测线程保障流畅运行,实时状态提示,响应迅速无卡顿。

2.1 用户登录系统

  • 提供用户登录和注册功能

  • 用户名和密码验证

  • 账户信息本地存储(accounts.json)

  • 密码长度至少6位的安全要求

2.2 检测功能

  • 图片检测:支持JPG/JPEG/PNG/BMP格式图片的火焰烟雾检测

  • 视频检测:支持MP4/AVI/MOV格式视频的逐帧检测

  • 摄像头检测:实时摄像头流检测(默认摄像头0)

  • 检测结果保存到"results"目录

2.3 检测结果显示

  • 显示原始图像和检测结果图像

  • 检测结果表格展示,包含:

    • 检测到的类别

    • 置信度分数

    • 物体位置坐标(x,y)、

2.4 参数配置

  • 模型选择

  • 置信度阈值调节(0-1.0)

  • IoU(交并比)阈值调节(0-1.0)

  • 实时同步滑块和数值输入框

2.5 其他功能

  • 检测结果保存功能

  • 视频检测时自动保存结果视频

  • 状态栏显示系统状态和最后更新时间

  • 无边框窗口设计,可拖动和调整大小

3. 技术特点

  • 采用多线程处理检测任务,避免界面卡顿

  • 精美的UI设计,具有科技感的视觉效果:

    • 发光边框和按钮

    • 悬停和按下状态效果

    • 自定义滑块、表格和下拉框样式

  • 检测结果保存机制

  • 响应式布局,适应不同窗口大小

4. 系统流程

  1. 用户登录/注册

  2. 选择检测模式(图片/视频/摄像头)

  3. 调整检测参数(可选)

  4. 开始检测并查看结果

  5. 可选择保存检测结果

  6. 停止检测或切换其他模式

三、数据集介绍

本系统的性能基础是一个高质量、精心标注的专用数据集。该数据集针对瓶类和罐类废物进行了大规模收集和标注,确保了模型的泛化能力和鲁棒性。

1. 数据集概览:

  • 类别定义(nc: 2):数据集中共包含2个目标类别。

    • 'Bottle': 泛指各种材质的瓶形容器,如塑料瓶、玻璃瓶等。

    • 'Cans': 泛指金属材质的罐形容器,如易拉罐、金属罐头盒等。

  • 数据总量:数据集图像总数共计7,967 张

  • 数据划分:为遵循机器学习最佳实践,确保模型评估的客观性,数据集被划分为三个独立部分:

    • 训练集(Training Set):5,553 张图像,用于模型训练,让模型学习识别瓶和罐的特征。

    • 验证集(Validation Set):1,474 张图像,用于在训练过程中调整超参数和监控模型性能,防止过拟合。

    • 测试集(Test Set):940 张图像,用于在模型训练完成后进行最终、客观的性能评估,以衡量其真实的泛化能力。

数据集配置文件

数据集采用标准化YOLO格式组织:

train: F:\固体废物识别检测数据集\train\images val: F:\固体废物识别检测数据集\valid\images test: F:\固体废物识别检测数据集\test\images nc:2names: ['Bottle','Cans']

四、项目环境配置

创建虚拟环境

首先新建一个Anaconda环境,每个项目用不同的环境,这样项目中所用的依赖包互不干扰。

终端输入

conda create -n yolov12 python==3.9

激活虚拟环境

conda activate yolov12

安装cpu版本pytorch

pip install torch torchvision torchaudio

安装所需要库

pip install -r requirements.txt

pycharm中配置anaconda

五、模型训练

训练代码

fromultralyticsimportYOLO model_path ='yolo12s.pt'data_path ='data.yaml'if__name__ =='__main__': model = YOLO(model_path) results = model.train(data=data_path, epochs=100, batch=8, device='0', workers=0, project='runs', name='exp', )
根据实际情况更换模型 # yolov12n.yaml (nano):轻量化模型,适合嵌入式设备,速度快但精度略低。 # yolov12s.yaml (small):小模型,适合实时任务。 # yolov12m.yaml (medium):中等大小模型,兼顾速度和精度。 # yolov12b.yaml (base):基本版模型,适合大部分应用场景。 # yolov12l.yaml (large):大型模型,适合对精度要求高的任务。
  • --batch 8:每批次8张图像。
  • --epochs 100:训练100轮。
  • --datasets/data.yaml:数据集配置文件。
  • --weights yolov12s.pt:初始化模型权重,yolov12s.pt是预训练的轻量级YOLO模型。

训练结果

六、核心代码

importsysimportcv2importnumpyasnpfromPyQt5.QtWidgetsimportQApplication, QMessageBox, QFileDialogfromPyQt5.QtCoreimportQThread, pyqtSignalfromultralyticsimportYOLOfromUiMainimportUiMainWindowimporttimeimportosfromPyQt5.QtWidgetsimportQDialogfromLoginWindowimportLoginWindowclassDetectionThread(QThread): frame_received = pyqtSignal(np.ndarray, np.ndarray,list)# 原始帧, 检测帧, 检测结果finished_signal = pyqtSignal()# 线程完成信号def__init__(self, model, source, conf, iou, parent=None):super().__init__(parent) self.model = model self.source = source self.conf = conf self.iou = iou self.running =Truedefrun(self):try:ifisinstance(self.source,int)orself.source.endswith(('.mp4','.avi','.mov')):# 视频或摄像头cap = cv2.VideoCapture(self.source)whileself.runningandcap.isOpened(): ret, frame = cap.read()ifnotret:break# 保存原始帧original_frame = frame.copy()# 检测results = self.model(frame, conf=self.conf, iou=self.iou) annotated_frame = results[0].plot()# 提取检测结果detections = []forresultinresults:forboxinresult.boxes: class_id =int(box.cls) class_name = self.model.names[class_id] confidence =float(box.conf) x, y, w, h = box.xywh[0].tolist() detections.append((class_name, confidence, x, y))# 发送信号self.frame_received.emit( cv2.cvtColor(original_frame, cv2.COLOR_BGR2RGB), cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB), detections )# 控制帧率time.sleep(0.03)# 约30fpscap.release()else:# 图片frame = cv2.imread(self.source)ifframeisnotNone: original_frame = frame.copy() results = self.model(frame, conf=self.conf, iou=self.iou) annotated_frame = results[0].plot()# 提取检测结果detections = []forresultinresults:forboxinresult.boxes: class_id =int(box.cls) class_name = self.model.names[class_id] confidence =float(box.conf) x, y, w, h = box.xywh[0].tolist() detections.append((class_name, confidence, x, y)) self.frame_received.emit( cv2.cvtColor(original_frame, cv2.COLOR_BGR2RGB), cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB), detections )exceptExceptionase:print(f"Detection error:{e}")finally: self.finished_signal.emit()defstop(self): self.running =FalseclassMainWindow(UiMainWindow):def__init__(self):super().__init__()# 初始化模型self.model =Noneself.detection_thread =Noneself.current_image =Noneself.current_result =Noneself.video_writer =Noneself.is_camera_running =Falseself.is_video_running =Falseself.last_detection_result =None# 新增:保存最后一次检测结果# 连接按钮信号self.image_btn.clicked.connect(self.detect_image) self.video_btn.clicked.connect(self.detect_video) self.camera_btn.clicked.connect(self.detect_camera) self.stop_btn.clicked.connect(self.stop_detection) self.save_btn.clicked.connect(self.save_result)# 初始化模型self.load_model()defload_model(self):try: model_name = self.model_combo.currentText() self.model = YOLO(f"{model_name}.pt")# 自动下载或加载本地模型self.update_status(f"模型{model_name}加载成功")exceptExceptionase: QMessageBox.critical(self,"错误",f"模型加载失败:{str(e)}") self.update_status("模型加载失败")defdetect_image(self):ifself.detection_threadandself.detection_thread.isRunning(): QMessageBox.warning(self,"警告","请先停止当前检测任务")returnfile_path, _ = QFileDialog.getOpenFileName( self,"选择图片","","图片文件 (*.jpg *.jpeg *.png *.bmp)")iffile_path: self.clear_results() self.current_image = cv2.imread(file_path) self.current_image = cv2.cvtColor(self.current_image, cv2.COLOR_BGR2RGB) self.display_image(self.original_image_label, self.current_image)# 创建检测线程conf = self.confidence_spinbox.value() iou = self.iou_spinbox.value() self.detection_thread = DetectionThread(self.model, file_path, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status(f"正在检测图片:{os.path.basename(file_path)}")defdetect_video(self):ifself.detection_threadandself.detection_thread.isRunning(): QMessageBox.warning(self,"警告","请先停止当前检测任务")returnfile_path, _ = QFileDialog.getOpenFileName( self,"选择视频","","视频文件 (*.mp4 *.avi *.mov)")iffile_path: self.clear_results() self.is_video_running =True# 初始化视频写入器cap = cv2.VideoCapture(file_path) frame_width =int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height =int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = cap.get(cv2.CAP_PROP_FPS) cap.release()# 创建保存路径save_dir ="results"os.makedirs(save_dir, exist_ok=True) timestamp = time.strftime("%Y%m%d_%H%M%S") save_path = os.path.join(save_dir,f"result_{timestamp}.mp4") fourcc = cv2.VideoWriter_fourcc(*'mp4v') self.video_writer = cv2.VideoWriter(save_path, fourcc, fps, (frame_width, frame_height))# 创建检测线程conf = self.confidence_spinbox.value() iou = self.iou_spinbox.value() self.detection_thread = DetectionThread(self.model, file_path, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status(f"正在检测视频:{os.path.basename(file_path)}")defdetect_camera(self):ifself.detection_threadandself.detection_thread.isRunning(): QMessageBox.warning(self,"警告","请先停止当前检测任务")returnself.clear_results() self.is_camera_running =True# 创建检测线程 (默认使用摄像头0)conf = self.confidence_spinbox.value() iou = self.iou_spinbox.value() self.detection_thread = DetectionThread(self.model,0, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status("正在从摄像头检测...")

🔐登录注册验证

对应文件:LoginWindow.py

# 账户验证核心逻辑defhandle_login(self): username = self.username_input.text().strip() password = self.password_input.text().strip()ifnotusernameornotpassword: QMessageBox.warning(self,"警告","用户名和密码不能为空!")returnifusernameinself.accountsandself.accounts[username] == password: self.accept()# 验证通过else: QMessageBox.warning(self,"错误","用户名或密码错误!")# 密码强度检查(注册时)defhandle_register(self):iflen(password) <6:# 密码长度≥6位QMessageBox.warning(self,"警告","密码长度至少为6位!")

🎯多重检测模式

对应文件:main.py

图片检测

defdetect_image(self): file_path, _ = QFileDialog.getOpenFileName( self,"选择图片","","图片文件 (*.jpg *.jpeg *.png *.bmp)")iffile_path: self.detection_thread = DetectionThread(self.model, file_path, conf, iou) self.detection_thread.start()# 启动检测线程

视频检测

defdetect_video(self): file_path, _ = QFileDialog.getOpenFileName( self,"选择视频","","视频文件 (*.mp4 *.avi *.mov)")iffile_path: self.video_writer = cv2.VideoWriter()# 初始化视频写入器self.detection_thread = DetectionThread(self.model, file_path, conf, iou)

实时摄像头

defdetect_camera(self): self.detection_thread = DetectionThread(self.model,0, conf, iou)# 摄像头设备号0self.detection_thread.start()

🖼️沉浸式可视化

对应文件:UiMain.py

双画面显示

defdisplay_image(self, label, image): q_img = QImage(image.data, w, h, bytes_per_line, QImage.Format_RGB888) pixmap = QPixmap.fromImage(q_img) label.setPixmap(pixmap.scaled(label.size(), Qt.KeepAspectRatio))# 自适应缩放

结果表格

defadd_detection_result(self, class_name, confidence, x, y): self.results_table.insertRow(row) items = [ QTableWidgetItem(class_name),# 类别列QTableWidgetItem(f"{confidence:.2f}"),# 置信度QTableWidgetItem(f"{x:.1f}"),# X坐标QTableWidgetItem(f"{y:.1f}")# Y坐标]

⚙️参数配置系统

对应文件:UiMain.py

双阈值联动控制

# 置信度阈值同步defupdate_confidence(self, value): confidence = value /100.0self.confidence_spinbox.setValue(confidence)# 滑块→数值框self.confidence_label.setText(f"置信度阈值:{confidence:.2f}")# IoU阈值同步defupdate_iou(self, value): iou = value /100.0self.iou_spinbox.setValue(iou)

UI美学设计

对应文件:UiMain.py

科幻风格按钮

defcreate_button(self, text, color):returnf""" QPushButton {{ border: 1px solid{color}; color:{color}; border-radius: 6px; }} QPushButton:hover {{ background-color:{self.lighten_color(color,10)}; box-shadow: 0 0 10px{color}; # 悬停发光效果 }} """

动态状态栏

defupdate_status(self, message): self.status_bar.showMessage(f"状态:{message}| 最后更新:{time.strftime('%H:%M:%S')}"# 实时时间戳)

🔄智能工作流

对应文件:main.py

线程管理

classDetectionThread(QThread): frame_received = pyqtSignal(np.ndarray, np.ndarray,list)# 信号量通信defrun(self):whileself.running:# 多线程检测循环results = self.model(frame, conf=self.conf, iou=self.iou) self.frame_received.emit(original_frame, result_frame, detections)

七、项目源码(视频简介)

演示与介绍视频:

基于深度学习YOLOv12的固体垃圾废物识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)_哔哩哔哩_bilibili

基于深度学习YOLOv12的固体垃圾废物识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/8 22:53:41

面向攻击性安全专业人员的一体化浏览器扩展程序[特殊字符]

面向攻击性安全专业人员的一体化浏览器扩展程序 HackTools 是一款 Web 扩展程序&#xff0c;可帮助您进行Web 应用程序渗透测试&#xff0c;它包含速查表以及测试期间使用的所有工具&#xff0c;例如 XSS 有效载荷、反向 shell 等等。 有了这款扩展程序&#xff0c;您无需再在…

作者头像 李华
网站建设 2026/4/8 10:41:28

六轴机器人:运动学与动力学的奇妙探索及仿真之旅

六轴机器人六关节机器人六自由度机器人分析与仿真运动学动力学 aubo ur dobot 在机器人的世界里&#xff0c;六轴机器人&#xff0c;也被称为六关节机器人或六自由度机器人&#xff0c;可谓是明星般的存在。它们凭借高度的灵活性和精确的操作能力&#xff0c;在工业生产、科研…

作者头像 李华
网站建设 2026/4/9 0:49:33

去年在东莞电子厂调试的双头双Y螺丝机项目有点意思,特别是那个会左右横跳的下料机械手。今天拆解下它的核心玩法,给做自动化的小伙伴打个样

双头双Y自动锁螺丝机带压壳和下料机械手程序&#xff0c;采用显控触摸屏和台达PLC&#xff0c;用PLC做配方保存产品参数。 单独用可以做三轴带下料机械手螺丝机&#xff0c;连机用便是双头双Y待下架机械手自动锁螺丝。 下料机械手是横向的&#xff0c;即只用一个电机&#xff0…

作者头像 李华
网站建设 2026/4/8 21:34:43

Matlab法诺共振拟合与Q因子计算:探索微观世界的奇妙工具

Matlab法诺共振拟合与Q因子计算。在光学和纳米光子学领域&#xff0c;法诺共振现象如同微观世界中一颗璀璨的明珠&#xff0c;吸引着众多科研人员的目光。它不仅揭示了量子系统中干涉效应的独特魅力&#xff0c;还在诸如传感、滤波以及光电器件等多个前沿领域有着至关重要的应用…

作者头像 李华
网站建设 2026/4/12 18:35:07

单相七电平级联逆变器开环仿真之旅(MATLAB/Simulink 实现)

单相七电平级联逆变器&#xff0c;开环仿真。 仿真平台:MATLAB/simink。 最近在研究电力电子相关内容&#xff0c;接触到了单相七电平级联逆变器的开环仿真&#xff0c;用 MATLAB/Simulink 这个强大的工具来实现。今天就跟大家分享一下这个有趣的过程。 一、单相七电平级联逆…

作者头像 李华