基于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基础上进行了三项关键改进:
注意力机制增强: 在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())自适应锚框计算: 基于3000+道路缺陷样本重新聚类锚框参数:
原始锚框: (10,13)-(116,90)-(156,198) 优化后: (8,11)-(42,36)-(89,82)跨阶段特征融合: 在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优化前后对比:
| 指标 | FP32 | FP16 | INT8 |
|---|---|---|---|
| 推理速度(ms) | 22 | 15 | 11 |
| 显存占用(MB) | 1240 | 890 | 620 |
| mAP@0.5 | 92.3% | 92.1% | 91.4% |
4.2 高并发处理方案
采用多模型实例+消息队列的方案:
- 请求进入RabbitMQ队列
- Worker节点消费任务
- 结果存入Redis缓存
- 前端通过轮询获取结果
SpringBoot配置示例:
spring: rabbitmq: host: 192.168.1.100 port: 5672 username: admin password: xxxxxx redis: host: 192.168.1.101 database: 15. 实战问题与解决方案
5.1 典型错误案例
问题现象:夜间检测误报率高
- 根本原因:训练集缺乏低光照样本
- 解决方案:
- 添加Gamma校正预处理
- 合成夜间数据(使用CycleGAN)
- 在损失函数中增加难例挖掘权重
问题现象:长裂缝被分段检测
- 改进方法:
- 调整NMS参数(从0.45→0.6)
- 后处理中添加裂缝连接算法
def connect_cracks(detections): # 基于端点距离的裂缝连接逻辑 ...
5.2 模型迭代建议
推荐采用主动学习流程:
初始模型 → 标注疑难样本 → 模型微调 → 边缘部署 → 收集新数据关键工具链:
- 数据版本控制:DVC
- 模型监控:Prometheus + Grafana
- 自动化测试:Jenkins Pipeline
6. 扩展应用方向
本系统框架可延伸至:
- 桥梁裂缝检测(需调整锚框参数)
- 路面标线识别(修改类别定义)
- 交通设施损坏检测(扩展训练集)
在K230开发板上的部署效果:
- 输入分辨率:640×384
- 推理速度:18FPS
- 功耗:≤5W
对于需要更高精度的场景,建议:
- 使用YOLOv8m模型
- 增加红外摄像头输入
- 引入三维点云辅助判断
