2026/3/6 0:45:19
网站建设
项目流程
甘肃省路桥建设集团网站,wordpress 文件下载插件,a站播放量最高的视频,直聘最新招聘信息一、项目介绍
摘要
本项目基于前沿的YOLOv10目标检测算法#xff0c;开发了一套高精度的可回收塑料识别分类系统#xff0c;专门用于自动化垃圾分类与回收流程中的塑料物品检测与分类。系统针对7类常见可回收塑料#xff08;HDPE塑料、多层塑料、PET瓶、一次性塑料、单层塑…一、项目介绍摘要本项目基于前沿的YOLOv10目标检测算法开发了一套高精度的可回收塑料识别分类系统专门用于自动化垃圾分类与回收流程中的塑料物品检测与分类。系统针对7类常见可回收塑料HDPE塑料、多层塑料、PET瓶、一次性塑料、单层塑料、挤压管和UHT盒进行精确识别使用包含22,075张图像的专业数据集进行训练与验证其中训练集19,034张验证集2,051张测试集990张。通过优化YOLOv10的网络结构和训练策略本系统实现了对复杂背景下各类塑料制品的高精度识别与分类满足实时处理需求。该系统为智能垃圾分类设备、再生资源回收系统和环保监管平台提供了核心技术支撑具有显著的环境效益和经济效益。项目意义可回收塑料自动识别分类技术在环境保护和资源循环利用方面具有重大价值环境保护通过提高塑料分类准确率减少错误分类导致的不可回收污染促进塑料循环经济每年可减少数百万吨塑料垃圾填埋或焚烧。资源回收精确分类不同种类塑料可大幅提高再生塑料质量使再生料价值提升促进资源高效利用。成本节约自动化分类可减少人工分拣成本解决垃圾分类行业劳动力短缺问题提高分拣效率。政策支持符合全球禁塑令和垃圾分类政策要求为监管部门提供塑料垃圾分类监管的技术手段。产业升级推动传统垃圾处理行业向智能化转型促进AI技术在环保领域的深度应用。公众教育可集成至公共垃圾分类设施实时显示分类结果提升公众垃圾分类意识。本项目的创新性在于首次将YOLOv10算法应用于多类别塑料识别领域针对塑料物品的光学特性优化模型解决了传统方法在透明、反光塑料识别上准确率低的问题。系统支持嵌入式设备部署可在垃圾分拣线、智能回收箱等场景实时运行技术指标行业领先。目录一、项目介绍摘要项目意义二、项目功能展示系统功能图片检测视频检测摄像头实时检测三、数据集介绍数据集特点数据集配置文件数据集制作流程四、项目环境配置创建虚拟环境pycharm中配置anaconda安装所需要库五、模型训练训练代码训练结果六、核心代码七、项目源码视频下方简介内基于深度学习YOLOv10的可回收塑料识别分类检测系统YOLOv10YOLO数据集UI界面Python项目源码模型_哔哩哔哩_bilibili基于深度学习YOLOv10的可回收塑料识别分类检测系统YOLOv10YOLO数据集UI界面Python项目源码模型二、项目功能展示系统功能✅图片检测可对图片进行检测返回检测框及类别信息。✅视频检测支持视频文件输入检测视频中每一帧的情况。✅摄像头实时检测连接USB 摄像头实现实时监测。✅参数实时调节置信度和IoU阈值图片检测该功能允许用户通过单张图片进行目标检测。输入一张图片后YOLO模型会实时分析图像识别出其中的目标并在图像中框出检测到的目标输出带有目标框的图像。视频检测视频检测功能允许用户将视频文件作为输入。YOLO模型将逐帧分析视频并在每一帧中标记出检测到的目标。最终结果可以是带有目标框的视频文件或实时展示适用于视频监控和分析等场景。摄像头实时检测该功能支持通过连接摄像头进行实时目标检测。YOLO模型能够在摄像头拍摄的实时视频流中进行目标检测实时识别并显示检测结果。此功能非常适用于安防监控、无人驾驶、智能交通等应用提供即时反馈。核心特点高精度基于YOLO模型提供精确的目标检测能力适用于不同类型的图像和视频。实时性特别优化的算法使得实时目标检测成为可能无论是在视频还是摄像头实时检测中响应速度都非常快。批量处理支持高效的批量图像和视频处理适合大规模数据分析。三、数据集介绍本项目构建了全面的可回收塑料物品图像数据集总计包含22,075张高质量图像具体分为训练集19,034张验证集2,051张测试集990张数据集涵盖7类常见可回收塑料物品类别定义基于国际通用塑料回收标识体系HDPE Plastic高密度聚乙烯Multi-layer Plastic多层复合塑料PET Bottle聚对苯二甲酸乙二醇酯瓶Single-Use-Plastic一次性塑料制品Single-layer Plastic单层塑料Squeeze-Tube挤压式软管UHT-Box超高温灭菌包装盒所有图像均经过专业标注团队标注采用YOLO格式的边界框标注并经过三重质量检验。数据集特点全面性覆盖包含家庭、商业和工业场景产生的各类塑料废弃物覆盖完整产品生命周期全新、使用后、压扁、破损等状态包含透明、半透明、不透明、彩色、印刷等各类表面特性考虑不同形状瓶、盒、膜、管等和尺寸真实场景挑战复杂背景干扰混合垃圾场景物品重叠和遮挡情况不同程度的使用污染标签残留、内容物残留各种变形状态压扁、折叠、扭曲不同光照条件强光、弱光、反光数据质量保证统一分辨率多角度拍摄标注边界框精确贴合物品边缘平衡的类别分布标注包含物品表面文字/标识信息特殊考虑包含困难样本严重污染、高度变形设置对抗样本相似非塑料物品记录拍摄距离标注透明物品的内部结构可见度数据集配置文件数据集采用标准YOLOv10格式train: F:\可回收塑料识别分类检测数据集\train\images val: F:\可回收塑料识别分类检测数据集\valid\images test: F:\可回收塑料识别分类检测数据集\test\images nc: 7 names: [HDPE Plastic, Multi-layer Plastic, PET Bottle, Single-Use-Plastic, Single-layer Plastic, Squeeze-Tube, UHT-Box]数据集制作流程样本采集与多家垃圾处理厂合作获取真实废弃物样本按国际标准分类收集7类塑料物品使用工业级相机多角度拍摄控制拍摄距离、角度和光照条件变量数据预处理统一调整分辨率应用白平衡校正消除色偏对透明物品使用背光增强轮廓生成灰度图像版本以增强纹理特征专业标注流程第一阶段初级标注员进行初步边界框标注第二阶段材料专家验证塑料类型分类第三阶段使用3D标注工具修正变形物品的标注特殊处理对透明物品标注内部可见结构质量控制系统每日随机抽查标注结果建立标注争议解决委员会对困难样本进行多方确认维护标注标准操作手册数据集增强几何变换旋转、缩放光照模拟过曝、欠曝、色温变化噪声添加高斯噪声、模拟污渍背景合成混合垃圾场景生成物理模拟压扁、折叠等变形效果数据划分策略按物品ID划分确保同一物品不同角度不跨集保持各类别在子集中比例一致测试集包含所有难度级别的代表性样本验证集侧重边缘案例评估四、项目环境配置创建虚拟环境首先新建一个Anaconda环境每个项目用不同的环境这样项目中所用的依赖包互不干扰。终端输入conda create -n yolov10 python3.9激活虚拟环境conda activate yolov10安装cpu版本pytorchpip install torch torchvision torchaudiopycharm中配置anaconda安装所需要库pip install -r requirements.txt五、模型训练训练代码from ultralytics import YOLOv10 model_path yolov10s.pt data_path datasets/data.yaml if __name__ __main__: model YOLOv10(model_path) results model.train(datadata_path, epochs500, batch64, device0, workers0, projectruns/detect, nameexp, )根据实际情况更换模型 yolov10n.yaml (nano)轻量化模型适合嵌入式设备速度快但精度略低。 yolov10s.yaml (small)小模型适合实时任务。 yolov10m.yaml (medium)中等大小模型兼顾速度和精度。 yolov10b.yaml (base)基本版模型适合大部分应用场景。 yolov10l.yaml (large)大型模型适合对精度要求高的任务。--batch 64每批次64张图像。--epochs 500训练500轮。--datasets/data.yaml数据集配置文件。--weights yolov10s.pt初始化模型权重yolov10s.pt是预训练的轻量级YOLO模型。训练结果六、核心代码import sys import cv2 import numpy as np from PyQt5.QtWidgets import QApplication, QMessageBox, QFileDialog from PyQt5.QtCore import QThread, pyqtSignal from ultralytics import YOLOv10 from UiMain import UiMainWindow import time import os class DetectionThread(QThread): frame_received pyqtSignal(np.ndarray, np.ndarray, list) # 原始帧, 检测帧, 检测结果 finished_signal pyqtSignal() # 线程完成信号 def __init__(self, model, source, conf, iou, parentNone): super().__init__(parent) self.model model self.source source self.conf conf self.iou iou self.running True def run(self): try: if isinstance(self.source, int) or self.source.endswith((.mp4, .avi, .mov)): # 视频或摄像头 cap cv2.VideoCapture(self.source) while self.running and cap.isOpened(): ret, frame cap.read() if not ret: break # 保存原始帧 original_frame frame.copy() # 检测 results self.model(frame, confself.conf, iouself.iou) annotated_frame results[0].plot() # 提取检测结果 detections [] for result in results: for box in result.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) # 约30fps cap.release() else: # 图片 frame cv2.imread(self.source) if frame is not None: original_frame frame.copy() results self.model(frame, confself.conf, iouself.iou) annotated_frame results[0].plot() # 提取检测结果 detections [] for result in results: for box in result.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 ) except Exception as e: print(fDetection error: {e}) finally: self.finished_signal.emit() def stop(self): self.running False class MainWindow(UiMainWindow): def __init__(self): super().__init__() # 初始化模型 self.model None self.detection_thread None self.current_image None self.current_result None self.video_writer None self.is_camera_running False self.is_video_running False self.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() def load_model(self): try: model_name self.model_combo.currentText() self.model YOLOv10(f{model_name}.pt) # 自动下载或加载本地模型 self.update_status(f模型 {model_name} 加载成功) except Exception as e: QMessageBox.critical(self, 错误, f模型加载失败: {str(e)}) self.update_status(模型加载失败) def detect_image(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, 警告, 请先停止当前检测任务) return file_path, _ QFileDialog.getOpenFileName( self, 选择图片, , 图片文件 (*.jpg *.jpeg *.png *.bmp)) if file_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)}) def detect_video(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, 警告, 请先停止当前检测任务) return file_path, _ QFileDialog.getOpenFileName( self, 选择视频, , 视频文件 (*.mp4 *.avi *.mov)) if file_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_okTrue) timestamp time.strftime(%Y%m%d_%H%M%S) save_path os.path.join(save_dir, fresult_{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)}) def detect_camera(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, 警告, 请先停止当前检测任务) return self.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(正在从摄像头检测...) def stop_detection(self): if self.detection_thread and self.detection_thread.isRunning(): self.detection_thread.stop() self.detection_thread.quit() self.detection_thread.wait() if self.video_writer: self.video_writer.release() self.video_writer None self.is_camera_running False self.is_video_running False self.update_status(检测已停止) def on_frame_received(self, original_frame, result_frame, detections): # 更新原始图像和结果图像 self.display_image(self.original_image_label, original_frame) self.display_image(self.result_image_label, result_frame) # 保存当前结果帧用于后续保存 self.last_detection_result result_frame # 新增保存检测结果 # 更新表格 self.clear_results() for class_name, confidence, x, y in detections: self.add_detection_result(class_name, confidence, x, y) # 保存视频帧 if self.video_writer: self.video_writer.write(cv2.cvtColor(result_frame, cv2.COLOR_RGB2BGR)) def on_detection_finished(self): if self.video_writer: self.video_writer.release() self.video_writer None self.update_status(视频检测完成结果已保存) elif self.is_camera_running: self.update_status(摄像头检测已停止) else: self.update_status(图片检测完成) def save_result(self): if not hasattr(self, last_detection_result) or self.last_detection_result is None: QMessageBox.warning(self, 警告, 没有可保存的检测结果) return save_dir results os.makedirs(save_dir, exist_okTrue) timestamp time.strftime(%Y%m%d_%H%M%S) if self.is_camera_running or self.is_video_running: # 保存当前帧为图片 save_path os.path.join(save_dir, fsnapshot_{timestamp}.jpg) cv2.imwrite(save_path, cv2.cvtColor(self.last_detection_result, cv2.COLOR_RGB2BGR)) self.update_status(f截图已保存: {save_path}) else: # 保存图片检测结果 save_path os.path.join(save_dir, fresult_{timestamp}.jpg) cv2.imwrite(save_path, cv2.cvtColor(self.last_detection_result, cv2.COLOR_RGB2BGR)) self.update_status(f检测结果已保存: {save_path}) def closeEvent(self, event): self.stop_detection() event.accept() if __name__ __main__: app QApplication(sys.argv) # 设置应用程序样式 app.setStyle(Fusion) # 创建并显示主窗口 window MainWindow() window.show() sys.exit(app.exec_())七、项目源码视频下方简介内完整全部资源文件包括测试图片、视频py文件训练数据集、训练代码、界面代码等这里已打包上传至博主的面包多平台见可参考博客与视频已将所有涉及的文件同时打包到里面点击即可运行完整文件截图如下基于深度学习YOLOv10的可回收塑料识别分类检测系统YOLOv10YOLO数据集UI界面Python项目源码模型_哔哩哔哩_bilibili基于深度学习YOLOv10的可回收塑料识别分类检测系统YOLOv10YOLO数据集UI界面Python项目源码模型