🚀 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参数名

  1. 前端界面优化与交互设计
    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;
});
  1. 关键技术难点与解决方案
    问题 原因 解决方案
    左侧原图预览也显示检测框 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)**

四种水稻病害Precision/Confidence图
四种水稻病害F1/Confidence图
四种水稻病害Recall/Confidence图
训练过程中的loss图 指标图
四种水稻病害Precision/Recall图

📈 性能优化建议
模型层面
模型剪枝与量化:使用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应用,提升移动端体验

希望这篇文章能帮助到你!如果对实现细节有疑问,欢迎在评论区交流讨论~

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐