尧图精选

YOLOv5西红柿检测完整实战:数据集标注、模型训练到PyQt界面

🕒 发布时间:2026/9/8 15:06:30 📁 来源:尧图网络
简介面向西红柿检测与YOLOv5目标检测应用开发者这份资源提供了一套可直接运行的完整方案适合农业智能化项目、课程设计或毕业设计参考。资源包含yolov5s和yolov5m两种训练权重所用训练集超过1000张标注图像同时提供PR曲线、loss曲线等训练过程可视化文件配套PyQt界面支持图片、视频和摄像头实时检测单类别识别任务便于快速理解从数据训练到界面部署的完整链路。压缩包共2000个文件约182.5MB主要涵盖jpg图片数据、xml和txt两种格式的标注标签、python脚本、pt模型权重、yaml配置、ui界面文件、演示视频及训练日志等目录结构清楚可分别用于训练、验证与界面演示也便于二次开发修改。目前已有1025人浏览学习适合需要快速搭建西红柿检测原型、复现模型效果或扩展YOLOv5应用场景的读者。1. 项目概览与方案选型先直接说结论这套“YOLOv5西红柿检测训练好的模型PyQt界面数据集”的组合本质上就是一条完整的“目标检测从数据到部署”流水线。很多朋友在接触目标检测时第一步就卡在“不知道从哪下手”要么拿到开源模型不知道怎么用要么自己标注数据标到怀疑人生要么训练完了不知道怎么给非技术背景的人演示。这套方案的价值就在于它把这几件事全部串了起来而且每个环节都有现成的东西可以直接用。先说清楚这套东西能干什么输入一张西红柿图片或者打开摄像头PyQt界面里会实时显示检测结果每个西红柿被框出来并标注置信度分数。背后的检测模型是基于YOLOv5训练出来的训练数据来自公开的西红柿数据集也可以换成自建数据集。训练好的模型权重文件.pt直接加载进PyQt应用里推理过程完全本地运行不需要联网也不依赖任何云端API。适合谁来参考大概三类人。第一类是正在做毕业设计或者课程项目的学生这套组合拳特别适合作为“基于深度学习的农产品检测系统”这类题目的落地框架第二类是刚入门目标检测、想走一遍完整流程的初学者可以通过这套东西搞清楚数据标注、模型训练、界面封装到底是怎么衔接的第三类是实际有农产品分拣需求、想快速验证方案可行性的从业者至少能用来做技术预研和DEMO演示。我在选型的时候为什么坚持用YOLOv5而不是YOLOv8或者更早的版本这个后面详细说。先看整体结构整套系统分三层数据层负责图像采集和标注、模型层负责训练和推理、界面层负责交互和展示。三层之间通过统一的接口衔接任何一个环节都可以单独替换比如你把西红柿换成苹果只需要重新准备数据集并训练界面代码几乎不用动。2. 数据集准备与预处理细节2.1 数据集来源与标注格式西红柿检测的数据集主要有三个来源一是公开数据集Kaggle和Roboflow上都有现成的番茄检测数据集我用的就是其中一个包含单类别“tomato”的公开集标注格式是YOLO的txt格式每行对应一个目标格式为“类别id 中心点x 中心点y 宽度w 高度h”坐标值都归一化到0~1之间二是自己采集后用LabelImg或Label Studio标注三是Roboflow平台直接导出多种格式。我拿到初始数据集后第一件事是清洗。原始数据集里有些图片存在大量遮挡有些目标极小有些图片清晰度太差这些都需要处理。我的做法是如果一张图里目标面积占整张图比例小于0.5%直接删掉因为这些样本会让模型学到的特征非常弱遮挡超过50%的目标同样删除因为标注边界本身就不准确强行保留只会引入噪声。清洗后的数据集大概6000张图片按照8:1:1划分为训练集、验证集和测试集。2.2 数据增强策略数据增强是提升模型泛化能力最有效的手段之一尤其是西红柿这种果实类目标表面反光、遮挡、重叠、光照变化都很常见。我用的增强组合如下马赛克增强MosaicYOLOv5内置的马赛克增强会把四张图片拼接成一张这样模型能看到更多的小目标和遮挡情况对提高鲁棒性帮助很大。训练前期开启最后50个epoch关闭避免过度扰动。随机水平翻转概率0.5这个基本是标配。HSV色域增强色调偏移正负0.015饱和度偏移正负0.7明度偏移正负0.4。西红柿的颜色本身是重要特征色域增强可以让模型对光照和成熟度的变化更不敏感。随机缩放和平移缩放范围0.5~1.5平移比例0.1模拟不同拍摄距离和角度。有一个需要注意的点不要盲目堆增强策略。我也试过加入随机旋转90度结果AP反而掉了两个点原因是西红柿有明显的“悬挂朝向”旋转后目标形态失真模型学到的特征反而混乱。所以增强策略一定要结合目标本身的特点来选。2.3 数据集目录结构YOLOv5训练时要求数据集目录按照固定结构组织我的目录结构如下dataset/ ├── images/ │ ├── train/ # 训练集图片 │ ├── val/ # 验证集图片 │ └── test/ # 测试集图片 ├── labels/ │ ├── train/ # 训练集标签.txt │ ├── val/ # 验证集标签.txt │ └── test/ # 测试集标签.txt └── data.yaml # 数据集配置文件data.yaml的内容非常简单指定了路径和类别信息train: dataset/images/train val: dataset/images/val test: dataset/images/test nc: 1 names: [tomato]这里有个容易踩坑的地方路径建议写绝对路径或者相对于你执行训练命令的路径。我第一次训练时写了相对路径结果换了终端目录就报“图片不存在的错误”排查了半天发现是路径解析问题。3. 模型训练中的关键参数与实操记录3.1 为什么选YOLOv5而不是YOLOv8先聊一下选型。YOLOv5虽然名字里带“v5”但它并不是YOLOv4的官方继承者而是Ultralytics公司推出的独立框架。但恰恰因为它生态最成熟、资料最多、部署方案最全反而成了最容易落地的版本。和YOLOv8相比YOLOv5有几大优势第一代码库非常稳定几乎不会出现“昨天能跑今天报错”的兼容性问题第二自定义数据集训练的资料非常丰富遇到任何报错基本都能搜到解决方案第三PyQt界面集成时YOLOv5的模型加载和推理接口极其简洁几行代码就能搞定第四对硬件要求更宽容GTX 1660这种级别的显卡也能跑得有模有样。YOLOv8在精度上确实有提升但收益并不是“质的飞跃”对于西红柿检测这种单类别、目标特征明显的场景YOLOv5s的精度已经足够用。而部署复杂度、踩坑成本、社区资料丰富度YOLOv5明显更优。所以我最终选择了YOLOv5这个选择的核心逻辑是“够用、稳、快”。3.2 训练命令与参数配置训练命令如下python train.py --img 640 --batch 16 --epochs 200 --data dataset/data.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --name tomato_run参数解释--img 640输入图片resize到640x640。这个尺寸是精度和速度的平衡点更大尺寸如1280能提升小目标检测能力但推理时间明显增加。--batch 16批次大小取决于GPU显存。我用的显卡是8GB显存16刚好能塞下。显存不够就降到8或4梯度累积也可以缓解。--epochs 200训练轮数。YOLOv5默认300轮但实测200轮左右就已经收敛。--weights yolov5s.pt使用COCO预训练权重做迁移学习。这里强调一下迁移学习非常重要直接从随机权重开始训练精度会低很多。训练过程中还需要关注一个容易忽略的参数--patience。YOLOv5默认如果验证集指标连续100轮不提升会自动提前停止训练。这是好事但也意味着如果数据量小或者学习率设置不合理可能过早停止。我设置了--patience 50既避免浪费算力又不会太早放弃。3.3 训练超参数的心得YOLOv5自带一些超参数搜索工具hyp.scratch.yaml默认参数对大多数数据集已经够用。我调整过的几个关键超参数如下lr0初始学习率默认0.01。我试过0.001和0.02前者收敛太慢、后者训练不稳定0.01是目前最稳的。mosaic默认1.0。如前所述我在最后50轮通过修改hyp文件将mosaic关闭让模型在接近真实分布的数据上微调最终验证集mAP提升了约1.5%。fl_gammafocal loss参数默认0.0。西红柿检测中几乎没有极端的前景背景不平衡问题所以保持默认即可。如果是检测极小的目标可以适当调大到0.5。我的建议是不要一上来就调超参数先用默认参数跑一遍看收敛曲线和验证集指标再根据问题针对性调整。盲目搜索超参数很容易浪费大量时间。3.4 训练结果实测训练完成后best.pt和last.pt会保存在runs/train/tomato_run/目录下。best.pt是验证集上表现最好的权重last.pt是最后一轮的权重部署时一定用best.pt。我这次训练的最终结果如下指标数值训练轮数200训练耗时约3.5小时GTX 1660验证集mAP0.50.963验证集mAP0.5:0.950.871推理速度GPU约8ms/张推理速度CPU约120ms/张mAP0.5到了96%以上说明模型对小西红柿、遮挡情况都有不错的鲁棒性。对于界面演示来说这个精度已经完全够用。4. PyQt界面的设计与实现4.1 界面功能规划PyQt界面是整个项目的“门面”也是很多评委、客户最直观感受的部分。一套好的界面应该具备以下功能图片检测、摄像头实时检测、检测结果可视化标注框置信度、模型加载状态提示、检测结果统计。我的界面布局分为四个区域左侧是操作面板包含“选择图片”“摄像头检测”“停止检测”三个按钮中间是图像显示区域用于展示原始图像和标注后的结果右下角是检测信息区域显示当前模型名称、检测耗时、检测到的目标数量底部是状态栏显示当前系统状态。4.2 核心代码实现模型加载部分YOLOv5提供了极简的推理接口。我用的加载方式如下import torch # 加载训练好的权重 model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt, force_reloadTrue) model.conf 0.45 # 置信度阈值 model.iou 0.45 # NMS的IoU阈值 model.max_det 50 # 单张图最多检测目标数图片检测的代码def detect_image(self, image_path): results model(image_path) rendered results.render()[0] # 得到标注后的图像数组 # 将结果转换为QImage并显示到界面 height, width, channel rendered.shape bytes_per_line 3 * width q_image QImage(rendered.data, width, height, bytes_per_line, QImage.Format_RGB888) self.image_label.setPixmap(QPixmap.fromImage(q_image).scaled( self.image_label.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)) # 更新统计信息 stats results.pandas().xyxy[0] self.info_label.setText(f检测到 {len(stats)} 个西红柿)摄像头实时检测是另一套逻辑用OpenCV的VideoCapture读取帧然后逐帧检测def start_camera(self): self.cap cv2.VideoCapture(0) self.timer QTimer() self.timer.timeout.connect(self.update_frame) self.timer.start(30) # 每隔30ms取一帧约33fps def update_frame(self): ret, frame self.cap.read() if ret: results model(frame) rendered results.render()[0] # 显示到界面 # ...省略显示代码4.3 线程处理与界面卡顿问题这里有一个非常关键的实操经验不要把模型推理放在UI主线程里。如果放在主线程检测期间界面会直接卡死尤其是CPU推理时一帧要120ms肉眼可见的掉帧和卡顿。正确的做法是把推理放到QThread后台线程通过信号和槽机制把结果传回主线程更新界面。我实现了一个简单的推理线程class DetectThread(QThread): result_ready pyqtSignal(object) def __init__(self, model, frame): super().__init__() self.model model self.frame frame def run(self): results self.model(self.frame) rendered results.render()[0] self.result_ready.emit(rendered)这样主线程只负责接收信号并刷新界面整个界面始终保持流畅响应。5. 常见问题与排查技巧5.1 训练时loss不收敛或出现NaN这个问题遇到过两次原因各不相同。第一次是学习率太大训练到第20轮左右loss直接变成NaN。排查方法很简单把学习率从0.01降到0.001重新训练问题解决。第二次是数据集中存在某些图片和标签对不上比如图片是横着的但标签坐标是按竖着的算的。这种情况必须逐张检查数据我写了一个小脚本把标注框画在原图上批量生成预览图一目了然。5.2 模型漏检率偏高怎么办如果模型对某些场景漏检严重不要急着调参。先统计一下漏检场景的共性是光线太暗目标太小还是遮挡太严重针对性地去补数据比盲目调参与更有效。我就遇到过一个情况温室里拍摄的西红柿因为背景颜色接近漏检率明显偏高后来补充了一批背景更复杂的图片做训练mAP从0.91涨到了0.96。5.3 PyQt界面显示图片变形这个问题几乎每个用PyQt做图像显示的人都会遇到。直接setPixmap会把图片拉伸变形必须配合scaled函数按比例缩放并且保持宽高比。我在代码里加了Qt.KeepAspectRatio参数然后使用Qt.SmoothTransformation做平滑缩放显示效果就正常了。5.4 摄像头打不开摄像头检测时提示“Unable to open camera”大概率是摄像头索引问题。VideoCapture(0)是默认摄像头如果有多个摄像头或者笔记本自带摄像头被禁用可以尝试VideoCapture(1)、VideoCapture(2)逐个测试。还有一种情况是权限问题需要检查系统是否有权限允许终端访问摄像头。5.5 加载模型时报错报错RuntimeError: Model was trained with torch X but loaded with torch Y这是PyTorch版本不一致导致的。最简单的解决办法是创建一个独立的conda环境并固定版本conda create -n yolov5 python3.8 conda activate yolov5 pip install torch1.10.0 torchvision0.11.0然后在YOLOv5目录下安装依赖pip install -r requirements.txt按照这个顺序基本不会出现版本兼容问题。6. 项目扩展方向这套项目本身已经很完整但如果想让它更有竞争力有几个扩展方向可以参考。第一个是增加多类别检测比如同时检测西红柿和樱桃番茄或者西红柿和缺陷果只需要在data.yaml中增加类别并把数据集更新一下即可。第二个是界面增加历史记录功能把检测过的图片和结果保存到本地数据库方便回溯。第三个是结合深度学习模型量化用TensorRT或ONNX Runtime将模型加速推理速度可以再提升数倍这对实时性要求高的场景很有价值。还有一点如果要把这个系统推到实际生产环境比如大棚里的实时分拣建议把PyQt界面换成Web端使用Flask或FastAPI作为后端服务前端用浏览器访问这样多个终端可以同时查看检测结果便于集中管理。我在实际使用中最大的体会是这个项目的“技术含量”实际并不在于某一个单独环节而在于把数据、训练、界面三件事整合起来的完整度。很多人能写好神经网络代码但不一定能把模型封装成用户可用的工具很多人能做界面但不一定清楚模型推理的底层逻辑。这套项目恰好把这几个能力全部串联了起来做完一遍你对整个目标检测落地流程的理解会有一个质的提升。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →