在农业质检领域,苹果腐烂检测一直是个耗时费力的工作。传统人工分拣不仅效率低下,而且受主观因素影响大。我们团队基于最新的YOLOv12算法,开发了一套智能检测系统,实现了84%以上的检测精度和30FPS的实时处理速度。
这个系统最核心的价值在于:它把深度学习技术真正落地到了农业生产场景。通过自建的YOLO格式数据集和精心设计的PyQt5界面,即使是没有任何编程基础的质检员,也能快速上手使用。系统支持图片、视频和实时摄像头三种检测模式,还能自动生成检测报告,大幅提升了分拣效率。
提示:项目完整代码和预训练模型已开源,文末附获取方式。建议先收藏再阅读,因为接下来我会详细拆解每个技术环节的实现细节。
在目标检测领域,YOLO系列一直以速度快著称。最新发布的YOLOv12在保持实时性的基础上,进一步提升了小目标检测能力。我们对比测试了几种主流算法:
| 模型 | mAP@0.5 | 推理速度(FPS) | 模型大小(MB) |
|---|---|---|---|
| Faster R-CNN | 82.3% | 12 | 245 |
| SSD | 79.5% | 28 | 92 |
| YOLOv8 | 83.1% | 35 | 43 |
| YOLOv12 | 84.7% | 38 | 39 |
从数据可以看出,YOLOv12在精度和速度上都有优势。更重要的是,它的模型更小,部署成本更低。对于农业场景来说,这些特性都非常关键。
系统采用经典的MVC架构,分为三个主要模块:
这种分层设计使得系统易于维护和扩展。比如要更换检测模型,只需修改模型层的代码,其他部分基本不用动。
我们收集了超过5000张苹果图像,涵盖不同品种、光照条件和腐烂程度。标注工作使用LabelImg工具完成,只标注"damaged_apple"一个类别。
数据集按8:1:1的比例划分为:
为了提高模型泛化能力,我们采用了多种数据增强技术:
python复制# 在data.yaml中配置
augmentations:
- hsv_h: 0.015 # 色相抖动
- hsv_s: 0.7 # 饱和度调整
- hsv_v: 0.4 # 明度调整
- translate: 0.1 # 平移
- scale: 0.5 # 缩放
- flipud: 0.5 # 垂直翻转概率
- fliplr: 0.5 # 水平翻转概率
- mosaic: 1.0 # 马赛克增强
这些增强手段让模型能够适应各种实际场景,比如不同角度的苹果、部分遮挡等情况。
推荐使用以下配置进行训练:
创建conda环境的命令:
bash复制conda create -n yolov12 python=3.9
conda activate yolov12
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117
pip install ultralytics
我们使用YOLOv12s模型进行训练,主要参数配置如下:
python复制model = YOLO('yolov12s.pt') # 加载预训练模型
results = model.train(
data='data.yaml',
epochs=100,
batch=16, # 根据显存调整
imgsz=640,
device='0', # 使用GPU 0
workers=4,
optimizer='AdamW',
lr0=0.001,
weight_decay=0.05
)
关键参数说明:
batch: 越大训练越稳定,但需要更多显存imgsz: 输入图像尺寸,越大检测小目标效果越好optimizer: AdamW通常比SGD收敛更快lr0: 初始学习率,太大容易震荡,太小收敛慢训练过程中要重点关注三个指标:
我们使用TensorBoard来可视化训练过程:
bash复制tensorboard --logdir runs
典型的训练曲线如下:
为了避免界面卡顿,我们采用多线程设计,将检测任务放在子线程中执行:
python复制class DetectionThread(QThread):
frame_received = pyqtSignal(np.ndarray, np.ndarray, list)
def run(self):
while self.running:
# 执行检测
results = self.model(frame, conf=self.conf, iou=self.iou)
# 发送结果到主线程
self.frame_received.emit(original_frame, result_frame, detections)
主线程只需连接信号槽即可更新UI:
python复制self.detection_thread.frame_received.connect(self.update_ui)
UI采用PyQt5实现,主要特点包括:
关键UI组件代码:
python复制# 图像显示区域
self.original_image_label = QLabel()
self.result_image_label = QLabel()
# 结果表格
self.results_table = QTableWidget()
self.results_table.setColumnCount(4)
self.results_table.setHorizontalHeaderLabels(['类别', '置信度', 'X', 'Y'])
# 参数调节滑块
self.confidence_slider = QSlider(Qt.Horizontal)
self.confidence_slider.setRange(0, 100)
self.confidence_slider.valueChanged.connect(self.update_confidence)
检测流程的核心代码如下:
python复制def detect(self, image):
# 预处理
img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (640, 640))
# 执行推理
results = self.model(img, conf=self.conf_thres, iou=self.iou_thres)
# 后处理
boxes = results[0].boxes.xywh.cpu().numpy()
confidences = results[0].boxes.conf.cpu().numpy()
class_ids = results[0].boxes.cls.cpu().numpy().astype(int)
# 绘制结果
annotated_img = results[0].plot()
return annotated_img, boxes, confidences, class_ids
为了在边缘设备上部署,我们对模型进行了FP16量化:
python复制model.export(format='onnx', half=True, dynamic=False)
量化后模型大小从43MB减小到22MB,推理速度提升约15%。
python复制# 使用GPU加速的预处理
img = torch.from_numpy(img).to(self.device)
img = img.half() if self.half else img.float()
img = img / 255.0
python复制# 同时处理多帧图像
results = self.model([img1, img2, img3], batch_size=3)
python复制# 缓存模型加载
if self.model is None:
self.model = YOLO('yolov12s.pt')
在山东某苹果园部署后,系统表现:
在冷链仓库的应用效果:
问题:某些腐烂区域检测不到
解决方案:
问题:检测时界面响应慢
解决方案:
问题:提示模型文件损坏
解决方案:
这个项目最让我惊喜的是YOLOv12在小目标检测上的表现。在实际测试中,即使是直径只有2-3cm的腐烂斑点,模型也能准确识别。不过要注意,训练数据的质量直接影响最终效果 - 我们花了近一个月时间优化数据集。