道路坑洼识别系统是一个基于Python深度学习的计算机视觉应用,旨在通过图像识别技术自动检测道路表面的坑洼缺陷。这个项目非常适合作为计算机视觉入门实践,也常被选作课程设计或毕业设计课题。
我在开发这个系统时,主要考虑了以下几个实际需求:
系统采用YOLOv5作为核心检测模型,配合Flask构建Web应用界面,实现了从图像上传到结果可视化的完整流程。下面我将详细介绍这个项目的技术实现细节和开发经验。
在模型选型阶段,我对比了几种主流方案:
最终选择YOLOv5的原因:
提示:对于课程设计项目,建议使用YOLOv5s(小型版本)平衡性能和资源消耗
系统采用B/S架构,分为三个主要模块:
code复制├── 前端界面 (HTML+CSS+JavaScript)
├── 后端服务 (Flask)
│ ├── 图像上传接口
│ ├── 模型推理接口
│ └── 结果存储接口
└── 深度学习模型 (YOLOv5)
├── 数据预处理
├── 模型推理
└── 后处理
这种分层设计的好处是:
优质的数据集是模型性能的基础。我使用了以下数据来源:
使用LabelImg工具进行标注,关键注意事项:
标注文件采用YOLO格式:
code复制<object-class> <x_center> <y_center> <width> <height>
为提高模型泛化能力,我采用了以下增强方法:
python复制# 示例增强配置(YOLOv5 data.yaml)
augmentations:
hsv_h: 0.015 # 色相增强
hsv_s: 0.7 # 饱和度增强
hsv_v: 0.4 # 明度增强
degrees: 10 # 旋转角度
translate: 0.1 # 平移
scale: 0.5 # 缩放
shear: 0.0 # 剪切
perspective: 0.001 # 透视变换
flipud: 0.0 # 上下翻转
fliplr: 0.5 # 左右翻转
推荐使用Google Colab Pro进行训练,配置示例:
bash复制# 安装依赖
!pip install -r requirements.txt # YOLOv5官方requirements
# 下载预训练权重
!wget https://github.com/ultralytics/yolov5/releases/download/v6.0/yolov5s.pt
yaml复制# hyp.scratch.yaml 部分参数
lr0: 0.01 # 初始学习率
lrf: 0.1 # 最终学习率 = lr0 * lrf
momentum: 0.937 # SGD动量
weight_decay: 0.0005 # 权重衰减
warmup_epochs: 3 # 热身epochs
warmup_momentum: 0.8 # 热身初始动量
warmup_bias_lr: 0.1 # 热身偏置学习率
使用TensorBoard监控训练过程:
bash复制tensorboard --logdir runs/train
重点关注以下指标:
自适应锚框计算:
python复制python utils/autoanchor.py --cfg models/yolov5s.yaml --data data/road.yaml
混合精度训练:
在训练命令中添加--amp参数
迁移学习:
使用--weights yolov5s.pt参数加载预训练权重
核心接口代码示例:
python复制from flask import Flask, request, jsonify
import cv2
import torch
app = Flask(__name__)
model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt')
@app.route('/predict', methods=['POST'])
def predict():
if 'file' not in request.files:
return jsonify({'error': 'No file uploaded'})
file = request.files['file']
img = cv2.imdecode(np.frombuffer(file.read(), np.uint8), cv2.IMREAD_COLOR)
results = model([img])
return jsonify({
'predictions': results.pandas().xyxy[0].to_dict('records'),
'rendered_img': base64.b64encode(results.render()[0]).decode('utf-8')
})
关键功能点:
使用HTML5的Canvas实现结果渲染:
javascript复制function drawPredictions(image, predictions) {
const canvas = document.getElementById('resultCanvas');
const ctx = canvas.getContext('2d');
canvas.width = image.width;
canvas.height = image.height;
ctx.drawImage(image, 0, 0);
predictions.forEach(p => {
ctx.strokeStyle = '#FF0000';
ctx.lineWidth = 2;
ctx.strokeRect(p.xmin, p.ymin, p.xmax-p.xmin, p.ymax-p.ymin);
ctx.fillStyle = '#FF0000';
ctx.font = '16px Arial';
ctx.fillText(`${p.name} ${p.confidence.toFixed(2)}`, p.xmin, p.ymin-5);
});
}
对于课程设计演示,推荐使用Flask+Ngrok快速部署:
bash复制# 安装ngrok
npm install -g ngrok
# 启动Flask服务
python app.py
# 在另一个终端启动ngrok
ngrok http 5000
使用Docker容器化:
dockerfile复制FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"]
模型量化加速:
python复制model = torch.quantization.quantize_dynamic(
model, {torch.nn.Linear}, dtype=torch.qint8
)
启用GPU加速:
python复制device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
问题1:损失不下降
问题2:过拟合
问题1:推理速度慢
--half参数启用半精度推理问题2:内存不足
--img-size降低输入分辨率在我的测试环境中(RTX 3060),优化前后的对比:
| 优化措施 | 推理时间(ms) | 内存占用(MB) |
|---|---|---|
| 原始模型 | 120 | 1500 |
| 半精度 | 65 | 800 |
| 量化后 | 45 | 500 |
| ONNX运行时 | 30 | 400 |
视频流处理:
使用OpenCV读取RTSP流,实现实时检测
移动端部署:
将模型转换为TFLite格式,开发Android应用
三维坑洼测量:
结合深度相机获取三维信息,估算坑洼体积
道路状况评估系统:
建立评分体系,定期生成道路健康报告
在实际开发过程中,我发现数据质量对最终效果的影响远大于模型选择。建议在数据收集和标注阶段投入足够精力,这是提升识别精度的关键。另外,对于课程设计项目,不必追求最先进的模型,而应该更关注完整系统的实现和可演示性。