简介本资源是面向智慧餐饮监管与食品安全AI落地场景的明厨亮灶专项老鼠检测解决方案适用于计算机视觉初学者、算法工程师及市场监管信息化项目开发者。资源提供基于YOLOv5s的完整老鼠检测源码、已训练模型.pt、2018张高质量实景厨房图像及双格式标注——含2022个VOC标准XML文件用于数据解析与可视化和2020个YOLO格式TXT标签直接适配训练流程数据经人工逐张筛选标注覆盖暗角、遮挡、多尺度老鼠目标具备强泛化性与工程可用性。压缩包共2000个文件含17个核心Python脚本train.py/test.py/datasets.py等、15个配置YAML文件、4个Shell部署脚本及实测模型与说明文档整体695.94MB。目前已有6065人学习下载配套B站检测效果视频可直观验证实时性与准确率开箱即用支持快速二次开发与本地化部署。1. 项目概述与核心价值最近在整理过往的实战项目资料翻到了这个“明厨亮灶”场景下的老鼠检测项目。这个项目在当时解决了一个非常实际的问题如何利用AI视觉技术对餐饮后厨、食品加工车间等关键区域进行7x24小时的自动化、非接触式鼠患监测。传统的鼠患防治依赖人工巡查和物理陷阱不仅效率低下存在监控盲区而且无法做到实时预警。我们这个项目就是基于当时现在依然流行的YOLOv5目标检测框架训练了一个专门针对老鼠的检测模型并配套了完整的源码、训练好的模型权重以及一个包含2018张已标注图片的数据集。对于想入门计算机视觉、学习YOLO实战或者有类似安防、卫生监测需求的朋友来说这套资料是一个非常好的起点和参考。简单来说这个项目包提供了“从数据到应用”的一条龙素材。你拿到手的不只是一个黑盒模型而是包括了原始数据图片标签、模型训练源码、预训练权重这三件套。这意味着你可以直接用它进行推理检测老鼠也可以深入研究其训练过程甚至用自己的数据微调模型。无论是学生做毕业设计、工程师做POC验证还是企业进行技术预研这套资源的完整性和实用性都相当高。接下来我就把这个项目的来龙去脉、技术细节、实操要点以及我踩过的坑系统地梳理一遍。2. 项目整体设计与思路拆解2.1 业务场景与需求分析“明厨亮灶”的核心诉求是透明化和安全化让食品制作过程可视、可查、可控。老鼠作为重要的病媒生物和卫生风险源是其重点监控对象。我们的项目需求非常明确高准确率与召回率在复杂的后厨环境光线变化、杂物遮挡、反光下能稳定地检测出老鼠尽量减少漏报老鼠没检测到和误报把阴影、袋装垃圾等错认为老鼠。实时性视频流需要实时处理延迟不能太高以便及时触发警报如声光报警、通知管理人员。轻量化与易部署最终模型需要能部署在边缘设备如海思、瑞芯微等国产化芯片的NVR或智能相机或工控机上对计算资源不能有太高要求。数据隐私与合规所有图像数据均需脱敏处理不包含任何可识别的人脸或商业信息完全符合相关安全规定。基于这些需求我们放弃了需要大型计算集群的两阶段检测器如Faster R-CNN也暂未采用当时最新但部署更复杂的模型而是选择了在速度、精度和易用性上取得很好平衡的YOLOv5。2.2 技术选型为什么是YOLOv5在当时项目启动约在2021年YOLOv5虽然并非官方YOLO系列YOLOv4是Alexey Bochkovskiy在Darknet上的官方版本但因其一系列工程化优势迅速流行起来完美匹配了我们的项目需求PyTorch框架相比YOLOv4的DarknetPyTorch的生态更丰富社区活跃调试和二次开发的门槛低得多。这对于需要快速迭代和定制化的项目至关重要。卓越的易用性YOLOv5提供了极其清晰的代码结构、详细的文档和丰富的脚本。从数据准备、模型训练、验证到导出为各种格式如ONNX、TorchScript都有现成的工具大大降低了工程化落地的难度。良好的精度-速度权衡YOLOv5提供了s小、m中、l大、x超大四个预定义模型尺寸。我们可以根据部署设备的算力灵活选择。对于大部分边缘设备YOLOv5s在保持可接受精度的前提下速度优势非常明显。活跃的社区与持续更新YOLOv5的GitHub仓库issue和讨论非常活跃遇到问题很容易找到解决方案或类似案例。虽然现在有YOLOv8、v9、v10等后续版本但v5的成熟度和资料丰富度对于很多工业项目来说依然是最稳妥的选择之一。注意技术选型需要结合项目周期和团队技术栈。如果今天启动一个新项目我会建议同时评估YOLOv8/v10它们在精度和功能上可能有提升。但本项目作为一套完整的学习和基础解决方案YOLOv5的成熟度和配套资源是无与伦比的。2.3 数据集构建2018张图片背后的故事2018张图片听起来不多但对于一个特定的目标老鼠来说构建一个高质量的数据集已经需要花费不少功夫。我们的数据来源主要有公开数据集爬取与筛选从一些公开的害虫检测数据集中筛选出老鼠的图片。模拟环境拍摄在可控环境下使用玩具模型或在确保安全合规的前提下进行拍摄以获取不同角度、光照下的标准图像。合作单位提供的脱敏数据从一些餐饮、工厂单位的实际监控视频中抽取包含老鼠的帧并进行严格的脱敏处理模糊背景、去除标识等。数据的质量直接决定了模型的天花板。我们在这个阶段投入了最多的时间标注格式采用YOLO系列通用的txt格式。每个图片对应一个同名的txt文件每行表示一个目标格式为class_id x_center y_center width height。坐标和宽高都是相对于图片宽度和高度的归一化值0-1之间。例如0 0.5 0.5 0.2 0.1表示类别0老鼠的中心点在图片中心宽度占图宽的20%高度占图高的10%。类别定义本项目只有一个类别rat老鼠。所以class_id始终为0。数据清洗剔除了模糊、过暗、目标过小的图片。对于遮挡严重的老鼠我们进行了判断如果遮挡后仍能通过轮廓判断为老鼠则标注如果只剩尾巴或完全无法辨认则舍弃该图片或不对该目标进行标注。数据增强策略YOLOv5训练时内置了强大的数据增强Mosaic Random Affine HSV调整等。但我们也在原始数据集中适当增加了不同亮度、对比度的版本以模拟实际厨房中灯光开关、日光变化的效果。3. 核心细节解析与实操要点3.1 源码结构深度解读拿到源码不要急着运行。先花半小时理清目录结构能避免后面很多混乱。一个标准的YOLOv5项目源码通常包含以下核心部分yolov5-rat-detection/ ├── data/ │ ├── hyps/ # 超参数配置文件 │ ├── images/ # 示例图片目录 │ ├── labels/ # 示例标签目录 │ └── rat.yaml # **核心**自定义数据集配置文件 ├── models/ │ ├── common.py # 通用模块定义Conv, Bottleneck, SPP等 │ ├── experimental.py # 实验性模块 │ ├── tf.py # TensorFlow相关导出模块 │ ├── yolo.py # YOLO模型定义 │ └── yolov5s.yaml # **核心**YOLOv5s模型结构配置文件 ├── runs/ │ ├── train/ # 训练日志、权重、结果可视化 │ └── detect/ # 推理结果 ├── utils/ │ ├── activations.py │ ├── augmentations.py # 数据增强 │ ├── datasets.py # 数据集加载 │ ├── general.py # 通用函数画框、计算指标等 │ ├── metrics.py # 计算mAP等指标 │ ├── plots.py # 绘图函数 │ └── torch_utils.py # PyTorch相关工具 ├── weights/ # 存放预训练权重 ├── detect.py # **核心**推理脚本 ├── train.py # **核心**训练脚本 ├── val.py # **核心**验证脚本 ├── export.py # **核心**模型导出脚本转ONNX等 └── requirements.txt # Python依赖包列表对于本项目使用者最需要关注的是三个文件data/rat.yaml,models/yolov5s.yaml, 以及入口脚本train.py和detect.py。3.2 数据集配置文件rat.yaml详解这是连接你的数据和训练程序的桥梁。一个错误的配置会导致训练根本无法开始。我们的rat.yaml内容如下# 训练和验证图像的路径相对路径或绝对路径 train: ../datasets/rat/images/train val: ../datasets/rat/images/val # 类别数量 nc: 1 # 类别名称列表 names: [rat] # 可选下载数据集的URL本项目为本地数据故留空 # download: ...关键点train和val路径指向的是图片.jpg/.png所在的目录。YOLOv5会自动在同级目录下寻找labels文件夹并在其中查找同名的.txt标签文件。例如图片路径为../datasets/rat/images/train/img001.jpg那么程序会去../datasets/rat/labels/train/img001.txt找标签。务必保证图片和标签的文件名不含后缀严格一致。数据集划分我们将2018张图片按大约8:1:1的比例划分为训练集~1614张、验证集~202张和测试集~202张。rat.yaml中只配置了train和val。测试集test用于最终模型评估不参与训练和验证调参。3.3 模型配置文件与预训练权重我们主要使用models/yolov5s.yaml。这个文件定义了网络的结构。通常我们不需要修改它除非你想进行模型结构调整如更换注意力机制。更常见的做法是通过命令行参数选择模型尺寸--weights yolov5s.pt。 使用预训练权重是加速收敛、提升精度的关键。YOLOv5官方提供了在COCO数据集上预训练的权重yolov5s.pt,yolov5m.pt等。我们的项目也提供了基于自己数据训练好的权重。在训练时使用--weights yolov5s.pt参数模型会加载这些权重只替换最后的检测头因为COCO有80类我们只有1类并进行微调这比从头训练快得多效果也好得多。4. 实操过程与核心环节实现4.1 环境搭建与依赖安装这是第一步也是最容易出错的一步。强烈建议使用Conda或虚拟环境来管理依赖避免包冲突。# 1. 克隆源码假设项目包已解压 # git clone https://github.com/ultralytics/yolov5 # 如果是官方源码 # 我们的项目包已经包含了定制化的源码直接进入目录即可 cd yolov5-rat-detection # 2. 创建并激活虚拟环境以Conda为例 conda create -n yolov5-rat python3.8 # 推荐Python 3.7-3.9 conda activate yolov5-rat # 3. 安装依赖 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple避坑指南PyTorch版本requirements.txt里指定的是torch1.7.0。但最好根据你的CUDA版本去 PyTorch官网 获取精确的安装命令。例如对于CUDA 11.3pip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113安装完PyTorch后再安装其他依赖。OpenCV如果安装opencv-python出错可以尝试安装opencv-python-headless。权限问题在Linux系统下如果使用--user安装或遇到权限问题请确保虚拟环境已激活并在该环境下操作。4.2 数据准备与目录结构将提供的2018张图片和标签文件按照以下结构组织datasets/ └── rat/ ├── images/ │ ├── train/ # 存放训练图片例如 1614张 │ └── val/ # 存放验证图片例如 202张 └── labels/ ├── train/ # 存放训练标签与训练图片一一对应 └── val/ # 存放验证标签与验证图片一一对应重要检查运行以下Python脚本随机检查几张图片和标签是否对应正确import cv2, os img_path ./datasets/rat/images/train/img001.jpg label_path ./datasets/rat/labels/train/img001.txt img cv2.imread(img_path) h, w, _ img.shape with open(label_path, r) as f: for line in f: cls, x_c, y_c, bw, bh map(float, line.strip().split()) # 将归一化坐标转回像素坐标 x1 int((x_c - bw/2) * w) y1 int((y_c - bh/2) * h) x2 int((x_c bw/2) * w) y2 int((y_c bh/2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0,255,0), 2) cv2.imshow(check, img) cv2.waitKey(0) cv2.destroyAllWindows()确保rat.yaml中的路径正确指向了datasets/rat/images/train和val。4.3 模型训练命令与参数解析环境准备好数据放对位置就可以开始训练了。核心训练命令如下python train.py \ --img 640 \ # 训练图片尺寸长边缩放到640短边按比例缩放 --batch 16 \ # 批次大小根据GPU内存调整。11G显存可设16-32。 --epochs 100 \ # 训练轮数对于微调50-100通常足够 --data data/rat.yaml \ # 数据集配置文件路径 --cfg models/yolov5s.yaml \ # 模型结构配置文件 --weights yolov5s.pt \ # 加载预训练权重 --name rat_detection \ # 本次实验名称结果会保存在 runs/train/rat_detection/ --cache \ # 使用缓存加速数据加载如果内存/显存够大 --device 0 \ # 使用第0块GPU如果是CPU则用 --device cpu --workers 8 \ # 数据加载子进程数根据CPU核心数调整 --hyp data/hyps/hyp.scratch-low.yaml \ # 使用针对小数据集的超参数配置 --seed 42 # 固定随机种子确保实验可复现关键参数深度解析--img 640: YOLOv5的默认输入尺寸。更大的尺寸如1280可能提升对小目标的检测精度但会显著增加计算量和内存消耗减慢速度。对于厨房场景老鼠目标通常不会特别小640是一个兼顾速度和精度的选择。--batch 16:批次大小是影响训练稳定性和速度的最重要参数之一。如果GPU内存不足导致“CUDA out of memory”错误请减小batch值如8, 4。也可以尝试启用--multi-scale训练但会进一步增加训练时间。--hyp: 超参数配置文件。YOLOv5提供了几个预设hyp.scratch-low.yaml低数据量、hyp.scratch-med.yaml中等、hyp.scratch-high.yaml高。我们数据量约2000张属于中小规模使用low版本更为保守可以防止过拟合。你也可以尝试med但需要密切监控验证集损失。--cache: 将加载的图像缓存到内存或磁盘RAM/disk cache可以极大加速epoch迭代尤其当数据集图片较大时。前提是你的内存足够大通常需要大于数据集总大小。训练开始后终端会输出每一轮epoch的训练损失和验证损失以及mAP0.5等指标。更重要的是TensorBoard日志会自动生成在runs/train/rat_detection/目录下。你可以通过以下命令实时监控训练过程tensorboard --logdir runs/train/rat_detection然后在浏览器打开http://localhost:6006。重点关注metrics/mAP_0.5在IoU阈值为0.5时的平均精度是我们的核心指标。它会随着训练逐步上升并趋于平稳。metrics/precision和metrics/recall精确率和召回率。我们希望两者都高。如果精确率高但召回率低说明模型很保守很多老鼠没被检测到如果召回率高但精确率低说明模型乱报误检多。losses下的train/box_loss,train/obj_loss,train/cls_loss训练损失。val/下的对应项是验证损失。理想情况下训练损失和验证损失都应稳步下降并最终收敛。如果验证损失开始上升而训练损失下降可能是过拟合了。4.4 模型推理与效果验证训练完成后最好的模型权重默认是mAP最高的那个会保存在runs/train/rat_detection/weights/best.pt。我们可以用这个权重进行推理测试。python detect.py \ --source ../test_images/ \ # 输入源可以是图片、视频、目录、摄像头0 --weights runs/train/rat_detection/weights/best.pt \ --img 640 \ # 推理尺寸通常与训练一致 --conf 0.25 \ # 置信度阈值高于此值才认为是目标 --iou 0.45 \ # NMS的IoU阈值用于合并重叠框 --device 0 \ # 推理设备 --save-txt \ # 保存检测结果的标签文件txt格式 --save-conf \ # 在保存的标签中同时保存置信度 --name rat_inference # 推理结果保存目录 runs/detect/rat_inference/参数调优心得--conf 0.25这是最重要的参数之一。在实际部署中需要根据业务敏感度调整。如果漏报没发现老鼠的代价很高可以调低如0.15让模型更敏感但误报会增多。如果误报误报警很烦人可以调高如0.4让模型更确信时才报警。通常需要在验证集上画一条P-R曲线根据业务需求选取合适的阈值。--iou 0.45非极大值抑制阈值。如果一个区域有多个重叠的预测框这个参数决定了它们被判定为同一个目标的范围。默认0.45适用于大多数情况。如果场景中目标非常密集可以适当调低如0.3避免一个目标被多个框覆盖。--save-txt保存的txt标签格式与训练标签格式一致方便后续的量化评估或集成到其他系统。推理结果会保存在runs/detect/rat_inference/下包含画了检测框的图片。你可以直观地查看模型在未见过的图片或视频上的表现。4.5 模型导出与部署准备训练好的PyTorch模型.pt文件需要转换成部署环境支持的格式。最常见的中间格式是ONNX。python export.py \ --weights runs/train/rat_detection/weights/best.pt \ --img 640 640 \ # 输入图片尺寸 (高度, 宽度) --batch 1 \ # 批次大小部署时通常是1 --device cpu \ # 导出设备用cpu即可 --include onnx \ # 导出为ONNX格式 --opset 12 \ # ONNX算子集版本12或13较通用 --simplify \ # 启用ONNX-Simplifier简化模型 --dynamic \ # 允许动态输入尺寸可选固定尺寸性能更好导出成功后你会得到best.onnx文件。这个文件可以被OpenCV DNN模块加载C/Python。TensorRT进一步优化并在NVIDIA GPU上加速。ONNX Runtime在各种硬件和平台上运行包括CPU、ARM等。许多国产AI芯片的推理框架如瑞芯微的RKNN、华为的Ascend CANN也支持ONNX作为中间格式。重要提示在导出ONNX前务必用detect.py或val.py测试一下.pt模型确保其功能正常。导出ONNX后也务必用ONNX Runtime进行推理验证对比结果是否与PyTorch推理一致这一步叫“精度对齐”是部署前必不可少的环节。5. 常见问题与排查技巧实录在实际操作中你几乎一定会遇到下面这些问题。我把它们和解决方案整理成了表格方便快速查阅。问题现象可能原因排查步骤与解决方案训练时Loss为NaN或突然变成NaN1. 学习率lr0过高。2. 数据标签有错误如坐标超出[0,1]。3. 梯度爆炸。1.首要措施立即停止训练检查数据。使用3.2节的检查脚本遍历所有标签文件确保x_center,y_center,width,height都在0-1之间。2. 降低学习率在hyp.yaml文件中将lr0从默认的0.01降低到0.001或0.0005重新开始训练。3. 尝试使用梯度裁剪在train.py命令中添加--clip-grad 10.0。训练很久mAP一直很低0.51. 数据质量差目标模糊、标注错误。2. 数据量太少。3. 模型复杂度与数据量不匹配如用YOLOv5x训练小数据集。4. 超参数不合适。1.可视化检查用TensorBoard查看训练集和验证集的图片看数据增强后的图片是否合理目标是否清晰。2.分析标签检查数据集中目标的尺寸分布。如果老鼠在图片中占比普遍很小如1%考虑增大输入尺寸--img 1280或在hyp.yaml中调整针对小目标的损失权重。3.更换模型换用更小的模型yolov5s.pt或yolov5n.pt。4.调整超参数尝试使用hyp.scratch-med.yaml或微调loss_otaOTA损失等参数。推理速度慢1. 推理尺寸--img过大。2. 使用了未优化的ONNX或PyTorch模型。3. 硬件性能瓶颈。1. 将推理尺寸从640降至416或320会显著提升速度但可能损失对小目标的精度。需要做权衡测试。2. 对ONNX模型进行TensorRT或OpenVINO等推理引擎的优化和量化INT8可大幅提升速度。3. 确保使用了GPU推理--device 0并检查GPU利用率是否饱和。误检多把阴影、袋子当老鼠1. 训练数据中负样本没有老鼠的图片不足。2. 置信度阈值--conf过低。3. 数据增强过于激进产生了不真实的样本。1.增加负样本在数据集中加入一定比例如10%-20%完全不包含老鼠的厨房背景图片并将其标签文件设为空文件。这能教会模型“什么是背景”。2.提高置信度阈值逐步提高--conf如0.3, 0.4, 0.5观察误报减少和漏报增加的情况找到业务可接受的平衡点。3.调整数据增强在hyp.yaml中降低hsv_h,hsv_s,hsv_v颜色扰动和degrees旋转的幅度。漏检多老鼠检测不出来1. 目标过小或遮挡严重。2. 置信度阈值--conf过高。3. 训练数据中某些姿态或场景的老鼠样本不足。1.针对小目标如前所述尝试增大训练和推理的img-size。也可以修改模型结构例如使用更浅的网络或添加针对小目标的检测层需修改yolov5s.yaml但这属于进阶操作。2.降低置信度阈值尝试--conf 0.15或0.1。3.数据层面解决这是根本。有针对性地补充漏检场景的图片如老鼠在管道后面、在黑暗角落到训练集并重新训练。导出ONNX后推理结果错误1. 导出时输入/输出节点不匹配。2. 预处理归一化、通道顺序或后处理NMS未对齐。1.使用Netron可视化ONNX模型确认输入输出节点的名称和维度是否符合预期。2.严格对齐预处理确保ONNX推理时图片的缩放、归一化除以255、BGR转RGB等操作与PyTorch训练/推理时完全一致。YOLOv5的预处理代码在utils/datasets.py的LoadImages类中。3.对齐后处理ONNX模型通常只输出原始预测张量需要自己实现NMS。确保你的NMS实现与PyTorch端的non_max_suppression函数在utils/general.py中逻辑一致特别是IoU计算和置信度筛选部分。我的独家心得关于数据“数据决定上限模型决定下限”是铁律。在这个项目中我们花了60%的时间在数据清洗、标注和增强上。一个技巧是在训练初期可以故意设置一个较低的--conf阈值如0.001在验证集上推理然后人工检查所有预测框。那些模型给出低置信度如0.1-0.3但确实是老鼠的框说明是“难样本”那些高置信度但却是错误背景的框说明是“误导性负样本”。把这两类样本找出来针对性补充或修正对模型提升效果立竿见影。关于训练不要一上来就训练几百轮。先用小轮数如10-20轮快速跑一个实验看看Loss曲线是否正常下降mAP是否有上升趋势。这能帮你快速发现数据或配置上的重大问题避免浪费几天时间训练出一个废模型。关于部署如果部署到边缘设备量化是必经之路。在PyTorch训练后可以考虑使用PyTorch的量化感知训练QAT或训练后动态量化/静态量化然后再导出ONNX。也可以使用TensorRT、OpenVINO等工具对ONNX进行后量化。量化后的模型大小可能减少为原来的1/4速度提升2-4倍但会带来轻微的精度损失通常1% mAP需要在业务可接受范围内进行权衡测试。这个“明厨亮灶”老鼠检测项目虽然目标单一但完整地走通了从数据准备、模型训练、调优到推理部署的整个AI视觉应用 pipeline。希望这份超详细的拆解能帮你不仅跑通这个项目更能理解每一个步骤背后的“为什么”从而具备解决自己实际问题的能力。本文还有配套的精品资源点击获取