1. 项目概述
苹果花开花水平估计是果园精准管理的重要环节。传统的人工观察方法效率低下且主观性强,难以满足现代果园管理的需求。本研究提出了一种基于改进YOLO算法的苹果花开花水平估计方法,通过计算机视觉和深度学习技术实现自动化评估。
在苹果种植过程中,开花期的管理直接影响最终产量和果实品质。准确评估开花水平和密度对于疏花疏果、产量预测等农事操作至关重要。我们的方法能够识别苹果花从吐蕾期到落花期的六个生长阶段,并计算花密度分布,为果园管理提供数据支持。
2. 核心算法改进
2.1 YOLOv5模型优化
针对苹果花检测的特殊需求,我们对YOLOv5模型进行了三方面改进:
-
坐标注意力机制(CA):在骨干网络的CSP模块中嵌入CA模块,增强对小目标的特征提取能力。CA通过分别对高度和宽度方向进行特征编码,保留空间位置信息,使模型能够更准确地定位早期阶段的小花蕾。
-
Bi-FPN特征融合:用双向特征金字塔网络替代原始FPN结构。Bi-FPN通过添加额外的上下采样路径和加权特征融合,更好地整合不同尺度的特征信息。实验表明,这种改进使小目标检测精度提升约15%。
-
专用小目标检测头:在原有三个检测头基础上,增加一个更高分辨率的检测头(160×160),专门用于检测吐蕾期和簇球阶段的小目标。该检测头使用浅层特征图,保留更多空间细节信息。
2.2 U-Net分割网络改进
对于密度检测任务,我们在U-Net模型中引入以下改进:
-
ASPP模块:在编码器部分加入空洞空间金字塔池化模块,使用扩张率分别为6、12、18的空洞卷积,捕获多尺度上下文信息。这显著提高了模型对不同密度区域的适应能力。
-
深度信息辅助:利用ZED深度相机获取的深度图,构建背景掩码。通过设定距离阈值(1.5-3米),过滤掉远处的复杂背景,使模型专注于果树区域。
-
混合损失函数:采用交叉熵损失和Dice损失的组合(权重比1:1),既考虑像素级分类精度,又关注区域重叠度,特别适合处理花朵与背景类别不平衡的情况。
3. 数据集构建与处理
3.1 数据采集方案
我们在试验果园搭建了专业采集系统,包含:
- 索尼α7R IV全画幅相机(6100万像素)
- 曼富图三轴云台支架
- 环形补光灯(可调亮度)
- ZED 2深度相机
- 户外级工控机
采集考虑了多种实际场景:
- 不同品种(富士、嘎啦、红元帅)
- 不同树龄(3-8年生)
- 不同天气(晴、阴、多云)
- 不同光照条件(顺光、侧光、逆光)
- 全天不同时段(6:00-18:00)
3.2 数据标注规范
开花水平数据集采用YOLO格式标注,定义6个类别:
- 吐蕾期(Green Bud):花芽刚萌动,直径约2-3mm
- 簇球(Cluster):3-5个花芽聚集成簇,直径5-8mm
- 气球花(Balloon):花萼膨胀呈球状,直径8-12mm
- 王花绽开(King Bloom):中心花先开放,直径15-20mm
- 盛花(Full Bloom):80%以上花开放,直径20-25mm
- 落花(Petal Fall):花瓣开始脱落,花托膨大
密度检测数据集采用像素级标注,仅区分"花"和"背景"两类。标注时特别注意:
- 部分遮挡的花朵仍标注完整轮廓
- 模糊区域由3人交叉验证
- 使用Freelabel工具进行精细边缘修正
3.3 数据增强策略
为提高模型鲁棒性,我们设计了两阶段增强方案:
预处理阶段增强:
- 随机透视变换(幅度±15%)
- 色彩抖动(亮度±30%,对比度±25%,饱和度±20%)
- 添加高斯噪声(σ=0-0.05)
- 随机模糊(核大小3-7)
训练时动态增强:
- Mosaic增强:4图拼接
- MixUp:两图线性混合(α=0.5)
- CutOut:随机遮挡(最大20%面积)
- 随机HSV调整(hue±0.1, saturation±0.7, value±0.4)
最终数据集规模:
- 原始图像:3500张(开花水平)+2800张(密度)
- 增强后:8500张+6000张
- 标注工时:约400人小时
4. 系统实现细节
4.1 模型训练配置
YOLOv5训练参数:
- 输入尺寸:640×640
- 批量大小:16(受限于显存)
- 优化器:SGD(momentum=0.937)
- 初始学习率:0.01(cosine衰减)
- 训练周期:300
- 数据加载:8线程
- 硬件:RTX 3090×2
U-Net训练参数:
- 输入尺寸:512×512
- 批量大小:8
- 优化器:Adam(lr=0.001)
- 训练周期:200
- 损失函数:0.5×CE + 0.5×Dice
- 早停机制:patience=15
4.2 关键代码解析
坐标注意力实现要点:
python复制class CA(nn.Module):
def __init__(self, in_ch, ratio=32):
super().__init__()
self.pool_h = nn.AdaptiveAvgPool2d((None,1))
self.pool_w = nn.AdaptiveAvgPool2d((1,None))
mid_ch = max(8, in_ch//ratio)
self.conv1 = nn.Conv2d(in_ch, mid_ch, 1)
self.conv_h = nn.Conv2d(mid_ch, in_ch, 1)
self.conv_w = nn.Conv2d(mid_ch, in_ch, 1)
def forward(self, x):
h, w = x.shape[2], x.shape[3]
# 高度方向特征
x_h = self.pool_h(x) # [B,C,H,1]
# 宽度方向特征
x_w = self.pool_w(x).permute(0,1,3,2) # [B,C,W,1]
# 特征融合
y = torch.cat([x_h, x_w], dim=2) # [B,C,H+W,1]
y = self.conv1(y)
y = F.relu(y)
# 分离特征
x_h, x_w = torch.split(y, [h,w], dim=2)
x_w = x_w.permute(0,1,3,2)
# 生成注意力图
att_h = torch.sigmoid(self.conv_h(x_h))
att_w = torch.sigmoid(self.conv_w(x_w))
return x * att_h * att_w
Bi-FPN特征融合关键:
- 自顶向下路径:从P5→P3,逐步上采样融合
- 自底向上路径:从P3→P5,逐步下采样融合
- 加权融合公式:
code复制其中w1,w2为可学习权重,ε=1e-4防止除零Out = (w1*F1 + w2*F2)/(w1+w2+ε)
4.3 开花水平评估算法
我们设计了两级评估策略:
单图评估:
- 检测所有花朵并分类
- 统计各阶段花朵数量N_i
- 计算比例P_i = N_i / ΣN
- 若某P_i > 60%,判定为该阶段
- 否则,取前两占比阶段加权评估
时序分析:
- 构建KB(王花)+FB(盛花)比例曲线
- 使用Savitzky-Golay滤波平滑
- 检测曲线拐点作为关键期:
- 吐蕾期→簇球:曲线首次上升
- 盛花初期:KB曲线峰值
- 盛花高峰:FB曲线峰值
5. 实验结果与分析
5.1 性能指标
开花水平检测:
| 指标 | 原始YOLOv5 | 改进模型 |
|---|---|---|
| mAP@0.5 | 0.783 | 0.852 |
| 吐蕾期AP | 0.612 | 0.721 |
| 簇球AP | 0.685 | 0.763 |
| 气球花AP | 0.801 | 0.861 |
| 推理速度(FPS) | 56 | 48 |
密度检测:
| 指标 | 原始U-Net | 改进模型 |
|---|---|---|
| IoU | 0.791 | 0.843 |
| F1-score | 0.883 | 0.915 |
| 推理时间(ms) | 32 | 38 |
5.2 消融实验
验证各改进模块的效果:
| 模型配置 | mAP@0.5 | 参数量(M) |
|---|---|---|
| Baseline(YOLOv5s) | 0.783 | 7.2 |
| +CA | 0.812 | 7.9 |
| +Bi-FPN | 0.831 | 8.3 |
| +小目标头 | 0.839 | 9.1 |
| 完整模型 | 0.852 | 9.7 |
实验表明:
- CA模块对小目标检测提升最显著(+3.7% AP)
- Bi-FPN改善多尺度检测能力
- 小目标头使吐蕾期检测AP提升10.9%
5.3 实际应用测试
在3个果园实地测试结果:
| 果园 | 面积(亩) | 人工评估 | 系统评估 | 误差 |
|---|---|---|---|---|
| A | 50 | 盛花初期 | 盛花初期 | 0% |
| B | 80 | 簇球期 | 簇球向气球过渡 | 12% |
| C | 120 | 盛花高峰 | 盛花高峰 | 5% |
主要误差来源:
- 逆光条件下小花识别率下降
- 密集簇状花朵的分类偏差
- 新梢嫩叶的误识别
6. 部署优化建议
基于实际应用经验,给出以下部署建议:
-
边缘计算方案:
- 使用Jetson AGX Orin部署
- TensorRT加速,FP16精度
- 模型剪枝(通道剪枝率30%)
- 实测FPS可达22-25
-
移动端适配:
- 转换为TFLite格式
- 输入尺寸缩减为416×416
- 使用GPU Delegation
- 高端手机可达到15FPS
-
系统集成:
python复制class FlowerAnalysisSystem: def __init__(self): self.det_model = load_yolo() self.seg_model = load_unet() self.depth_processor = DepthProcessor() def process_frame(self, rgb_img, depth_img=None): # 深度处理 if depth_img is not None: mask = self.depth_processor.generate_mask(depth_img) rgb_img = cv2.bitwise_and(rgb_img, mask) # 检测与分割 det_results = self.det_model(rgb_img) seg_map = self.seg_model(rgb_img) # 分析处理 stage_stats = analyze_stages(det_results) density_map = compute_density(seg_map) return { 'stages': stage_stats, 'density': density_map, 'key_stage': get_key_stage(stage_stats) } -
持续优化方向:
- 知识蒸馏压缩模型
- 半监督学习利用未标注数据
- 多模态融合(结合近红外)
- 异常开花模式检测
在实际部署中,我们推荐采用周期性扫描+定点监测的组合策略。每排果树首尾各设一个监测点,配合果园巡检车进行全园扫描,既保证覆盖又控制成本。