1. 项目概述
今天要分享的是一个基于YOLO深度学习模型的水果品质识别系统,结合PyQt5框架开发了一套完整的GUI应用。这个项目最初是为了解决农产品分拣线上人工检测效率低下的问题而开发的,经过多次迭代现在已经能够稳定运行在多种场景下。
系统核心功能包括:
- 支持图片、视频、摄像头三种输入源
- 实时检测水果外观品质(新鲜度、损伤、成熟度等)
- 可视化交互界面,操作门槛低
- 单帧处理速度达到45FPS(GTX1660显卡)
2. 技术架构解析
2.1 整体设计思路
系统采用经典的"前端展示+后端推理"架构:
PyQt5界面层 -> OpenCV处理层 -> YOLO模型层这种分层设计带来了三个明显优势:
- 界面与业务逻辑解耦,后期维护方便
- 视频流处理使用OpenCV优化后的管道
- 模型推理独立封装,便于替换升级
2.2 关键技术选型
YOLOv5s模型选择依据:
- 在自建水果数据集上测试对比:
- YOLOv5s:3.7MB,mAP@0.5=0.89
- YOLOv5m:12.6MB,mAP@0.5=0.91
- 权衡精度与速度后选择v5s版本
PyQt5的考量因素:
- 相比Tkinter有更丰富的UI组件
- 信号槽机制适合实时视频处理
- 成熟的跨平台支持
3. 环境搭建指南
3.1 基础环境配置
推荐使用conda创建虚拟环境:
conda create -n fruit_det python=3.9 conda activate fruit_det核心依赖安装:
pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 -f https://download.pytorch.org/whl/torch_stable.html pip install pyqt5 opencv-python matplotlib注意:PyQt5与Python3.9存在兼容性问题,建议使用5.15.4以上版本
3.2 模型训练环境
如果需要自定义训练:
git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt4. 核心功能实现
4.1 视频流处理框架
采用多线程架构避免界面卡顿:
class VideoThread(QThread): frame_ready = pyqtSignal(np.ndarray) def run(self): cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if ret: self.frame_ready.emit(frame)4.2 YOLO推理优化
三个关键优化点:
- 使用半精度推理:
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True).half()- 开启CUDA加速
- 批处理尺寸设置为8
优化前后对比:
| 配置 | 推理速度(FPS) |
|---|---|
| CPU模式 | 6.2 |
| GPU基础 | 32.5 |
| 优化后 | 45.1 |
4.3 品质判断逻辑
基于检测框特征分析:
def check_quality(box): # 提取ROI区域 roi = frame[box.y1:box.y2, box.x1:box.x2] # 颜色空间转换 hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) # 新鲜度判断 saturation = np.mean(hsv[:,:,1]) return "Fresh" if saturation > 60 else "Stale"5. 界面开发细节
5.1 UI布局设计
使用Qt Designer创建主界面:
- 左侧:视频显示区 (QLabel)
- 右侧:控制面板 (QGroupBox)
- 文件选择按钮
- 实时检测开关
- 结果显示区域
5.2 信号槽连接
关键信号绑定:
self.ui.btn_start.clicked.connect(self.start_detection) self.video_thread.frame_ready.connect(self.update_frame) self.model.detection_complete.connect(self.show_results)6. 模型训练要点
6.1 数据集构建
建议采集至少2000张包含以下情形的图片:
- 不同光照条件(自然光/室内光)
- 多种摆放角度
- 各类品质缺陷样本
标注规范示例:
<object-class> <x_center> <y_center> <width> <height> 0 0.435 0.512 0.231 0.4126.2 训练参数配置
关键参数设置:
lr0: 0.01 # 初始学习率 lrf: 0.1 # 最终学习率 momentum: 0.937 weight_decay: 0.00057. 常见问题解决
7.1 性能问题排查
症状:界面卡顿严重解决方案:
- 检查是否启用GPU加速
- 降低检测帧率(设置skip_frames参数)
- 缩小视频显示尺寸
7.2 检测精度提升
当遇到特定水果识别不准时:
- 收集更多该品种的训练样本
- 调整anchor box尺寸
- 增加数据增强手段:
augment: True hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.48. 项目部署建议
8.1 打包发布
使用PyInstaller生成可执行文件:
pyinstaller --onefile --windowed --add-data "models;models" main.py8.2 硬件选型指南
根据场景选择硬件配置:
| 场景 | 推荐配置 |
|---|---|
| 实验测试 | i5 CPU + GTX1060 |
| 产线部署 | Jetson Xavier NX |
| 云端服务 | T4 GPU实例 |
9. 效果展示与验证
测试结果示例:
指标统计:
| 水果类型 | 准确率 | 召回率 |
|---|---|---|
| 苹果 | 92.3% | 89.7% |
| 香蕉 | 88.5% | 91.2% |
| 橙子 | 90.1% | 87.6% |
10. 扩展开发方向
基于当前系统可以进一步:
- 集成条形码识别实现溯源
- 添加重量传感器数据融合
- 开发微信小程序远程监控
我在实际部署中发现,将检测阈值调整为0.6(默认0.5)可以在复杂背景下获得更好的检测效果。另外建议对摄像头视频流做白平衡校正,能显著提升颜色判断的准确性。