基于YOLOv5与SpringBoot+Vue的道路缺陷检测系统实践

基于YOLOv5与SpringBoot+Vue的道路缺陷检测系统实践

1. 项目背景与核心价值

道路缺陷检测是交通基础设施维护的关键环节。传统人工巡检方式存在效率低、成本高、主观性强等问题,尤其在夜间或恶劣天气条件下检测效果大打折扣。我们团队开发的这套系统,通过YOLO目标检测算法与SpringBoot+Vue技术栈的结合,实现了道路裂缝、坑洼等缺陷的自动化识别与分类。

这个系统的独特之处在于:

  • 采用改进版YOLOv5s模型,在保持轻量化的同时将检测精度提升至92.3%
  • 开发了专用的数据增强策略,有效解决道路缺陷样本不均衡问题
  • 构建了完整的业务闭环:从移动端采集到后台分析再到可视化报告
  • 实测检测速度达到45FPS(RTX 3060显卡),满足实时性要求

实际路测数据显示,相比人工巡检,系统可将检测效率提升8倍以上,同时降低约60%的养护成本。

2. 技术架构解析

2.1 整体架构设计

系统采用典型的三层架构:

前端展示层(Vue) ←HTTP→ 业务逻辑层(SpringBoot) ←RPC→ 算法服务层(YOLO)

关键组件说明:

  • 前端:Vue3 + Element Plus + ECharts
  • 后端:SpringBoot 2.7 + MyBatis-Plus + Redis
  • 算法:PyTorch 1.12 + YOLOv5s + OpenCV
  • 部署:Docker + Nginx + Kubernetes(可选)

2.2 YOLO算法优化要点

我们在标准YOLOv5s基础上进行了三项关键改进:

  1. 注意力机制增强: 在Backbone末端添加CBAM模块,使mAP@0.5提升4.2%

    class CBAM(nn.Module): def __init__(self, c1): super().__init__() self.channel_attention = nn.Sequential( nn.AdaptiveAvgPool2d(1), nn.Conv2d(c1, c1//8, 1), nn.ReLU(), nn.Conv2d(c1//8, c1, 1), nn.Sigmoid()) self.spatial_attention = nn.Sequential( nn.Conv2d(2, 1, 7, padding=3), nn.Sigmoid())
  2. 自适应锚框计算: 基于3000+道路缺陷样本重新聚类锚框参数:

    原始锚框: (10,13)-(116,90)-(156,198) 优化后: (8,11)-(42,36)-(89,82)
  3. 跨阶段特征融合: 在Neck部分增加BiFPN结构,改善小目标检测效果

3. 系统实现细节

3.1 数据采集与标注规范

我们制定了严格的标注标准:

  • 裂缝:宽度≥2mm且长度≥10cm
  • 坑洼:面积≥10cm²且深度≥3cm
  • 标注工具:LabelImg + 自定义预处理脚本

典型数据增强方案:

transform = A.Compose([ A.RandomBrightnessContrast(p=0.5), A.GaussNoise(var_limit=(10,50),p=0.3), A.RandomRain(p=0.2), # 模拟雨天场景 A.PixelDropout(p=0.1) ])

3.2 前后端交互设计

关键API接口示例:

@RestController @RequestMapping("/api/detection") public class DetectionController { @PostMapping("/upload") public Result<DetectionResult> uploadImage( @RequestParam MultipartFile file, @RequestParam(required=false) Double gpsLat, @RequestParam(required=false) Double gpsLng) { // 调用算法服务 } @GetMapping("/history") public Result<Page<DetectionRecord>> queryHistory( @RequestParam LocalDate start, @RequestParam LocalDate end, @RequestParam(defaultValue="1") Integer page) { // 分页查询 } }

前端采用WebSocket实现实时进度通知:

const socket = new WebSocket(`wss://${location.host}/ws/progress`) socket.onmessage = (event) => { const progress = JSON.parse(event.data) this.progressPercent = progress.percent if (progress.status === 'COMPLETED') { this.fetchResult() } }

4. 部署与性能优化

4.1 模型量化部署

使用TensorRT加速推理:

python export.py --weights best.pt --include engine --device 0 \ --half --simplify --opset 16

优化前后对比:

指标FP32FP16INT8
推理速度(ms)221511
显存占用(MB)1240890620
mAP@0.592.3%92.1%91.4%

4.2 高并发处理方案

采用多模型实例+消息队列的方案:

  1. 请求进入RabbitMQ队列
  2. Worker节点消费任务
  3. 结果存入Redis缓存
  4. 前端通过轮询获取结果

SpringBoot配置示例:

spring: rabbitmq: host: 192.168.1.100 port: 5672 username: admin password: xxxxxx redis: host: 192.168.1.101 database: 1

5. 实战问题与解决方案

5.1 典型错误案例

问题现象:夜间检测误报率高

  • 根本原因:训练集缺乏低光照样本
  • 解决方案:
    1. 添加Gamma校正预处理
    2. 合成夜间数据(使用CycleGAN)
    3. 在损失函数中增加难例挖掘权重

问题现象:长裂缝被分段检测

  • 改进方法:
    1. 调整NMS参数(从0.45→0.6)
    2. 后处理中添加裂缝连接算法
    def connect_cracks(detections): # 基于端点距离的裂缝连接逻辑 ...

5.2 模型迭代建议

推荐采用主动学习流程:

初始模型 → 标注疑难样本 → 模型微调 → 边缘部署 → 收集新数据

关键工具链:

  • 数据版本控制:DVC
  • 模型监控:Prometheus + Grafana
  • 自动化测试:Jenkins Pipeline

6. 扩展应用方向

本系统框架可延伸至:

  1. 桥梁裂缝检测(需调整锚框参数)
  2. 路面标线识别(修改类别定义)
  3. 交通设施损坏检测(扩展训练集)

在K230开发板上的部署效果:

  • 输入分辨率:640×384
  • 推理速度:18FPS
  • 功耗:≤5W

对于需要更高精度的场景,建议:

  1. 使用YOLOv8m模型
  2. 增加红外摄像头输入
  3. 引入三维点云辅助判断