基于YOLOv11的智慧农业作物识别系统开发实践
·
1. 项目背景与核心价值
在智慧农业领域,准确识别田间作物和杂草是实现精准农业的关键环节。传统人工识别方式效率低下且成本高昂,而基于深度学习的视觉检测技术为解决这一问题提供了新思路。本项目采用YOLOv11目标检测算法结合PyQt5可视化界面,构建了一套高效、易用的农作物识别系统。
这套系统的核心价值体现在三个方面:
- 多类别识别能力:支持蓝草、藜、刺菜等11类常见农作物的准确识别
- 灵活的检测模式:可处理静态图片、视频流和实时摄像头输入
- 用户友好界面:通过PyQt5实现了直观的操作界面,降低技术使用门槛
提示:在实际农田环境中,作物与杂草的形态相似度高,且受光照、遮挡等因素影响大,这对模型的鲁棒性提出了较高要求。YOLOv11在精度和速度上的平衡使其特别适合此类应用场景。
2. 系统架构设计解析
2.1 技术选型依据
选择YOLOv11作为核心检测算法主要基于以下考量:
- 实时性需求:相比两阶段检测器,单阶段的YOLO系列在保持较高精度的同时,推理速度更快
- 小目标检测:农田场景中作物幼苗和杂草通常只占图像小部分区域,YOLOv11的FPN+PAN结构能更好捕捉小目标特征
- 部署便利性:Ultralytics提供的统一API简化了训练和推理流程
PyQt5作为GUI框架的优势:
- 跨平台兼容性:可在Windows/Linux/macOS等系统运行
- 丰富的组件库:提供各种可视化控件和布局管理器
- Python生态集成:与NumPy、OpenCV等科学计算库无缝衔接
2.2 系统工作流程

- 输入处理层:支持多种数据源接入(图片/视频/摄像头)
- 核心推理层:YOLOv11模型进行特征提取和预测
- 结果展示层:可视化检测结果和统计信息
- 用户交互层:提供参数调整和功能控制接口
3. 环境配置与数据准备
3.1 开发环境搭建
推荐使用conda创建隔离的Python环境,避免依赖冲突:
# 创建Python 3.9环境
conda create -n yolo11_crops python=3.9
conda activate yolo11_crops
# 安装PyTorch(根据CUDA版本选择)
pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118
# 安装其他依赖
pip install ultralytics pyqt5 opencv-python pandas matplotlib seaborn
注意:CUDA版本需要与显卡驱动匹配。可通过
nvidia-smi命令查看支持的CUDA版本。若无GPU设备,可安装CPU版本的PyTorch,但推理速度会显著下降。
3.2 CWC数据集处理
CWC数据集包含11类农作物的标注数据,需要转换为YOLO格式:
CWC_Dataset/
├── images/
│ ├── train/ # 训练集图片
│ └── val/ # 验证集图片
└── labels/
├── train/ # 训练集标签
└── val/ # 验证集标签
标签文件为.txt格式,每行表示一个标注对象:
<class_id> <x_center> <y_center> <width> <height>
创建数据集配置文件 crops_cwc.yaml :
train: ./CWC_Dataset/images/train
val: ./CWC_Dataset/images/val
nc: 11
names: ['Blue_grass', 'Lambsquarters', 'Thistle', 'Corn', 'Sedge',
'Cotton', 'Nightshade', 'Tomato', 'Velvet', 'Lettuce', 'Radish']
4. 模型训练与优化
4.1 基础训练配置
使用Ultralytics提供的训练接口:
from ultralytics import YOLO
# 加载预训练模型
model = YOLO('yolov11n.pt') # 使用nano版本平衡速度和精度
# 开始训练
results = model.train(
data='crops_cwc.yaml',
epochs=150,
batch=32,
imgsz=640,
device='0', # 使用GPU 0
optimizer='AdamW',
lr0=0.001,
augment=True, # 启用数据增强
patience=20 # 早停机制
)
关键训练参数说明:
batch:根据GPU显存调整,RTX 3060建议设为32augment:启用Mosaic、MixUp等增强策略,提升模型泛化能力patience:验证指标连续不提升时提前终止训练
4.2 模型性能优化技巧
- 锚框聚类:针对农作物尺寸重新计算锚框
from utils.autoanchor import kmean_anchors
anchors = kmean_anchors('crops_cwc.yaml', 9, 640, 5.0, 1000, True)
- 分类权重调整:对样本不平衡的类别设置不同权重
cls_weights = [1.0, 1.2, 1.5, 1.0, 1.0, 1.0, 1.3, 1.0, 1.0, 1.0, 1.0] # 对应11个类别
model.train(..., cls_pw=cls_weights)
- 学习率调度:采用余弦退火策略
model.train(..., lr_scheduler='cosine')
5. PyQt5界面开发详解
5.1 主界面设计
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("农作物识别检测系统")
self.setGeometry(100, 100, 1200, 800)
# 加载训练好的模型
self.model = YOLO('runs/train/crops_exp/weights/best.pt')
# 初始化UI
self.init_ui()
self.init_variables()
核心界面组件:
- 视频显示区域:QLabel显示检测结果
- 控制面板:文件选择、摄像头开关等按钮
- 参数调节:置信度和IoU阈值滑动条
- 结果表格:显示检测到的类别和置信度
5.2 检测功能实现
图片检测核心逻辑:
def detect_image(self, img_path):
# 推理
results = self.model.predict(
source=img_path,
conf=self.conf_slider.value()/100,
iou=self.iou_slider.value()/100
)
# 结果可视化
result_img = results[0].plot()
# 显示处理
height, width, _ = result_img.shape
bytes_per_line = 3 * width
q_img = QImage(result_img.data, width, height,
bytes_per_line, QImage.Format_RGB888).rgbSwapped()
self.video_label.setPixmap(QPixmap.fromImage(q_img))
# 更新结果表格
self.update_result_table(results[0])
实时视频检测采用QTimer定时器:
def start_camera(self):
self.cap = cv2.VideoCapture(0) # 打开默认摄像头
self.timer = QTimer(self)
self.timer.timeout.connect(self.update_frame)
self.timer.start(30) # 约30fps
def update_frame(self):
ret, frame = self.cap.read()
if not ret:
return
# 推理
results = self.model.predict(
source=frame,
conf=self.conf_slider.value()/100,
iou=self.iou_slider.value()/100,
stream=True # 减少内存开销
)
# 显示结果
self.display_image(results[0].plot())
6. 系统部署与性能优化
6.1 模型导出与加速
将训练好的模型导出为ONNX格式:
model.export(format='onnx', dynamic=True, simplify=True)
使用TensorRT加速:
trtexec --onnx=yolov11_crops.onnx --saveEngine=yolov11_crops.trt
6.2 应用打包
使用PyInstaller生成可执行文件:
pyinstaller -F -w -i icon.ico --add-data "best.pt;." main_window.py
打包注意事项:
- 模型文件需通过
--add-data参数包含 - 使用
-w参数隐藏控制台窗口 - 最终打包体积较大,建议使用UPX压缩
7. 实际应用中的问题与解决方案
7.1 常见问题排查
- 检测结果不稳定
- 调整置信度阈值(推荐0.25-0.5)
- 检查训练数据标注质量
- 增加验证集样本多样性
- 小目标漏检
- 减小模型下采样倍数
- 使用更高分辨率输入(如1280x1280)
- 添加小目标专用检测头
- 类别混淆
- 检查相似类别的训练样本数量
- 采用Focal Loss缓解类别不平衡
- 添加难例样本重新训练
7.2 性能优化记录
测试环境:RTX 3060 + i7-11800H
| 优化措施 | 推理速度(FPS) | mAP@0.5 |
|---|---|---|
| 原始YOLOv11n | 142 | 0.873 |
| + TensorRT | 217 | 0.870 |
| + 半精度推理 | 305 | 0.868 |
| + 动态分辨率 | 185-350 | 0.865 |
8. 项目扩展方向
- 移动端部署
- 将模型转换为TFLite格式,部署到Android/iOS设备
- 使用Flutter开发跨平台应用界面
- 功能增强
- 添加面积计算功能,统计作物覆盖率
- 集成GPS模块,建立农田病害分布地图
- 增加历史记录查询功能
- 模型改进
- 引入注意力机制提升小目标检测能力
- 使用知识蒸馏压缩模型大小
- 尝试视觉Transformer架构
在实际部署中,我发现田间光照变化对检测效果影响较大。通过添加随机亮度调整的数据增强,模型鲁棒性提升了约15%。另外,将置信度阈值设置为动态可调非常必要,因为不同作物生长阶段的识别难度差异很大。
更多推荐




所有评论(0)