【YOLOv5水稻病虫害图像检测系统】
🚀 YOLOv5图像检测系统:从训练到Web部署全流程实战
📋 项目概述
基于YOLOv5的目标检测系统,结合Flask框架实现了一个完整的Web图像检测平台。该系统允许用户上传图片,通过深度学习模型进行实时推理,并将检测结果可视化展示。
技术选型
| 类别 | 技术栈 |
|---|---|
| 深度学习框架 | PyTorch + YOLOv5 |
| Web框架 | Flask 2.3.3 |
| 前端技术 | HTML5 + CSS3 + JavaScript |
| 图像处理 | OpenCV 4.8.1 |
| 模型特点 | CSP骨干网络 + 多尺度预测头,支持实时检测 |
系统架构图
用户浏览器
↓
Flask Web服务器 (Port 5000)
↓
YOLOv5检测模块
├── 模型加载 (best.pt)
├── 图像预处理 (letterbox缩放)
├── 模型推理 (CUDA/CPU)
├── NMS后处理
└── 结果绘制与编码
↓
返回base64编码图像至前端
🔧 核心实现详解
1. Flask后端服务
1.1 模型加载与预热
python
def load_model():
global model, stride, names, half, device
device = select_device('') # 自动选择CUDA或CPU
model = DetectMultiBackend(WEIGHTS, device=device)
stride, names, pt = model.stride, model.names, model.pt
# 启用FP16半精度加速
half = pt and device.type != 'cpu'
if pt:
model.model.half() if half else model.model.float()
# 模型预热
if pt:
imgsz = (IMGSZ, IMGSZ)
model.warmup(imgsz=(1, 3, *imgsz), half=half)
技术要点:使用half=True可在GPU上启用FP16推理,在几乎不损失精度的情况下,推理速度可提升30-50%。
1.2 图像预处理与检测核心
python
```python
def preprocess_image(image_bytes, target_imgsz=640, stride=32):
# 读取图像
nparr = np.frombuffer(image_bytes, np.uint8)
im0 = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
# letterbox填充(保持宽高比)
img = letterbox(im0, target_imgsz, stride=stride, auto=True)[0]
# 归一化与张量转换
img = img[:, :, ::-1].transpose(2, 0, 1) # BGR→RGB
img = torch.from_numpy(img).to(device).float() / 255.0
return img.unsqueeze(0), im0
def detect_image(image_bytes, conf_thres, iou_thres):
img, im0 = preprocess_image(image_bytes)
# 模型推理
pred = model(img)
# NMS后处理
pred = non_max_suppression(pred, conf_thres, iou_thres)
# 绘制检测框
annotator = Annotator(im0, line_width=2)
for *xyxy, conf, cls in pred[0]:
label = f'{names[int(cls)]} {conf:.2f}'
annotator.box_label(xyxy, label, color=colors(int(cls)))
# 返回base64编码的结果图像
return base64_encode(annotator.result()), detections_info
常见错误解决:
TypeError: ‘int’ object is not iterable → warmup需要传入(1, 3, imgsz, imgsz)形状元组
agnostic_nms参数名错误 → 新版YOLOv5使用agnostic参数名
- 前端界面优化与交互设计
2.1 现代化的CSS样式设计
前端采用了现代化设计语言,主要特点:
渐变背景:淡雅的蓝灰渐变营造专业感
毛玻璃卡片:透明效果+圆角边框+悬浮阴影
自定义文件上传:通过隐藏原生input + div实现统一视觉风格
响应式布局:移动端自动折叠为单栏布局
css
body {
background: linear-gradient(135deg, #f5f7fc 0%, #e9eef5 100%);
font-family: 'Inter', sans-serif;
}
.card {
background: rgba(255, 255, 255, 0.92);
border-radius: 32px;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.card:hover {
transform: translateY(-2px);
}
.btn-detect {
background: linear-gradient(95deg, #1f6392, #2c7da0);
border-radius: 40px;
transition: all 0.2s;
}
@media (max-width: 900px) {
.grid { grid-template-columns: 1fr; }
}
2.2 滑块实时数值显示
通过JavaScript监听滑动事件,实现实时反馈:
javascript
confSlider.addEventListener('input', function() {
confDisplay.textContent = this.value;
});
- 关键技术难点与解决方案
问题 原因 解决方案
左侧原图预览也显示检测框 annotator直接修改了原图变量 使用original_im0 = im0.copy()保存备份
检测结果每个字符间有逗号 前端模板错误使用了|join过滤器 直接使用{{ detections }}输出字符串
GPU显存溢出 输入图像尺寸过大 使用letterbox统一缩放到640×640,并通过stride对齐
🎨 界面效果展示
系统提供了清爽的左右分栏布局:
左侧控制区:图片上传、置信度/IOU阈值滑块、原图预览
右侧结果区:检测结果可视化、目标类别与数量展示
核心交互流程
点击上传按钮选择本地图片,文件名实时显示在自定义控件上
通过滑块调节置信度阈值(0-1),调节结果实时显示
点击“开始检测”按钮,系统自动调用YOLOv5进行推理
右侧显示带边界框和置信度的检测结果,左侧展示原图
检测结果区域会显示具体检测到的目标类别及个数
用户体验优化:检测过程中,用户仍可继续上传新图片或调节参数,整个交互无需等待页面刷新(后端返回后自动更新)。
基于YOLOv5的水稻病虫害智能检测系统
📊 实际检测效果
在自建水稻病害数据集上进行测试:
检测对象:Bacterialblight(白叶枯病)、Brown Spot(褐斑病)等水稻常见病害
检测性能:单张图片推理时间约 0.05-0.08秒(RTX 3070Ti GPU)
置信度分布:健康叶片阈值>0.9,早期病害约0.6-0.7
💡 置信度阈值调节技巧:
阈值过高(0.8+)→ 可能漏检早期轻微病害
阈值适中(0.5-0.7)→ 平衡误检与召回
阈值过低(<0.3)→ 可能引入较多误报
实际检测示例如下:
text
原图 → YOLOv5推理 → 检测结果
检测到:1 Bacterialblight(置信度0.69)
🔍 常见问题与排查指南
问题1:模型加载失败或显存不足
错误信息:CUDA out of memory 或 ModuleNotFoundError: No module named ‘models’
解决方案:
确保webapp.py位于YOLOv5项目根目录(与detect.py同级)
降低IMGSZ默认值(如从640改为512)
如果使用CPU模式,注释掉half相关代码
问题2:检测结果显示异常
现象A:左侧原图也出现了检测框
原因:annotator.result()直接修改了原始图像变量
解决:使用original_im0 = im0.copy()保存原始图像副本
现象B:检测结果字符间出现逗号(如1,B,a,c,t,)
原因:前端模板错误使用了join过滤器
解决:直接输出{{ detections }}即可
问题3:参数名不兼容
错误信息:non_max_suppression() got an unexpected keyword argument ‘agnostic_nms’
原因:不同YOLOv5版本的参数名不同(v6.0前用agnostic_nms,v6.1后用agnostic)
解决:
python
旧版本写法
**pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms)**
新版本写法
**pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic=False)**





📈 性能优化建议
模型层面
模型剪枝与量化:使用YOLOv5自带的–half参数启用FP16推理
输入尺寸优化:根据实际应用场景调整IMGSZ,水稻病害检测建议640×640足够
批处理:对于多图检测场景,可启用批处理模式而非逐张推理
部署层面
模型预热:启动时进行warmup,避免首次推理延迟
缓存机制:对于相同的图片,可考虑结果缓存避免重复计算
异步处理:对于大文件或批量任务,可采用Celery等任务队列异步处理
前端层面
图片压缩:前端上传前可进行适当压缩
懒加载:结果图片使用懒加载提升首屏性能
CDN加速:将静态资源(字体、图标库)部署到CDN
🌱 扩展思考:YOLOv5在农业病害检测中的应用前景
本系统虽以通用目标检测为原型,但经过简单调整即可应用于农作物病害检测领域。目前YOLOv5及改进模型在农业病害检测方面已展现出优异的性能:
实际应用案例
水稻病害检测:
中国农业科学院等单位的研究表明,改进的YOLOv5模型在稻田环境下对水稻病害的实时检测可达mAP 98.3%、召回率97.2%。另有研究在自建数据集上实现检测精确率94.2%,模型参数量仅8.1 MB。
多作物扩展:
目前已有项目构建了包含小麦、水稻等60余种作物病害的专属数据集,并成功部署于边缘计算设备(如Jetson Nano),实现农田现场的低功耗实时检测。
边缘计算适配:
针对农业场景的网络限制,业界已开发出基于ShuffleNetV2的轻量化YOLOv5变体,可在边缘设备上实现实时病害诊断。
💡 总结与展望
本文完整实现了一个基于YOLOv5+Flask的图像检测Web系统,通过这套方案,可以快速将深度学习模型部署为可交互的Web应用。相比传统的命令行工具,这套方案的优势在于:
可视化交互:无需记忆命令行参数,直接通过界面调节阈值
快速验证:上传图片即可看到检测结果,便于模型效果评估
易于扩展:可作为更复杂系统(如监控平台、API服务)的基础组件
未来优化方向
多模型切换:通过下拉菜单选择不同任务模型(病害/害虫/品种分类)
实时视频流检测:集成WebRTC实现摄像头实时检测
检测结果导出:支持JSON格式导出,便于后续数据分析
移动端适配:构建微信小程序或PWA应用,提升移动端体验
希望这篇文章能帮助到你!如果对实现细节有疑问,欢迎在评论区交流讨论~
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)