去年夏天在老家菜园里,我亲眼目睹了邻居家整片番茄植株因病害绝收的场景。当时就在想,如果能开发一套自动识别病害的系统,或许能帮农户及时发现问题。这正是我选择"基于CNN的番茄叶病害识别"作为毕业设计的初衷。
这个项目的核心价值在于将深度学习技术落地到农业场景。传统病害识别依赖农技人员经验,而CNN(卷积神经网络)能够从叶片图像中自动提取特征,实现快速准确的病害分类。我在实验中验证过,训练好的模型对常见番茄叶部病害识别准确率能达到92%以上,远超人工肉眼判断的70%左右。
整个系统采用经典的"数据采集→模型训练→应用部署"流程:
python复制# 典型模型结构示例
class TomatoCNN(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 32, kernel_size=3)
self.pool = nn.MaxPool2d(2, 2)
self.fc1 = nn.Linear(32*16*16, 128)
self.fc2 = nn.Linear(128, 5) # 5种病害类型
选择CNN而非传统机器学习算法的原因:
使用PlantVillage公开数据集,包含:
重要提示:原始图像尺寸不统一,必须统一resize到256x256像素
为防止过拟合,采用实时数据增强:
python复制transform = transforms.Compose([
transforms.RandomRotation(30),
transforms.RandomHorizontalFlip(),
transforms.ColorJitter(brightness=0.2),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
经过多次调参验证的最佳配置:
使用TensorBoard记录关键指标:
bash复制tensorboard --logdir=runs
典型训练曲线显示:
测试了三种方案:
实际部署建议:如果算力允许,优先选择EfficientNet
为移动端部署进行的优化:
使用Flask构建的API接口:
python复制@app.route('/predict', methods=['POST'])
def predict():
img = request.files['image'].read()
img = Image.open(io.BytesIO(img))
tensor = transform(img).unsqueeze(0)
with torch.no_grad():
outputs = model(tensor)
_, pred = torch.max(outputs, 1)
return class_names[pred.item()]
在Android端的实现要点:
遇到验证集准确率停滞时的对策:
针对健康样本较多的情况:
python复制class_weights = torch.tensor([1.0, 1.5, 1.5, 1.8, 1.3])
criterion = nn.CrossEntropyLoss(weight=class_weights)
在实际测试中,我发现几个值得改进的点:
这个项目让我深刻体会到,好的AI应用需要兼顾算法精度和工程落地。有个小技巧分享:在数据增强时适当模拟田间拍摄条件(如添加光照变化、泥土斑点等噪声),能显著提升模型在实际场景的鲁棒性。