多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

基于YOLOv5的智能鼠患检测:从数据准备到模型部署全流程实战

基于YOLOv5的智能鼠患检测:从数据准备到模型部署全流程实战 简介本资源是面向食品安全监管与智慧厨房建设的YOLOv5老鼠检测实战项目包专为计算机视觉初学者、AI工程化落地开发者及明厨亮灶系统集成人员设计解决餐饮后厨鼠患实时识别与预警难题。压缩包共2000个文件含2018张高质量JPG图像、2022个VOC格式XML标注与2020个YOLO格式TXT标签均经人工逐图筛选标注另有17个核心Python脚本含train.py、test.py、datasets.py等、3个训练好的.pt模型、15个配置用.yaml文件及README等工程文档整体大小695.94MB结构规范、开箱即用。目前已有6065人学习下载资源源自真实阳光厨房部署项目数据多样性高、分布均匀、拟合效果好并附B站实测视频链接供效果验证配套代码完整支持训练、推理与评估全流程且预留JSON标签转换接口便于快速对接不同平台标注体系。1. 项目概述从“明厨亮灶”到智能鼠患预警后厨的卫生安全尤其是鼠患问题一直是餐饮行业监管的痛点和公众关注的焦点。传统的“明厨亮灶”工程通过视频直播将后厨操作透明化但这更多是一种事后监督和威慑依赖人工长时间盯屏来发现问题效率低下且容易遗漏。当看到“基于YOLOv5老鼠检测”这个项目标题时我立刻意识到这正是一个将传统视频监控升级为智能预警系统的绝佳实践。它不再是被动记录而是主动识别让摄像头真正“长出了眼睛”。这个项目的核心价值在于它提供了一套从数据、模型到代码的完整解决方案包。2018张已标注的图片及标签是项目最宝贵的资产它直接解决了目标检测领域“巧妇难为无米之炊”的数据难题。YOLOv5作为当下工业界应用最广泛的实时目标检测框架之一以其出色的速度与精度平衡、友好的工程化接口而著称。源码则意味着我们可以深入其实现细节进行定制化修改以适应后厨复杂多变的环境如光线变化、遮挡、背景杂乱。简单来说这个项目为我们搭建了一个从零到一的坚实跳板让我们能快速验证智能鼠患检测的可行性并在此基础上进行迭代优化。无论你是餐饮企业的食品安全负责人希望引入智能化管理手段还是安防或AI领域的开发者正在寻找一个贴近实际应用的落地场景亦或是高校学生想通过一个完整的项目学习计算机视觉的实战流程这个项目都具有很高的参考和复现价值。接下来我将结合自己多年的工程经验为你深度拆解这个项目的每一个环节分享从环境搭建、模型训练到实际部署中那些“踩过坑”才得来的心得。2. 项目整体设计与核心思路拆解拿到一个包含数据、模型和源码的项目包第一步不是急着跑代码而是理解其整体设计思路。这决定了我们后续所有工作的方向和效率。2.1 为什么是YOLOv5技术选型背后的逻辑在众多目标检测模型中如Faster R-CNN, SSD, YOLO系列选择YOLOv5并非偶然。对于“明厨亮灶”这样的实时监控场景我们需要权衡三个核心要素速度、精度和易用性。速度优先监控视频通常是7x24小时不间断的算法需要在视频流上实时运行通常要求每秒处理数十帧。YOLOYou Only Look Once系列的单阶段检测架构其“端到端”一次性预测边界框和类别的设计天生就比Faster R-CNN这类两阶段模型更快。YOLOv5在YOLOv4的基础上采用了更高效的网络结构CSPDarknet53 SPPF PANet和更现代的工程实现基于PyTorch推理速度在同等精度下常有优势。精度保障老鼠目标通常较小且在复杂后厨环境中可能存在遮挡、运动模糊。YOLOv5通过多尺度特征融合PANet结构增强了模型对小目标的检测能力。项目提供的2018张标注数据正是为了训练模型适应后厨特定场景提升精度。工程化友好YOLOv5的代码库非常清晰提供了从训练、验证、测试到导出的完整脚本。其模型定义采用yaml文件配置灵活数据加载和增强策略丰富且易于修改。这对于需要快速迭代和定制化的工业项目至关重要。注意YOLOv5有s, m, l, x等多个尺寸的模型。对于部署在算力有限的边缘设备如智能摄像头、NVIDIA Jetson系列上的“明厨亮灶”系统通常从YOLOv5s开始尝试如果服务器性能充足追求更高精度则可选用YOLOv5m或l。2.2 数据2018张标注图片的价值与挑战2018张已标注的图片是这个项目的基石。在AI项目中数据的质量往往比模型结构更重要。我们需要审视这些数据场景覆盖度这2018张图片是否涵盖了目标后厨的各种典型场景例如不同时段白天自然光、夜晚照明、凌晨微光。不同区域灶台下方、储物柜角落、下水道口、垃圾存放处。不同状态老鼠静止、跑动、部分遮挡只露出尾巴或头、多只老鼠同时出现。干扰项是否有与老鼠形态、颜色相似的物体如拖把头、黑色塑料袋、阴影被正确排除标注质量标签通常是YOLO格式的.txt文件每行包含[class_id, x_center, y_center, width, height]坐标是归一化后的。需要抽查标注是否准确边界框是否紧密贴合老鼠是否存在漏标或错标。数据平衡如果数据集中“有老鼠”和“无老鼠”的图片数量严重失衡或者老鼠出现的姿态、大小分布不均模型可能会产生偏差。需要初步统计一下。实操心得拿到数据后我习惯先用一个简单的脚本可视化一批图片和其标注框直观感受数据质量。同时会计算所有标注框的宽高分布这有助于后续设计更适合的锚框Anchor尺寸虽然YOLOv5可以自动聚类生成但了解数据先验总是有益的。2.3 源码结构解析从训练到推理的管道一个典型的YOLOv5项目源码包会包含以下核心目录和文件理解它们有助于我们高效地使用和修改data/: 存放数据配置和类别文件。例如data/coco.yaml定义了数据路径、类别数、类别名。我们需要创建自己的data/rat.yaml。models/: 存放模型定义文件*.yaml如yolov5s.yaml和模型构建代码。utils/: 工具函数集包括数据加载、损失计算、指标评估、日志记录等。这是源码中最复杂但也最值得研究的部分。weights/: 存放预训练模型权重.pt文件。通常我们会从YOLOv5官方的预训练权重开始微调Transfer Learning这能极大加速收敛并提升性能。train.py: 模型训练的主入口。detect.py: 模型推理/检测的主入口支持图片、视频、摄像头流。requirements.txt: 项目依赖的Python包列表。核心思路项目的整体工作流是清晰的准备数据 - 配置环境 - 加载预训练模型 - 在自定义数据上微调训练 - 评估模型性能 - 导出模型并集成到推理程序中。我们的任务就是打通这个流程并针对“老鼠检测”这个具体场景进行优化。3. 环境搭建与数据准备实操详解理论清晰后我们进入动手环节。一个稳定、可复现的环境是成功的第一步。3.1 一步到位的Python环境配置强烈建议使用Conda或Venv创建独立的Python环境避免包版本冲突。以下是我验证过的稳定版本组合以PyTorch 1.12 CUDA 11.3为例可根据你的显卡驱动调整CUDA版本# 1. 创建并激活环境 conda create -n yolov5_rat python3.8 conda activate yolov5_rat # 2. 安装PyTorch请根据CUDA版本去官网选择对应命令 pip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113 # 3. 克隆项目源码并安装依赖 git clone https://github.com/ultralytics/yolov5 # 如果项目包是定制版则使用提供的源码 cd yolov5 pip install -r requirements.txt # 这会安装opencv-python, pandas, seaborn, tqdm, matplotlib等避坑指南CUDA版本匹配使用nvidia-smi查看驱动支持的CUDA最高版本然后去PyTorch官网选择对应的安装命令。不匹配会导致无法调用GPU。OpenCV安装如果requirements.txt中的opencv-python安装失败可以尝试先安装pip install opencv-python-headless这是一个更轻量的版本通常够用。权限问题在Linux系统下如果使用全局Python可能需要sudo但更推荐在用户目录下用虚拟环境。3.2 数据集的整理与标准化假设你获得的2018张图片如jpg格式和对应的标签文件.txt是散乱存放的。我们需要将其组织成YOLOv5标准格式datasets/ └── rat_detection/ ├── images/ │ ├── train/ # 存放训练图片如1600张 │ └── val/ # 存放验证图片如418张 └── labels/ ├── train/ # 存放训练标签与train图片一一对应 └── val/ # 存放验证标签与val图片一一对应关键操作步骤数据划分不要将所有数据都用于训练通常按8:2或8:1:1的比例随机划分为训练集Train、验证集Validation和测试集Test。验证集用于训练过程中评估模型调整超参数测试集用于最终模型性能的客观评价。可以使用sklearn.model_selection的train_test_split函数轻松完成。创建配置文件在data/目录下新建rat.yaml文件内容如下# rat.yaml path: ../datasets/rat_detection # 数据集根目录 train: images/train # 训练集图片路径相对于path val: images/val # 验证集图片路径相对于path test: # 测试集路径可选 # 类别数量 nc: 1 # 类别名称列表 names: [rat]标签检查编写一个简单的检查脚本确保每个图片文件都有对应的标签文件且标签文件内容格式正确类别ID在[0, nc-1]范围内坐标值在[0,1]之间。实操心得在划分数据时我建议采用“分层抽样”的思路确保训练集和验证集中都包含各种光照、场景、老鼠数量的样本使数据分布尽可能一致这样评估结果才更可靠。可以将这个划分列表保存下来方便后续复现和对比实验。4. 模型训练从微调到性能提升数据准备就绪我们就可以开始“教”模型认识老鼠了。直接从头训练Training from scratch需要大量数据和计算资源且容易过拟合。对于我们的场景微调Fine-tuning是标准做法。4.1 启动训练与核心参数解析使用train.py脚本启动训练以下命令包含了最关键的几个参数python train.py \ --img 640 \ # 训练图片尺寸必须是32的倍数640是常用尺寸 --batch 16 \ # 批次大小根据GPU内存调整8, 16, 32... --epochs 100 \ # 训练轮数对于微调50-150轮通常足够 --data data/rat.yaml \ # 上一步创建的数据配置文件 --cfg models/yolov5s.yaml \ # 选择模型结构s, m, l, x --weights yolov5s.pt \ # 加载预训练权重这是微调的关键 --device 0 \ # 使用GPU 0如果是CPU则用 --device cpu --name rat_exp1 \ # 本次实验的名称用于保存结果 --cache \ # 使用缓存加速数据加载如果内存/显存足够 --hyp data/hyps/hyp.scratch-low.yaml \ # 超参数配置文件微调建议用低augmentation的配置参数深度解读--weights yolov5s.pt程序会自动从YOLOv5官方仓库下载yolov5s.pt文件。这个权重是在COCO等大型通用数据集上预训练的包含了丰富的通用特征提取能力。我们在此基础上微调相当于让一个“见多识广”的模型专门学习“老鼠”这个新类别事半功倍。--img 640输入图片会被统一缩放到这个尺寸。更大的尺寸如1280可能对小目标检测更友好但会显著增加计算量和内存消耗降低速度。对于监控视频中的老鼠640通常是一个好的起点。--batch批次大小直接影响训练稳定性和速度。增大batch size可以使梯度估计更准确但需要更多GPU内存。如果出现“CUDA out of memory”错误首先尝试减小batch。--hyp超参数文件定义了学习率、优化器、数据增强强度等。对于小数据集微调建议使用hyp.scratch-low.yaml或hyp.finetune.yaml如果提供它们的数据增强强度较低防止过拟合。4.2 训练过程监控与指标解读训练开始后控制台会输出日志更重要的是YOLOv5会自动启动一个本地Web服务通常是http://localhost:6006通过TensorBoard或内置的日志系统提供丰富的可视化信息。我们需要重点关注以下几个指标损失函数Losstrain/box_loss,train/obj_loss,train/cls_loss分别代表边界框回归损失、目标置信度损失和分类损失。训练过程中这三个损失应该总体呈下降趋势并在后期趋于平稳。如果损失剧烈震荡或上升可能是学习率太高或数据有问题。val/开头的损失在验证集上的损失。理想情况下它应该与训练损失同步下降且数值接近。如果验证损失很早就停止下降甚至上升而训练损失持续下降这是典型的过拟合信号。性能指标Metricsmetrics/precision和metrics/recall精确率和召回率。这是我们最关心的业务指标。精确率Precision模型预测为“老鼠”的框中有多少真的是老鼠。高精确率意味着误报False Positive少不会整天“狼来了”。召回率Recall所有真实的老鼠中有多少被模型检测出来了。高召回率意味着漏报False Negative少老鼠很难逃过“法眼”。mAP0.5和mAP0.5:0.95平均精度均值。mAP0.5是交并比IoU阈值为0.5时的mAP是常用指标。mAP0.5:0.95是在多个IoU阈值下的平均值更严格。对于老鼠检测我们主要看mAP0.5能达到0.85以上就算非常不错了。数据增强可视化训练时开启--augment默认开启后可以查看数据增强后的图片这有助于理解模型“看到”了什么检查增强是否合理比如不会把老鼠扭曲得无法辨认。实操心得训练初期每隔几轮就要看一眼TensorBoard。如果前几个epoch损失下降非常快然后马上进入平台期可能是预训练权重加载成功模型快速适应新数据。如果损失几乎不变检查数据路径是否正确、标签格式是否有误、预训练权重是否成功加载。不要盲目跑完所有epoch根据验证集指标早停Early Stopping是防止过拟合的有效策略。4.3 针对小目标与复杂场景的调优技巧后厨的老鼠通常是小目标且环境复杂。如果初始训练结果不理想召回率低小老鼠检不出可以尝试以下调优策略修改模型结构谨慎YOLOv5的Neck部分PANet本身就有多尺度融合能力。对于极端小目标可以尝试使用更密集的检测头修改models/yolov5s.yaml中的detect层但这需要较深理解。调整锚框AnchorYOLOv5默认会使用K-means算法在你的训练数据上重新聚类生成锚框。你可以在训练命令中加上--noautoanchor来禁用但通常自动聚类的效果更好。可以在训练日志开头看到为你的数据聚类出的新锚框尺寸如果这些尺寸与你数据中老鼠的宽高分布匹配则说明锚框是合适的。增强数据Data Augmentation这是提升模型鲁棒性最有效的手段之一。除了YOLOv5内置的Mosaic、MixUp等可以针对性地增加小目标复制粘贴将标注好的小老鼠随机复制粘贴到图片的其他背景区域增加小目标的样本数量。模拟运动模糊后厨老鼠跑动快容易模糊。可以添加运动模糊增强。光照与色彩扰动模拟不同灯光条件暖光、冷光、昏暗。 这些增强可以在utils/augmentations.py中自定义但需注意强度避免生成不真实的图片。使用更小的下采样 strideYOLOv5s最后的下采样倍数是32这意味着输入640x640的图片最大的特征图只有20x20这对于检测像素面积小于32x32的极小目标可能不够精细。一种进阶方法是修改网络增加一个更浅层下采样16倍甚至8倍的检测头专门负责小目标。但这会显著增加计算量。我的经验是对于2018张数据首先确保数据质量然后从数据增强和超参数特别是学习率入手调优大部分情况下都能取得满意效果不到万不得已不要动模型结构。5. 模型评估、验证与部署推理训练完成后我们会在runs/train/rat_exp1/目录下得到一系列输出其中最重要的是weights/best.pt验证集上表现最好的权重和weights/last.pt最后一轮的权重。我们使用best.pt进行后续操作。5.1 模型性能的全面评估使用val.py脚本在测试集或验证集上进行全面评估python val.py \ --data data/rat.yaml \ --weights runs/train/rat_exp1/weights/best.pt \ --img 640 \ --batch 16 \ --task test \ # 如果test集在rat.yaml中配置了这里可以指定 --save-txt \ # 保存预测的标签文件用于详细分析 --save-conf # 保存预测的置信度运行后会生成详细的评估报告包括在各个IoU阈值下的mAP、每个类别的精确率/召回率/F1分数以及混淆矩阵。重点关注混淆矩阵可以清晰看到模型把多少老鼠漏检了False Negative又把多少其他东西误认为老鼠False Positive。这直接指导我们下一步的优化方向。PR曲线精确率-召回率曲线。曲线下的面积越大越好。我们可以在曲线上根据业务需求选择一个合适的置信度阈值confidence threshold。比如在“明厨亮灶”系统中为了减少误报避免频繁误报警我们可能愿意牺牲一点召回率选择一个较高的置信度阈值如0.6。5.2 使用训练好的模型进行推理使用detect.py脚本用训练好的模型对新的图片、视频或摄像头流进行检测# 检测单张图片 python detect.py --weights runs/train/rat_exp1/weights/best.pt --source path/to/your/test_image.jpg --conf 0.5 # 检测一个目录下的所有图片 python detect.py --weights runs/train/rat_exp1/weights/best.pt --source path/to/image_folder/ --conf 0.5 # 检测视频文件 python detect.py --weights runs/train/rat_exp1/weights/best.pt --source path/to/video.mp4 --conf 0.5 # 调用本地摄像头通常是0 python detect.py --weights runs/train/rat_exp1/weights/best.pt --source 0 --conf 0.5参数说明--conf置信度阈值。高于此阈值的检测框才会被显示。这是平衡精确率和召回率最直接的旋钮。--save-txt/--save-conf同验证阶段保存检测结果。--view-img实时显示检测结果窗口。实操心得在真实场景测试时务必准备一个独立的、未参与训练和验证的测试集最好是从另一个厨房或不同时间段采集的视频片段。在这个测试集上运行detect.py观察模型在“未知”数据上的表现这才是模型真实能力的试金石。记录下所有误报和漏报的案例这些是后续迭代优化最宝贵的素材。5.3 模型导出与工程化部署思考训练出的.pt文件是PyTorch模型要集成到生产系统中通常需要转换成更高效的格式。导出为ONNXONNX是一种开放的模型交换格式可以被多种推理引擎支持。python export.py --weights runs/train/rat_exp1/weights/best.pt --include onnx导出的best.onnx文件可以用于OpenCV DNN、TensorRT等框架的推理。导出为TensorRT如果部署在NVIDIA GPU上TensorRT能提供极致的推理速度。python export.py --weights runs/train/rat_exp1/weights/best.pt --include engine --device 0这需要本地已安装TensorRT。部署架构思考云端服务器部署将视频流推送到云端服务器由强大的GPU服务器进行实时分析。优点是算力强易于更新模型缺点是对网络带宽和延迟有要求。边缘计算盒子部署在厨房本地部署一个边缘计算设备如NVIDIA Jetson Nano/NX 瑞芯微RK3568/RV1106等直接连接摄像头进行实时分析只将报警事件和截图上传。优点是响应快、带宽要求低、数据隐私性好缺点是边缘设备算力有限可能需要使用更小的模型如YOLOv5s甚至经过剪枝、量化的模型。对于“明厨亮灶”项目边缘部署往往是更实用和可持续的方案。这意味着我们需要在模型精度和推理速度之间做更精细的权衡可能需要对YOLOv5模型进行量化INT8和剪枝以满足边缘设备的性能约束。这是一个更深入的工程优化话题但项目的源码和模型为我们提供了完美的起点。6. 常见问题排查与实战技巧实录在实际操作中你几乎一定会遇到下面这些问题。我把它们和我的解决方案记录下来希望能帮你节省大量时间。6.1 训练阶段典型问题问题1CUDA out of memory (OOM) 错误。原因批次大小batch-size或图片尺寸img-size太大超出GPU显存。解决首先减小batch-size如从16降到8。如果还不行减小img-size如从640降到512或416。检查是否有其他程序占用显存。在训练命令中添加--cache使用RAM/磁盘缓存数据有时能减少数据加载时的显存峰值。终极方案使用梯度累积--accumulate。例如设置--batch-size 4 --accumulate 4效果上相当于batch-size 16但每次只处理4张图分4次累积梯度再更新参数能有效降低显存占用。问题2训练损失train loss不下降或下降非常缓慢。原因学习率lr0设置过低。预训练权重未正确加载检查--weights参数路径。数据或标签路径错误导致模型实际上在“空跑”。数据本身质量极差或标注全错。排查检查训练日志开头确认预训练权重文件被成功加载。使用--verbose参数运行或直接调试代码确保数据能被正确读取和显示。可视化一批训练数据看图片和标注框是否对应正确。尝试使用默认的超参数--hyp data/hyps/hyp.scratch-low.yaml不要一开始就大幅修改。从一个极小的子集如10张图开始训练看损失是否能快速过拟合下降至接近0。如果不能则问题很可能出在数据或代码上。问题3验证损失val loss远高于训练损失且差距越来越大。原因这是典型的过拟合。模型记住了训练集的噪声和特定样本而无法泛化到新数据。解决增加数据增强使用更强的正则化数据增强在hyp.yaml中调整hsv_h,hsv_s,hsv_v,translate,scale,mosaic等参数。但注意对于小数据集Mosaic增强可能不太友好可以尝试关闭--mosaic。添加正则化在hyp.yaml中适当增加weight_decay权重衰减的值。早停Early Stopping监控验证集mAP当其连续多个epoch不再提升时手动停止训练。减少模型复杂度换用更小的模型如从yolov5m.yaml换到yolov5s.yaml。获取更多数据这是最根本的解决方法。可以通过爬虫、数据合成等方式扩充数据集。6.2 推理与部署阶段问题问题4模型在训练集上表现很好但在自己拍的新视频上漏检严重。原因领域分布差异。训练数据2018张图的环境和新视频的环境光线、角度、背景、摄像头型号不同。解决收集新环境的数据并重新标注加入到训练集中进行增量训练或重新训练。这是最有效的方法。在推理时尝试对输入图片进行预处理使其更接近训练数据的分布如调整对比度、亮度。适当降低推理时的置信度阈值--conf以提高召回率但会带来更多误报需要后端进行过滤如轨迹追踪、区域规则。问题5推理速度太慢无法达到实时如30 FPS。原因模型太大或部署硬件算力不足。解决模型层面使用更小的模型YOLOv5n, YOLOv5s或对现有模型进行剪枝和量化。YOLOv5官方提供了简单的后训练量化方法。推理引擎将PyTorch模型转换为TensorRT或ONNXRuntime进行推理通常能获得显著的加速。输入尺寸减小推理时的img-size如从640降到320速度会成倍提升但精度会下降。硬件升级考虑使用带NPU的专用边缘AI芯片如海思、瑞芯微、晶晨等方案它们对这类视觉模型有硬件级优化。6.3 业务逻辑集成技巧在“明厨亮灶”系统中单纯的检测框输出是不够的需要集成业务逻辑误报过滤区域入侵检测只检测划定的重点区域如地板角落、垃圾桶旁其他区域的报警忽略。大小过滤过滤掉过大或过小的检测框可能不是老鼠。轨迹分析连续多帧出现在同一位置且不动的“老鼠”可能是误报如污渍。真正老鼠的框会有连续、平滑的移动轨迹。可以集成简单的跟踪算法如ByteTrack, DeepSORT的轻量版。报警策略瞬时报警单帧检测到高置信度目标立即报警。可能误报多。持续报警在连续N帧如5帧中有M帧如3帧在同一区域检测到目标才触发报警。能有效过滤瞬时误报。分级报警根据老鼠出现的频次和区域设置不同等级的报警如提示、警告、严重警报。最后一点个人体会AI模型不是银弹。一个成功的“明厨亮灶”智能鼠患检测系统是“70%的业务逻辑与工程集成 25%的数据质量 5%的模型算法”。这个项目提供的源码和模型解决了最核心的5%和部分25%的问题。剩下的需要你深入理解厨房的实际运作、摄像头的安装位置、光照变化规律并设计出 robust 的业务规则来包装这个AI核心才能真正创造价值让技术稳稳地落地。本文还有配套的精品资源点击获取
返回列表