1. 项目背景与核心需求
这个毕业设计项目瞄准了城市交通管理中的痛点问题——交叉路口行人及非机动车流量统计。传统人工计数方式效率低下且误差率高,尤其在早晚高峰时段,数据采集人员很难准确记录快速通过的人流和车流。我们团队开发的这套系统,正是为了解决这一实际问题。
系统采用SpringBoot作为后端框架,配合Vue.js前端,实现了从数据采集到可视化分析的全流程功能。核心功能模块包括:
- 实时视频流处理与分析
- 运动目标检测与分类
- 流量数据统计与存储
- 多维数据可视化展示
提示:在实际交通场景中,行人和非机动车的运动轨迹具有高度随机性,这与机动车在固定车道行驶的特性截然不同,这也是本系统需要解决的技术难点之一。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术栈选型
后端采用SpringBoot 2.7.x版本,主要基于以下考虑:
- 自动配置特性大幅减少了XML配置
- 内嵌Tomcat简化部署流程
- 丰富的Starter依赖可快速集成常用组件
- 完善的监控机制便于后期维护
数据库选用MySQL 8.0,主要因为:
- 对JSON数据类型的良好支持
- 窗口函数等高级分析功能
- 与Spring Data JPA的无缝集成
2.2 微服务架构设计
系统采用分层架构设计:
code复制┌───────────────────────┐
│ 前端展示层 │ Vue.js + ECharts
├───────────────────────┤
│ API网关层 │ Spring Cloud Gateway
├───────────────────────┤
│ 业务逻辑层 │ SpringBoot + MyBatis
├───────────────────────┤
│ 数据存储层 │ MySQL + Redis
└───────────────────────┘
视频分析模块作为独立服务部署,通过gRPC与主系统通信,这种设计使得计算密集型任务不会影响主系统的响应速度。
3. 核心功能实现
3.1 视频流处理模块
采用OpenCV 4.5实现视频帧的实时处理:
java复制// 视频帧捕获示例代码
VideoCapture capture = new VideoCapture();
capture.open(rtspUrl);
Mat frame = new Mat();
while (capture.read(frame)) {
// 运动目标检测
Mat fgMask = new Mat();
backgroundSubtractor.apply(frame, fgMask);
// 形态学处理
Imgproc.morphologyEx(fgMask, fgMask, Imgproc.MORPH_OPEN, kernel);
// 轮廓检测
List<MatOfPoint> contours = new ArrayList<>();
Imgproc.findContours(fgMask.clone(), contours, hierarchy,
Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
}
3.2 目标分类算法
使用YOLOv4-tiny模型进行实时目标检测,相比标准YOLOv4模型,在保持较高准确率的同时,帧处理速度提升3倍以上,满足实时性要求。模型训练时采用了自建的10万张行人和非机动车标注数据集。
分类结果通过Kafka消息队列发送到统计模块,实现了解耦和流量削峰:
java复制@KafkaListener(topics = "traffic-objects")
public void processDetectionResult(String message) {
ObjectDetectionResult result = JSON.parseObject(message,
ObjectDetectionResult.class);
// 按时间窗口聚合统计
trafficStatsService.updateStats(result);
}
3.3 数据统计与分析
采用时间轮算法实现分钟级、小时级的滑动窗口统计:
sql复制-- 小时流量统计SQL示例
SELECT
DATE_FORMAT(create_time, '%Y-%m-%d %H:00:00') AS time_slot,
COUNT(CASE WHEN object_type = 'pedestrian' THEN 1 END) AS pedestrian_count,
COUNT(CASE WHEN object_type = 'bicycle' THEN 1 END) AS bicycle_count
FROM traffic_objects
WHERE create_time >= ? AND create_time < ?
GROUP BY time_slot
4. 系统特色功能
4.1 热力图可视化
基于ECharts GL实现三维热力图展示,直观反映不同时段的人车密集区域:
javascript复制option = {
series: [{
type: 'heatmapGL',
data: heatmapData,
pointSize: 5,
intensityScale: [0, 1],
gradient: {
0.1: '#2c7bb6',
0.5: '#abd9e9',
0.8: '#fdae61',
1.0: '#d7191c'
}
}]
};
4.2 异常流量预警
基于历史数据建立ARIMA时间序列模型,当实时流量偏离预测值超过2σ时触发预警:
python复制from statsmodels.tsa.arima.model import ARIMA
model = ARIMA(history_data, order=(5,1,0))
model_fit = model.fit()
forecast = model_fit.forecast(steps=1)[0]
if abs(current_value - forecast) > 2 * std_dev:
trigger_alert()
5. 部署与优化实践
5.1 性能调优经验
-
视频处理优化:
- 使用FFmpeg硬解码替代软解码
- 将OpenCV的UMat替换Mat减少内存拷贝
- 设置合理的ROI区域减少处理面积
-
数据库优化:
sql复制ALTER TABLE traffic_objects PARTITION BY RANGE (TO_DAYS(create_time)) ( PARTITION p202301 VALUES LESS THAN (TO_DAYS('2023-02-01')), PARTITION p202302 VALUES LESS THAN (TO_DAYS('2023-03-01')) ); -
缓存策略:
java复制@Cacheable(value = "hourlyStats", key = "#intersectionId.concat('-').concat(#hour)", unless = "#result == null") public TrafficStats getHourlyStats(String intersectionId, String hour) { // 数据库查询 }
5.2 容器化部署
使用Docker Compose编排服务:
yaml复制version: '3'
services:
video-processor:
image: opencv-java:4.5
deploy:
resources:
limits:
cpus: '2'
memory: 4G
volumes:
- ./models:/app/models
api-server:
image: springboot-app:1.0
ports:
- "8080:8080"
depends_on:
- redis
- mysql
6. 毕业设计扩展建议
-
数据增强方向:
- 添加天气因素对流量影响的分析
- 整合交通信号灯状态数据
- 结合手机信令数据验证准确性
-
算法优化方向:
- 试验YOLOv7-tiny模型
- 引入ReID技术追踪个体运动轨迹
- 使用Transformer-based模型改进小目标检测
-
工程化方向:
- 增加Kubernetes集群部署方案
- 实现Prometheus+Grafana监控
- 开发微信小程序实时查看功能
在项目开发过程中,我们特别注意到交叉路口的遮挡问题会导致检测准确率下降。通过引入多视角视频融合技术,将三个不同角度的摄像头数据联合分析,使漏检率从最初的15%降低到5%以下。这个改进点后来成为了论文的创新章节。
