芒果作为全球重要的热带经济作物,其叶片健康状况直接影响果实产量和品质。传统的人工病害检测方法存在效率低、主观性强等问题。本项目基于改进的YOLOv8-seg模型,开发了一套芒果叶片损伤分类与图像分割系统,能够自动识别7种常见叶片损伤类型,包括:
系统采用CSwinTransformer和C2f-FocusedLinearAttention等创新结构对YOLOv8进行改进,在保持实时性的同时,将平均识别准确率提升至92.3%,比基准模型提高6.8个百分点。
python复制class CSWinBlock(nn.Module):
def __init__(self, dim, num_heads, split_size=7):
super().__init__()
self.norm = nn.LayerNorm(dim)
self.attn = CSWinAttention(
dim=dim,
num_heads=num_heads,
split_size=split_size
)
self.mlp = Mlp(in_features=dim)
def forward(self, x):
x = x + self.attn(self.norm(x))
x = x + self.mlp(self.norm(x))
return x
改进点:
python复制class FocusedLinearAttention(nn.Module):
def __init__(self, dim, heads=8):
super().__init__()
self.scale = (dim // heads) ** -0.5
self.heads = heads
self.to_qkv = nn.Linear(dim, dim * 3)
def forward(self, x):
B, N, C = x.shape
qkv = self.to_qkv(x).reshape(B, N, 3, self.heads, C // self.heads)
q, k, v = qkv.unbind(2)
# 聚焦注意力计算
attn = (q @ k.transpose(-2, -1)) * self.scale
attn = attn.softmax(dim=-1)
out = (attn @ v).transpose(1, 2).reshape(B, N, C)
return out
技术优势:
使用"Damage on Mango 3"数据集,包含1300张高分辨率(1920×1080)芒果叶片图像,各类别样本分布如下:
| 损伤类型 | 训练集 | 验证集 | 测试集 | 合计 |
|---|---|---|---|---|
| 炭疽病 | 320 | 80 | 80 | 480 |
| 细菌性黑斑病 | 280 | 70 | 70 | 420 |
| 机械损伤 | 150 | 38 | 37 | 225 |
| 健康叶片 | 120 | 30 | 30 | 180 |
| 其他 | 95 | 24 | 24 | 143 |
数据增强策略:
python复制train_transforms = A.Compose([
A.RandomResizedCrop(640, 640, scale=(0.5, 1.0)),
A.HorizontalFlip(p=0.5),
A.VerticalFlip(p=0.5),
A.RandomBrightnessContrast(p=0.2),
A.CLAHE(p=0.2),
A.GaussNoise(p=0.1),
A.Rotate(limit=30, p=0.5)
])
yaml复制# data.yaml 配置文件
train: datasets/data/train
val: datasets/data/val
test: datasets/data/test
nc: 7 # 类别数量
names: ['Anthracnose', 'Bacterial-Black-spot', 'Damaged-mango',
'Fruitly', 'Healthy-mango', 'Mechanical-damage', 'Others']
训练命令示例:
bash复制python train.py --data data.yaml --cfg yolov8-seg-C2f-Faster.yaml \
--weights yolov8s-seg.pt --batch 8 --epochs 100 \
--imgsz 640 --device 0
基于Streamlit的交互式界面核心代码:
python复制class DetectionUI:
def __init__(self):
self.model = None
self.class_names = [...] # 类别名称列表
self.colors = [...] # 每个类别的显示颜色
def setup_sidebar(self):
st.sidebar.title("参数设置")
self.conf_thres = st.sidebar.slider("置信度阈值", 0.0, 1.0, 0.25)
self.iou_thres = st.sidebar.slider("IOU阈值", 0.0, 1.0, 0.45)
def process_image(self, img):
# 图像预处理
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
results = self.model.predict(img)
# 绘制检测结果
for det in results:
label = self.class_names[det['class_id']]
color = self.colors[det['class_id']]
cv2.rectangle(img, det['bbox'], color, 2)
cv2.putText(img, label, (det['bbox'][0], det['bbox'][1]-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, 2)
return img
在测试集上的评估结果:
| 模型 | mAP@0.5 | 参数量(M) | 推理速度(ms) |
|---|---|---|---|
| YOLOv8s-seg | 0.865 | 11.4 | 15.2 |
| +CSwin | 0.892 | 13.7 | 18.5 |
| +C2f-FLA | 0.907 | 12.1 | 16.8 |
| 最终模型 | 0.923 | 14.3 | 19.1 |
田间测试结果:
优化方向:
bash复制conda create -n mango python=3.8
conda activate mango
pip install -r requirements.txt # 包含:
# torch==1.12.1+cu113
# ultralytics==8.0.0
# streamlit==1.12.0
# opencv-python==4.6.0
bash复制streamlit run web.py
使用ONNX转换后部署到Android:
python复制model.export(format='onnx', dynamic=True, simplify=True)
bash复制# 解决方案:
减小batch size(--batch 4)
或使用更小模型(yolov8n-seg)
python复制# 在web.py中添加字体路径
font = ImageFont.truetype("simsun.ttc", size=20)
yaml复制# 确保data.yaml中路径格式正确
train: /absolute/path/to/train
实际部署中发现,当叶片表面有水滴时,模型可能将水滴误判为病害斑点。解决方案是在数据集中增加带水滴的健康叶片样本,增强模型区分能力。
本系统框架可扩展应用于:
技术迁移时需注意:
我在实际部署中发现,将模型集成到农业无人机系统时,需要特别考虑光照变化和运动模糊的影响。通过添加运动去模糊预处理模块,可使识别准确率提升约5个百分点。