1. 项目背景与核心价值
城市道路病害检测这个课题,我三年前在市政部门做技术咨询时就深有体会。当时看到检测员顶着烈日,拿着记录本沿路步行检查裂缝和坑洼,效率低不说,漏检率还高达30%。现在用深度学习做自动化识别,准确率能到90%以上,这背后是计算机视觉技术实实在在的落地价值。
这个毕设项目巧妙地将PyQT的界面友好性和YOLOv5等算法的检测能力结合,解决了传统检测中的三个痛点:一是人工巡检成本高,二是病害分类主观性强,三是历史数据难以数字化管理。通过车载摄像头采集+AI实时分析,检测速度比人工提升20倍,且所有检测结果自动生成结构化报告。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计解析
2.1 整体技术栈选型
项目采用典型的三层架构:
- 前端:PyQT5(比Tkinter更专业的GUI框架)
- 算法层:YOLOv5s(轻量级目标检测模型)
- 后端:SQLite(嵌入式数据库)
选择YOLOv5而非Faster R-CNN的关键考量是:在1080P视频流上,YOLOv5s的推理速度能达到45FPS(GTX1660显卡),而Faster R-CNN只有8-10FPS。这对需要实时处理车载视频的场景至关重要。
2.2 核心算法改进点
原始YOLOv5在道路病害检测上存在两个问题:
- 小目标漏检(裂缝宽度<5mm)
- 类间相似度高(龟裂vs网状裂缝)
我们的改进方案:
- 修改anchors配置为
[4,6, 8,12, 16,24](适配窄长型裂缝) - 在head层添加SE注意力模块(提升特征区分度)
- 采用Focal Loss解决类别不平衡(正常路面占比90%+)
实测显示,改进后模型在自建数据集上的mAP@0.5从0.72提升到0.89。
3. 关键实现细节
3.1 数据采集与标注规范
建立了一套严谨的数据标准:
python复制病害类型 = {
'横向裂缝': {'min_length': 30cm, 'max_width': 3cm},
'纵向裂缝': {'min_length': 50cm, 'max_width': 5cm},
'龟裂': {'min_area': 20x20cm'},
'坑槽': {'min_depth': 2cm'}
}
使用LabelImg标注时需注意:
- 裂缝类:沿中线绘制矩形(保留方向信息)
- 坑槽类:标注外接多边形
- 每个样本至少包含3张不同光照条件的图像
3.2 PyQT界面核心功能实现
主界面采用QTabWidget设计,关键代码片段:
python复制class MainWindow(QMainWindow):
def __init__(self):
self.video_tab = VideoProcessTab() # 视频处理页
self.report_tab = ReportGenerateTab() # 报告生成页
tabs = QTabWidget()
tabs.addTab(self.video_tab, "实时检测")
tabs.addTab(self.report_tab, "报告管理")
# 状态栏显示推理耗时
self.statusBar().addPermanentWidget(QLabel("推理耗时: 0ms"))
特别处理了摄像头帧采集与模型推理的线程同步:
python复制class VideoThread(QThread):
frame_ready = pyqtSignal(np.ndarray)
def run(self):
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if ret:
self.frame_ready.emit(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
4. 模型训练与优化
4.1 数据增强策略
针对道路图像特点定制了增强方案:
yaml复制# data/augmentation.yaml
hsv_h: 0.015 # 轻微色调整
hsv_s: 0.7 # 增强饱和度(突出裂缝)
hsv_v: 0.4 # 降低亮度(模拟夜间)
degrees: 5 # 小幅旋转(车载视角微抖)
perspective: 0.0005 # 透视变换
mixup: 0.1 # 样本混合
4.2 训练参数配置
使用COCO预训练权重,关键训练参数:
bash复制python train.py --img 640 --batch 16 --epochs 100 \
--data road_defect.yaml --weights yolov5s.pt \
--hyp data/hyps/hyp.road.yaml \
--adam --patience 15
学习率采用余弦退火策略,初始lr=0.001,最终lr=0.0001。加入早停机制防止过拟合。
5. 典型问题与解决方案
5.1 漏检问题排查
现象:车载视频中横向裂缝检出率低
排查步骤:
- 检查标注质量 → 发现80%的横向裂缝标注宽高比>10:1
- 分析anchors → 原配置最大宽高比仅8:1
- 解决方案:
- 重计算anchors:
python utils/autoanchor.py --cfg yolov5s.yaml - 修改model.yaml中anchors为:
yaml复制anchors: - [5,6, 10,12, 20,24] # 更适配细长目标
- 重计算anchors:
5.2 界面卡顿优化
性能瓶颈分析:
- 使用py-spy工具发现90%时间消耗在
cv2.imshow() - 优化方案:
- 改用QPixmap显示替代OpenCV
- 降低预览分辨率(1280x720→640x360)
- 添加帧跳过机制(检测帧率>30fps时跳帧)
优化后界面响应延迟从300ms降至50ms。
6. 项目扩展方向
6.1 多模态数据融合
当前仅用视觉数据,可扩展:
- 激光雷达点云(检测深度>3cm的坑槽)
- 惯性测量单元(通过振动识别病害)
- GPS定位(精准记录病害位置)
6.2 边缘计算部署
使用TensorRT优化模型:
python复制# 转换ONNX模型
python export.py --weights best.pt --include onnx
# TensorRT优化
trtexec --onnx=best.onnx --fp16 --saveEngine=best.engine
在Jetson Xavier NX上测试,推理速度从45FPS提升到120FPS。
7. 答辩准备建议
7.1 演示技巧
- 对比演示:先播放人工检测视频,再展示系统自动检测效果
- 实时互动:用手机拍摄讲台地面,现场检测裂缝
- 数据可视化:用Matplotlib动态绘制准确率曲线
7.2 常见问题预判
Q:为什么不用语义分割?
A:分割模型(如UNet)在边缘设备上推理速度慢(<10FPS),且对裂缝这类细长目标效果不如检测模型。
Q:数据量不足怎么办?
A:采用生成对抗网络(GAN)合成数据。我们测试显示,加入20%的生成数据可使mAP提升7%。
