作为一名长期从事农业AI应用的开发者,我深知水稻病害对粮食安全的威胁。传统人工诊断方式效率低下且依赖经验,而基于深度学习的视觉识别技术正逐渐改变这一现状。本项目构建了一个完整的水稻叶病害识别系统,核心功能包括:
系统采用PyTorch框架实现,模型训练准确率达到92.3%,视频检测帧率稳定在15FPS(测试环境:GTX 1660 Ti显卡)。特别设计了模拟无人机采集场景的视频处理模块,可直接应用于田间移动设备。
项目使用的数据集包含4类常见水稻病害:
数据特点:自然环境下拍摄,包含光照变化、叶片遮挡等真实场景干扰,图像分辨率统一调整为256×256像素。
通过hf.py脚本完成关键预处理步骤:
python复制# 示例核心预处理代码
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
# 数据集划分
total_size = len(dataset)
train_size = int(0.8 * total_size)
test_size = total_size - train_size
train_dataset, test_dataset = torch.utils.data.random_split(dataset, [train_size, test_size])
关键参数选择依据:
针对农业图像特点,采用以下增强组合:
实测发现:过度增强(如大角度旋转)会破坏病害形态特征,反而降低模型性能。
model.py中实现的自定义CNN结构:
python复制class CNN(nn.Module):
def __init__(self, num_classes=4):
super(CNN, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(32, 64, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
)
self.classifier = nn.Sequential(
nn.Dropout(p=0.5),
nn.Linear(64*56*56, 128),
nn.ReLU(inplace=True),
nn.Linear(128, num_classes),
)
def forward(self, x):
x = self.features(x)
x = torch.flatten(x, 1)
x = self.classifier(x)
return x
设计考量:
train.py中的关键训练参数:
| 参数 | 设置值 | 选择依据 |
|---|---|---|
| 优化器 | Adam | 自适应学习率适合非均衡数据 |
| 初始LR | 0.001 | 小数据集不宜过大 |
| Batch Size | 32 | 显存占用与梯度稳定的平衡 |
| Epochs | 50 | 早停策略实际在35轮收敛 |
| Loss函数 | CrossEntropy | 标准多分类选择 |
训练曲线分析:
python复制class_weights = torch.tensor([1.0, 1.2, 1.1, 1.3]) # 针对東格魯病毒样本较少
criterion = nn.CrossEntropyLoss(weight=class_weights)
python复制torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
python复制ema = ExponentialMovingAverage(model.parameters(), decay=0.999)
GUI_VEDIO.py采用Tkinter实现的多功能界面:

功能分区:
线程处理机制:
python复制class VideoThread(threading.Thread):
def run(self):
cap = cv2.VideoCapture(video_path)
while self._running:
ret, frame = cap.read()
if ret:
# 预处理帧并调用模型预测
img = preprocess(frame)
with torch.no_grad():
outputs = model(img)
# 更新GUI显示
self.update_signal.emit(outputs)
模拟无人机视频的vedio_creat.py工作流程:
GUI文件夹读取图像序列vedio.mp4供检测使用关键技术点:
predict.py中的核心改进:
python复制def predict_image(img_path):
img = Image.open(img_path)
img_t = transform(img).unsqueeze(0)
# 启用GPU加速
if torch.cuda.is_available():
img_t = img_t.cuda()
# 混合精度推理
with torch.cuda.amp.autocast():
outputs = model(img_t)
# 温度缩放校准
T = 1.2 # 通过验证集调整得到
probs = torch.softmax(outputs/T, dim=1)
return probs.cpu().numpy()
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 识别结果全部为同一类 | 类别不平衡导致模型偏向 | 调整class_weights重新训练 |
| 视频检测卡顿 | 主线程阻塞 | 确保视频处理在独立线程运行 |
| 内存泄漏 | OpenCV未释放资源 | 在finally块中添加cap.release() |
| 置信度始终低于0.5 | 输入数据分布偏移 | 检查预处理是否与训练一致 |
TensorRT加速:
bash复制trtexec --onnx=model.onnx --saveEngine=model.plan --fp16
推理速度提升3.2倍(测试环境:Jetson Nano)
多帧聚合策略:
python复制# 对连续5帧取移动平均
history = deque(maxlen=5)
history.append(current_pred)
final_pred = np.mean(history, axis=0)
视频检测稳定性提升约40%
模型量化:
python复制model = torch.quantization.quantize_dynamic(
model, {nn.Linear}, dtype=torch.qint8
)
模型体积减小65%,CPU推理速度提升2.1倍
python复制# 新数据增量训练
optimizer = torch.optim.SGD(model.parameters(), lr=0.0001)
for new_data in field_data:
loss = criterion(model(new_data), label)
loss.backward()
optimizer.step()
在实际部署到某水稻种植基地时,我们发现早晨露水反光会导致误检。通过添加偏振滤光片采集数据并重新训练,特定场景准确率从78%提升到89%。这个案例说明农业AI系统需要持续迭代以适应复杂环境。