在农业生产和食品加工领域,番茄成熟度检测一直是个重要但耗时的工作。传统的人工分拣方式效率低下且容易出错,而基于计算机视觉的自动化检测系统正逐渐成为解决方案。这个项目使用Python语言和YOLOv11模型,构建了一个能够实时检测番茄成熟度的系统,将目标分为成熟(ripe)、半成熟(semiripe)和未成熟(unripe)三类。
我选择YOLOv11作为基础模型有几个考量:首先,YOLO系列在目标检测领域有着优异的平衡性,兼顾速度和精度;其次,v11版本在保持轻量化的同时提升了小目标检测能力,非常适合农产品这种目标尺寸变化较大的场景。整个系统从数据准备到模型训练再到GUI界面开发,完整展示了如何将一个计算机视觉项目落地为实际可用的工具。
项目使用了包含1986张番茄图像的数据集,这些图像来自网络公开资源并经过人工标注。数据集按照成熟度分为三类:
数据集存储在项目目录的data/tomato文件夹中,对应的YAML配置文件data.yaml定义了数据路径和类别信息。典型的YOLO格式数据集结构如下:
code复制data/tomato/
├── images/
│ ├── train/
│ └── val/
├── labels/
│ ├── train/
│ └── val/
└── data.yaml
提示:在实际农业应用中,建议在不同光照条件、不同角度下采集图像,以增强模型的泛化能力。我发现在清晨和正午拍摄的样本组合使用效果最好。
为了提升模型鲁棒性,我们使用了torchvision和OpenCV进行数据增强:
python复制import cv2
from torchvision import transforms
train_transform = transforms.Compose([
transforms.ToPILImage(),
transforms.RandomHorizontalFlip(p=0.5),
transforms.RandomVerticalFlip(p=0.3),
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
这些变换模拟了实际场景中可能遇到的情况:
项目采用了Ultralytics实现的YOLOv11-nano版本(yolov11n.pt),这是一个轻量级模型,非常适合部署在普通计算设备上。模型结构上的主要改进包括:
预训练权重从官方仓库加载,这大大缩短了训练时间并提升了最终精度:
python复制from ultralytics import YOLO
model = YOLO('weights/yolov11n.pt') # 加载预训练权重
模型训练了200个epoch,关键参数配置如下:
yaml复制# 训练参数示例
lr0: 0.01 # 初始学习率
lrf: 0.1 # 最终学习率 = lr0 * lrf
momentum: 0.937
weight_decay: 0.0005
warmup_epochs: 3.0
warmup_momentum: 0.8
warmup_bias_lr: 0.1
训练过程中观察到几个关键现象:
注意:农业图像数据常存在类别不平衡问题。在这个项目中,半成熟样本较少,我通过调整loss权重(1.0:1.2:1.0)来解决这个问题。
为提高实时性,我对推理流程做了以下优化:
核心检测代码如下:
python复制def detect(image):
# 预处理
img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
img = preprocess(img).half().to(device)
# 推理
with torch.no_grad():
results = model(img)
# 后处理
detections = non_max_suppression(results, conf_thres=0.5, iou_thres=0.4)
return process_detections(detections)
系统界面包含以下功能模块:
界面布局采用QGridLayout,主要控件包括:
python复制class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("番茄成熟度检测系统")
self.setGeometry(100, 100, 1200, 800)
# 中央部件
central_widget = QWidget()
self.setCentralWidget(central_widget)
# 主布局
layout = QGridLayout(central_widget)
# 添加控件
self.image_label = QLabel()
layout.addWidget(self.image_label, 0, 0, 1, 2)
# ...其他控件初始化
为确保系统在不同平台上都能运行,我做了以下处理:
设备检测代码示例:
python复制def get_device():
if torch.cuda.is_available():
return torch.device('cuda')
elif torch.backends.mps.is_available(): # Apple Silicon
return torch.device('mps')
else:
return torch.device('cpu')
在NVIDIA GTX 1660 Ti上的测试结果:
问题现象:半成熟番茄被误判为成熟
解决方案:
问题现象:帧率低于20FPS
优化方法:
问题现象:强光下检测效果下降
改进方案:
经过多次实地测试,我总结了以下几点实用建议:
对于想要扩展功能的开发者,可以考虑:
这个项目完整展示了从数据准备到模型训练再到应用开发的整个流程,其中的方法和技巧同样适用于其他农产品质量检测场景。在实际部署时,建议先在小规模生产线上测试,根据具体环境调整参数后再全面推广。