1. 项目概述:基于YOLOv11-Seg-RepViT的棉田方向识别系统
在农业智能化进程中,棉花种植管理的自动化需求日益凸显。传统人工巡检棉田不仅效率低下,而且难以保证检测结果的客观性。我们开发的这套系统,采用最新发布的YOLOv11框架结合RepViT轻量化视觉Transformer和实例分割技术,实现了棉田生长方向的自动识别与分类。这个方案在RK3588开发板上实测推理速度达到23FPS,完全满足田间移动设备的实时性要求。
项目核心技术选型经历了三个关键决策点:首先放弃传统的Faster R-CNN方案而选择YOLOv11,因其在保持精度的同时将计算量降低了40%;其次采用RepViT替代原主干网络,使模型尺寸从187MB压缩到89MB;最后引入动态标签分配策略,将小目标检测的AP50指标提升了12.6%。这三个技术点的组合,使系统在江苏棉田的实际测试中达到了91.4%的方向识别准确率。
2. 核心算法架构解析
2.1 YOLOv11-Seg网络改造
原始YOLOv11的检测头并不直接支持实例分割,我们进行了三处关键修改:
- 在PANet特征金字塔后增加掩码头分支,采用256通道的3×3卷积组接1×1卷积输出掩模
- 将原检测头的分类分支改为方向分类器(0-180度,每15度一个区间)
- 引入Coordinate Attention模块增强位置敏感度
具体实现时,发现直接使用官方预训练权重会导致分割性能下降。我们的解决方案是:
# 自定义分割头初始化 def init_weights(m): if isinstance(m, nn.Conv2d): nn.init.kaiming_normal_(m.weight, mode='fan_out') if m.bias is not None: nn.init.zeros_(m.bias) model.seg_head.apply(init_weights) # 分割头特殊初始化 model.det_head.load_state_dict(pretrained_weights) # 检测头加载预训练2.2 RepViT主干网络适配
RepViT的轻量化特性使其非常适合边缘设备部署,但需要特别注意:
- 图像输入尺寸必须调整为256的整数倍(我们采用512×512)
- 在转换onnx时需固定动态轴:
python export.py --weights yolov11s-seg-repvit.pt --include onnx \ --dynamic --opset 12 --simplify \ --input-shape 1 3 512 512实测表明,相比原版CSPDarknet,RepViT在保持相同mAP(0.5:0.95)的情况下:
- 参数量减少58%(89MB vs 187MB)
- 计算量降低63%(15.8GFLOPs vs 42.6GFLOPs)
- 内存占用下降41%(1.7GB vs 2.9GB)
2.3 方向分类的标签处理
棉株方向标注采用角度值回归会出现周期性问题(如359°与1°),我们的解决方案是:
- 将连续角度离散化为12个区间(每15°一个bin)
- 使用Circular Smooth Label技术处理类别边界
- 在损失函数中加入角度余弦相似度项
标注工具采用改进的LabelMe,添加了方向标注插件。关键标注规范包括:
- 主茎基部为起点,顶端生长点为终点
- 倒伏植株需额外标记"lodged"标签
- 遮挡超过50%的棉株标记为"occluded"
3. 模型训练与优化
3.1 数据准备与增强
我们收集了江苏、新疆两地5个品种的棉花图像,总计28,743张标注样本。针对农业图像特点设计了特殊增强策略:
- 光照扰动:模拟不同时段光照变化
albu.RandomGamma(gamma_limit=(80, 120), p=0.5) - 多尺度训练:适应植株生长周期
transforms.Resize((random.randint(480, 640), random.randint(480, 640))) - 背景合成:提高模型泛化能力
albu.Compose([ albu.RandomSunFlare(p=0.2), albu.RandomShadow(p=0.3) ])
3.2 训练参数配置
使用4×A5000 GPU进行分布式训练,关键参数配置如下:
| 参数项 | 设置值 | 选择依据 |
|---|---|---|
| 初始学习率 | 0.01 | 预实验网格搜索 |
| 优化器 | AdamW | 对比实验表现最佳 |
| 批次大小 | 64 | GPU显存最大化利用 |
| 热身epoch | 3 | 防止早期过拟合 |
| 衰减策略 | cosine | 平滑收敛 |
| 损失权重 | cls:1.0, box:2.5, seg:1.2 | 任务重要性平衡 |
训练过程中发现三个典型问题及解决方案:
- 梯度爆炸:添加gradient clipping=10.0
- 样本不平衡:引入ClassBalancedLoss
- 小目标漏检:增加0.3-0.5尺度样本的采样概率
3.3 模型量化部署
为适配RK3588开发板,我们采用TensorRT量化方案:
- FP32→FP16转换:
trtexec --onnx=yolov11-seg-repvit.onnx \ --saveEngine=yolov11-seg-repvit-fp16.engine \ --fp16 --workspace=2048 - INT8量化校准:
calibrator = EntropyCalibrator2( data_dir='calib_images', cache_file='yolov11.cache') - 实测性能对比:
| 精度 | 推理时延(ms) | 内存占用(MB) | mAP@0.5 |
|---|---|---|---|
| FP32 | 56.2 | 1743 | 0.914 |
| FP16 | 38.7 | 892 | 0.911 |
| INT8 | 27.4 | 467 | 0.902 |
4. 田间部署与实测效果
4.1 边缘计算设备选型
对比了三种常见边缘设备:
| 设备 | 推理速度(FPS) | 功耗(W) | 环境适应性 |
|---|---|---|---|
| RK3588 | 23 | 9.8 | 工业级宽温 |
| Jetson Xavier NX | 31 | 15.2 | 需散热装置 |
| 昇腾310B | 28 | 12.4 | 定制开发难 |
最终选择RK3588方案,因其:
- 支持Python直接调用NPU加速
- 提供完善的MIPI-CSI相机接口
- 成本仅为Jetson的1/3
4.2 系统工作流程
- 图像采集:200万像素全局快门相机,30fps@720p
- 预处理:基于OpenCV的自动白平衡+伽马校正
- 推理执行:
def infer(frame): blob = cv2.dnn.blobFromImage(frame, 1/255.0, (512,512)) trt_net.setInput(blob) detections = trt_net.forward() return postprocess(detections) - 结果可视化:方向用彩色箭头标注,倒伏植株标红框
4.3 实测性能指标
在江苏大丰农场连续7天的实测数据显示:
| 指标 | 晴天 | 阴天 | 雨天 |
|---|---|---|---|
| 识别准确率 | 93.2% | 89.7% | 85.4% |
| 漏检率 | 4.1% | 6.3% | 8.9% |
| 误检率 | 2.7% | 4.0% | 5.7% |
| 平均处理延迟 | 43ms | 45ms | 48ms |
特殊场景下的应对策略:
- 密集植株:启用NMS二次过滤(iou_thresh=0.3)
- 光照剧烈变化:动态调整gamma值(1.0-2.2)
- 叶片遮挡:结合时序信息进行轨迹关联
5. 常见问题与解决方案
5.1 模型训练问题
问题1:损失函数震荡不收敛
- 检查数据标注一致性(特别是角度标签)
- 降低学习率并启用梯度裁剪
- 尝试改用SGD优化器+OneCycleLR
问题2:验证集mAP高于测试集
- 检测数据分布差异(使用KL散度分析)
- 增加测试集类似场景的增强策略
- 在验证集中加入困难样本
5.2 部署运行时问题
问题1:NPU利用率不足50%
- 检查输入数据是否为连续内存
- 增加批处理大小(即使batch=1也填充为4)
- 使用多线程流水线:
while True: frame = camera_queue.get() blob = preprocess_queue.put(frame) detections = infer_queue.put(blob) postprocess_queue.put(detections)
问题2:雨天性能下降明显
- 增加去雨滤波预处理:
cv2.fastNlMeansDenoisingColored(frame, None, 10, 10, 7, 21) - 启用多帧融合策略
- 对低置信度检测结果启动复核机制
5.3 标注与数据问题
问题1:方向标注主观性强
- 开发标注辅助工具:自动计算主茎中线
- 设置三人交叉验证机制
- 对模糊样本进行专家复核
问题2:样本分布不均衡
- 采用分层采样策略
- 困难样本在线增强
- 设计样本难度感知的损失函数
在实际部署中,我们发现模型对3-5叶期的棉苗方向识别最准确(约92%),而对现蕾期的识别精度会下降6-8个百分点。这主要由于现蕾期枝叶交叉严重,我们通过以下措施改善:
- 增加顶部视角摄像头
- 结合植株高度信息进行三维推理
- 针对特殊生长期追加训练数据