尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

YOLOv5s垃圾分类毕设:可答辩、可复现、可部署的完整工程方案

YOLOv5s垃圾分类毕设:可答辩、可复现、可部署的完整工程方案 简介本资源是一套完整的毕业设计级垃圾分类目标检测系统面向计算机及相关专业本科生专为大作业、毕业设计与深度学习项目实战打造。系统基于Python实现采用主流目标检测模型配套说明文档详述数据预处理、模型训练、推理部署全流程答辩PPT涵盖选题背景、技术路线、实验结果与创新点助学生高效完成课题汇报。压缩包共126个文件含20个核心Python源码含训练/测试/可视化脚本、13个Jupyter Notebook含数据探索与模型调优记录、12个Vue前端页面支持图片上传与检测结果展示、6个JSON配置与标注文件、3个PDF/DOCX格式的报告与模板文档以及Dockerfile、ONNX模型、SQLite数据库等工程化组件整体66.07MB结构清晰、模块解耦。目前已有477人学习下载所有代码均经本地编译验证可运行附带温州大学课程实践模板、黄海广深度学习实践参考等实用材料显著降低复现门槛与调试成本。1. 这不是又一个YOLO调参Demo它是一套能直接答辩、本地跑通、带完整工程链路的垃圾分类目标检测毕业设计你可能已经看过十几个“基于YOLOv5的垃圾分类”教程——它们要么卡在torchvision0.12.0和opencv-python-headless版本冲突上要么训练完连一张测试图都画不出框更别说把模型塞进Docker里让导师现场演示。而这份资源不同它来自温州大学计算机专业真实通过的高分毕设评审98分所有Python脚本均在Ubuntu 20.04 CUDA 11.3 PyTorch 1.10环境下实测可运行train.py能训出mAP0.5达72.3%的模型detect.py支持摄像头实时推理并叠加中文标签Dockerfile已预装nvidia-docker2依赖答辩PPT第12页明确标注了每个模块的代码路径与性能对比数据。它不面向算法研究员而是为正在赶毕设DDL、需要“可展示、可解释、可复现”的本科生准备的——从数据清洗脚本到模型量化部署建议全部封装在/src目录下没有隐藏步骤也没有“自行查阅文档”的模糊地带。2. 为什么选YOLOv5s而非YOLOv8或RT-DETR轻量性、可调试性与教学友好性的三重权衡2.1 毕业设计场景下的模型选型逻辑不是越新越好而是越可控越好在本科毕设中模型复杂度必须与开发周期、硬件条件、答辩解释成本严格匹配。YOLOv8虽在COCO上mAP更高但其ultralytics库强制依赖torch1.13与学校实验室GPU服务器Tesla T4 CUDA 11.3存在ABI兼容风险RT-DETR则需Transformer注意力机制调试经验对未系统学过序列建模的学生极不友好。而YOLOv5s在本项目中达成三个关键平衡参数量仅7.2M在GTX 1660 Super上单batch训练耗时120ms避免学生因显存不足反复修改batch_size网络结构完全开源models/yolov5s.yaml每一层卷积核尺寸、通道数、激活函数均可手动修改便于答辩时回答“为什么这里用SiLU不用ReLU”训练日志格式统一runs/train/exp/results.csv包含box_loss,obj_loss,cls_loss三列可直接用pandas绘图向导师说明收敛过程。提示项目中models/yolov5s.yaml已将原始YOLOv5s的depth_multiple: 0.33调整为0.25这是为适配垃圾分类小样本每类仅320张图做的轻量化剪枝减少过拟合风险。若你使用自建数据集需同步调整该参数并重新计算ch通道数。2.2 数据集构建从公开数据集清洗到类别映射对齐的硬核操作本项目采用TrashNet与Garbage Classification Dataset混合数据集但原始数据存在严重问题TrashNet中cardboard与paper语义重叠Garbage Classification Dataset的metal类包含易拉罐和铁皮桶导致模型混淆。源码中/data/preprocess.py实现了三步清洗2.2.1 类别标准化映射表# data/class_mapping.py CLASS_MAPPING { cardboard: recyclable, glass: recyclable, metal: recyclable, paper: recyclable, plastic: recyclable, trash: other }该映射将原始6大类压缩为4类recyclable,hazardous,kitchen,other符合中国《生活垃圾分类制度实施方案》标准避免答辩时被问“为何不按四分类国标设计”。2.2.2 标注文件格式转换核心逻辑# data/preprocess.py def convert_to_yolo_format(xml_path: str, img_width: int, img_height: int) - List[str]: tree ET.parse(xml_path) root tree.getroot() yolo_lines [] for obj in root.findall(object): cls_name obj.find(name).text.strip().lower() if cls_name not in CLASS_MAPPING: continue # 跳过非标类别 # 获取归一化坐标 bbox obj.find(bndbox) xmin int(bbox.find(xmin).text) ymin int(bbox.find(ymin).text) xmax int(bbox.find(xmax).text) ymax int(bbox.find(ymax).text) x_center (xmin xmax) / 2 / img_width y_center (ymin ymax) / 2 / img_height width (xmax - xmin) / img_width height (ymax - ymin) / img_height # 映射类别ID cls_id list(CLASS_MAPPING.values()).index(CLASS_MAPPING[cls_name]) yolo_lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}) return yolo_lines此函数将PASCAL VOC格式XML转为YOLOv5要求的.txt格式关键点在于cls_id通过CLASS_MAPPING.values()动态索引避免硬编码导致的类别错位坐标保留6位小数防止YOLOv5解析时因精度丢失报ValueError: invalid literal for int()continue跳过未映射类别确保训练集纯净度。2.3 训练配置文件深度解析hyp.scratch-low.yaml中的12个关键参数项目根目录下hyp.scratch-low.yaml是专为低算力环境优化的超参配置其设计逻辑直击毕设痛点参数原始YOLOv5值本项目值修改原因验证方式lr00.010.005防止小数据集过拟合tensorboard --logdir runs/train观察loss是否震荡lrf0.10.05学习率终值更低提升收敛稳定性results.csv中cls_loss末期波动0.02momentum0.9370.85降低动量缓解梯度爆炸train.py输出Gradient overflow次数为0weight_decay0.00050.001增强L2正则化对抗小样本过拟合val_batch0.jpg中误检框减少37%注意mosaic: 0.5表示马赛克增强概率为50%而非关闭。项目实测关闭后mAP下降4.2%证明即使小数据集适度数据增强仍必要。若你的数据集图像分辨率低于640×480需在train.py中将imgsz参数从640改为416否则torch.nn.functional.interpolate会报size mismatch。3. 从训练到部署一套命令走完模型全生命周期的可复现流程3.1 环境搭建用Conda隔离依赖绕过PyPI镜像污染陷阱项目未使用requirements.txt而采用environment.yml因其能精确锁定CUDA Toolkit与cuDNN版本。执行以下命令前请确认已安装miniconda3# 创建独立环境Python 3.8.10 PyTorch 1.10.0 CUDA 11.3 conda env create -f environment.yml conda activate garbage-detector # 验证CUDA可用性必须返回True python -c import torch; print(torch.cuda.is_available()) # 验证OpenCV GUI支持避免detect.py黑屏 python -c import cv2; print(cv2.__version__); capcv2.VideoCapture(0); print(cap.isOpened())environment.yml关键内容dependencies: - python3.8.10 - pytorch1.10.0py3.8_cuda11.3_cudnn8.2.0_0 - torchvision0.11.1py38_cu113 - opencv4.5.5py38h6301d4e_1 - pip - pip: - ultralytics5.0.19 # YOLOv5官方库非YOLOv8 - pandas1.3.5 - matplotlib3.5.1提示若conda install卡在Solving environment执行conda config --add channels conda-forge并重试。切勿用pip install torch替代会导致CUDA版本错配。3.2 训练全流程从数据划分到最佳权重选取的七步操作项目提供/scripts/train_pipeline.sh自动化脚本但理解每步原理才能应对答辩提问3.2.1 步骤1生成数据集划分文件# 生成train/test/val.txt按7:2:1比例 python data/split_dataset.py \ --dataset_dir ./datasets/garbage \ --train_ratio 0.7 \ --val_ratio 0.2 \ --seed 42split_dataset.py使用sklearn.model_selection.train_test_split但关键在于stratify参数传入class_labels列表确保每类在三个子集中比例一致。若漏掉此参数hazardous类仅占5%可能在val.txt中完全缺失导致val_loss虚高。3.2.2 步骤2启动训练并监控关键指标# 启动训练指定GPU 0保存至runs/train/exp2 python train.py \ --img 640 \ --batch 16 \ --epochs 100 \ --data data/garbage.yaml \ --cfg models/yolov5s.yaml \ --weights \ --name exp2 \ --cache参数说明--cache启用内存缓存将/datasets/garbage/images/*.jpg预加载至RAM提速40%--weights 表示从零初始化非迁移学习因garbage.yaml中nc: 4与预训练权重nc: 80不匹配--name exp2避免覆盖默认exp目录方便多轮实验对比。3.2.3 步骤3验证最佳权重选择逻辑训练完成后runs/train/exp2/weights/目录下有best.pt和last.pt。项目val.py脚本验证二者差异python val.py \ --data data/garbage.yaml \ --weights runs/train/exp2/weights/best.pt \ --img 640 \ --task test \ --save-json结果生成results.json其中bbox_mAP_50字段显示best.pt为72.3%last.pt为68.9%。这证明早停Early Stopping生效——当val_loss连续10轮未下降时自动保存best.pt。3.3 实时检测与可视化解决中文标签乱码与FPS抖动问题detect.py是答辩演示核心其--view-img模式需解决两个工程问题3.3.1 中文标签渲染方案YOLOv5原生不支持中文项目在utils/plots.py中重写plot_one_box函数def plot_one_box(x, im, color(128, 128, 128), labelNone, line_thickness3): # 使用SimHei.ttf字体已内置在/fonts/目录 fontpath fonts/SimHei.ttf font ImageFont.truetype(fontpath, 32) img_pil Image.fromarray(im) draw ImageDraw.Draw(img_pil) # 绘制带背景的中文标签 text_w, text_h draw.textsize(label, fontfont) draw.rectangle([x[0], x[1]-text_h-5, x[0]text_w10, x[1]], fillcolor) draw.text((x[0]5, x[1]-text_h-3), label, fontfont, fill(255,255,255)) return np.array(img_pil)注意SimHei.ttf必须放在项目根目录fonts/下否则ImageFont.truetype抛OSError: cannot open resource。3.3.2 FPS稳定化策略为避免演示时画面卡顿detect.py添加帧率控制# detect.py 第127行 fps_start time.time() # ... 推理代码 ... fps_end time.time() fps 1 / (fps_end - fps_start) if fps 15: # 低于15FPS时降采样 cap.set(cv2.CAP_PROP_FPS, 10)实测在GTX 1660 Super上开启--device 0后平均FPS达23.4满足答辩流畅演示需求。4. Docker容器化部署与答辩PPT技术细节拆解让导师看到工程能力4.1 Dockerfile逐行解析如何让模型在无GPU服务器上也能演示项目Dockerfile并非简单打包而是针对答辩场景设计的最小可行镜像FROM nvidia/cuda:11.3.1-cudnn8-runtime-ubuntu20.04 # 安装基础依赖精简apt源避免超时 RUN sed -i s/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list \ apt-get update apt-get install -y \ python3.8 \ python3-pip \ libsm6 \ libxext6 \ libglib2.0-0 \ rm -rf /var/lib/apt/lists/* # 复制并安装Python依赖使用清华源加速 COPY requirements.txt . RUN pip3 install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple/ -r requirements.txt # 复制项目代码排除.git和大型数据集 COPY --chownnonroot:nonroot . /app/ WORKDIR /app # 创建非root用户安全合规 RUN useradd -m -u 1001 -G video appuser USER appuser # 暴露端口用于Web演示可选 EXPOSE 5000 # 启动命令默认运行detect.py摄像头模式 CMD [python3, detect.py, --source, 0, --weights, runs/train/exp2/weights/best.pt]关键设计点基础镜像选用nvidia/cuda:11.3.1-cudnn8-runtime而非pytorch/pytorch体积减少60%构建更快libsm6和libxext6是OpenCV GUI必需的X11库缺失会导致cv2.imshow报Unable to init server--chownnonroot:nonroot确保文件权限安全避免答辩时被导师质疑“为何用root运行”CMD默认启动摄像头检测但答辩若无摄像头可临时改用--source data/images/test.jpg。4.2 答辩PPT第7页技术架构图还原三层解耦设计思想项目答辩PPT.pptx第7页架构图分为三层每层对应一个可验证的技术点层级组件验证方法导师可能提问数据层data/preprocess.pyCLASS_MAPPING运行python data/preprocess.py --input_dir datasets/raw --output_dir datasets/yolo检查datasets/yolo/labels/下.txt文件数量是否等于images/下.jpg数量“类别映射是否考虑了厨余垃圾中的湿垃圾与干垃圾细分”模型层models/yolov5s.yamlhyp.scratch-low.yamlpython models/yaml_model.py models/yolov5s.yaml输出网络结构确认depth_multiple: 0.25生效“为何不使用YOLOv5m提升精度参数量增加对嵌入式部署的影响”应用层detect.pyDockerfiledocker build -t garbage-detector . docker run --gpus all garbage-detector观察终端输出FPS“Docker容器如何访问宿主机摄像头是否测试过USB3.0带宽瓶颈”提示PPT中所有性能数据如mAP 72.3%、FPS 23.4均来自runs/train/exp2/results.csv和val.py输出答辩时可现场打开该CSV文件指向具体行号。5. 模型轻量化实战将best.pt转ONNX并在CPU上达到18FPS的三步法毕业设计常被追问“能否部署到树莓派”本项目提供从PyTorch到ONNX再到OpenVINO的完整路径无需额外购买NCS2计算棒。5.1 PyTorch模型导出ONNX规避dynamic_axes陷阱export.py脚本关键修改点在于dynamic_axes定义# export.py 第45行 torch.onnx.export( model, img, fweights/best.onnx, verboseFalse, opset_version12, input_names[images], output_names[output], dynamic_axes{ images: {0: batch, 2: height, 3: width}, # 动态batch和分辨率 output: {0: batch} # 仅batch动态避免推理时shape mismatch } )若将output的dynamic_axes设为{0:batch, 1:num_dets}ONNX Runtime会报InvalidArgument: Input shape mismatch因YOLO输出[1, 25200, 85]中25200是固定anchor数不可动态。5.2 ONNX模型验证用onnxruntime校验数值一致性# 安装ONNX Runtime CPU版避免CUDA依赖 pip install onnxruntime # 运行验证脚本 python tools/verify_onnx.py \ --pytorch-model runs/train/exp2/weights/best.pt \ --onnx-model weights/best.onnx \ --input-image data/images/test.jpgverify_onnx.py输出Max absolute difference: 1.2e-05证明转换无损。若1e-4需检查model.eval()和torch.no_grad()是否启用。5.3 OpenVINO推理加速CPU上实现18FPS的关键配置项目/openvino/inference.py使用OpenVINO 2022.3核心优化参数# openvino/inference.py core Core() model core.read_model(modelweights/best.xml) # IR模型 compiled_model core.compile_model(modelmodel, device_nameCPU) # 关键设置CPU线程数为物理核心数 ie_config {CPU_THREADS_NUM: 4} # i5-8250U为4核 compiled_model core.compile_model(modelmodel, device_nameCPU, configie_config) # 预处理BGR2RGB 归一化 NCHW排列 input_tensor np.expand_dims(preprocessed_img, 0) # [1,3,640,640] result compiled_model([input_tensor])[0] # 直接获取输出实测在i5-8250U上inference.py单帧耗时55ms18.2 FPS满足答辩离线演示需求。若你的CPU为8核将CPU_THREADS_NUM改为8可进一步提速至22FPS。最后一行技术内容openvino/inference.py第89行cv2.putText(frame, fFPS: {int(fps)}, (10,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2)中int(fps)必须加int()转换否则OpenCV会因float类型报TypeError: Expected Ptrcv::UMat for argument img。本文还有配套的精品资源点击获取
返回列表