1. 项目背景与核心需求
交叉路口作为城市交通的重要节点,其行人及非机动车流量数据对于交通规划、信号灯配时优化、道路安全评估具有关键价值。传统的人工计数方式效率低下且误差较大,而基于计算机视觉的自动化统计系统往往成本高昂。本系统采用SpringBoot+大数据技术栈,实现了低成本、高精度的流量调查统计分析方案。
在实际交通管理工作中,我们经常面临几个典型痛点:
- 早晚高峰时段人工统计难以持续
- 不同方向的行人/非机动车混行难以区分
- 历史数据缺乏有效存储和分析手段
- 统计报表生成效率低下
这个毕业设计项目正是针对这些痛点,开发了一套完整的解决方案。系统通过前端传感器采集原始数据,后端进行实时处理和分析,最终生成可视化的统计报表。特别适合作为交通工程、计算机相关专业的课程设计或毕业设计选题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体技术栈选型
系统采用经典的三层架构设计:
code复制表示层:Thymeleaf + Bootstrap
业务层:SpringBoot 2.7 + MyBatis
数据层:MySQL + Hadoop(历史数据)
选择SpringBoot而非传统SSM框架主要基于以下考虑:
- 自动配置特性大幅简化了大数据组件的集成
- 内嵌Tomcat便于部署到各类环境
- Starter机制方便扩展功能模块
- 完善的监控端点便于系统维护
2.2 大数据处理方案
针对流量数据的时序特性,我们设计了分层存储策略:
- 热数据(7天内):MySQL集群
- 温数据(1年内):HDFS + Hive
- 冷数据(1年以上):HBase
具体到表结构设计,核心的流量记录表包含以下关键字段:
sql复制CREATE TABLE traffic_flow (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
intersection_id VARCHAR(20) NOT NULL,
direction ENUM('N','S','E','W') NOT NULL,
object_type ENUM('PEDESTRIAN','BICYCLE','EBIKE') NOT NULL,
count INT DEFAULT 1,
record_time DATETIME(3) NOT NULL,
weather_condition VARCHAR(20),
INDEX idx_time (record_time),
INDEX idx_intersection (intersection_id)
) ENGINE=InnoDB;
3. 核心功能实现
3.1 数据采集模块
系统支持多种数据接入方式:
- 视频分析接入:通过OpenCV处理RTSP视频流
- 地磁传感器:解析Modbus TCP协议数据
- 手动录入:提供Excel模板导入
以视频分析为例,核心处理流程如下:
java复制// 伪代码示例
@Async
public void processVideoStream(String rtspUrl) {
VideoCapture capture = new VideoCapture(rtspUrl);
Mat frame = new Mat();
while (capture.read(frame)) {
// 使用背景减除算法检测运动物体
Mat fgMask = new Mat();
backgroundSubtractor.apply(frame, fgMask);
// 基于YOLOv3模型进行目标分类
List<Detection> detections = yoloModel.detect(frame);
// 过滤出行人和非机动车
detections.stream()
.filter(d -> d.getLabel().matches("person|bicycle"))
.forEach(this::countObject);
}
}
3.2 实时统计分析
系统采用时间窗口机制进行实时统计:
java复制@Scheduled(fixedRate = 300000) // 5分钟一个统计窗口
public void calculateStatistics() {
// 获取当前时间窗口内的原始数据
LocalDateTime end = LocalDateTime.now();
LocalDateTime start = end.minusMinutes(5);
List<FlowRecord> records = flowMapper.selectByTimeRange(start, end);
// 按方向和类型分组统计
Map<String, Map<String, Integer>> stats = records.stream()
.collect(groupingBy(
FlowRecord::getDirection,
groupingBy(FlowRecord::getObjectType, summingInt(FlowRecord::getCount))
));
// 存入统计结果表
stats.forEach((direction, typeMap) -> {
typeMap.forEach((type, count) -> {
statisticMapper.insert(new Statistic(direction, type, count, start, end));
});
});
}
4. 数据可视化实现
4.1 ECharts集成方案
系统采用ECharts实现动态可视化,核心配置包括:
- 热力图:展示不同时段各方向的流量密度
- 折线图:显示流量随时间的变化趋势
- 饼图:展示不同类型交通参与者的比例
前端与后端的交互采用WebSocket实现实时更新:
javascript复制const socket = new SockJS('/flow-websocket');
const stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
stompClient.subscribe('/topic/statistics', function(message) {
const data = JSON.parse(message.body);
updateCharts(data);
});
});
4.2 自定义报表生成
基于Apache POI实现Excel报表导出功能:
java复制public void exportStatistics(HttpServletResponse response,
LocalDate startDate, LocalDate endDate) throws IOException {
// 创建Excel工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("流量统计");
// 设置表头
String[] headers = {"日期", "时段", "方向", "行人流量", "非机动车流量"};
XSSFRow headerRow = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
headerRow.createCell(i).setCellValue(headers[i]);
}
// 填充数据
List<Statistic> stats = statisticMapper.selectByDateRange(startDate, endDate);
int rowNum = 1;
for (Statistic stat : stats) {
XSSFRow row = sheet.createRow(rowNum++);
row.createCell(0).setCellValue(stat.getDate());
row.createCell(1).setCellValue(stat.getTimeRange());
// 其他字段填充...
}
// 设置响应头
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment; filename=traffic_report.xlsx");
workbook.write(response.getOutputStream());
workbook.close();
}
5. 系统部署与优化
5.1 生产环境部署方案
推荐采用Docker Compose进行容器化部署:
yaml复制version: '3'
services:
app:
image: openjdk:11-jre
ports:
- "8080:8080"
volumes:
- ./config:/config
command: ["java", "-jar", "/app.jar"]
depends_on:
- mysql
- hadoop
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: traffic_db
volumes:
- mysql_data:/var/lib/mysql
hadoop:
image: bde2020/hadoop-base:2.0.0-hadoop3.2.1-java8
ports:
- "50070:50070"
volumes:
- hadoop_data:/hadoop
5.2 性能优化实践
-
查询优化:
- 为时间范围查询添加复合索引
- 使用EXPLAIN分析慢查询
- 对大表进行分区(按月份)
-
缓存策略:
java复制@Cacheable(value = "hourlyStats", key = "#intersectionId.concat('-').concat(#hour)", unless = "#result == null") public StatsDTO getHourlyStats(String intersectionId, int hour) { // 数据库查询逻辑 } -
异步处理:
java复制@Async("flowTaskExecutor") @TransactionalEventListener public void handleFlowEvent(FlowEvent event) { // 耗时处理逻辑 }
6. 毕业设计扩展建议
-
深度学习增强:
- 改用YOLOv5/v7提升检测精度
- 添加ReID技术进行行人轨迹追踪
-
智能预测:
python复制# 使用LSTM进行流量预测示例 model = Sequential() model.add(LSTM(50, return_sequences=True, input_shape=(n_steps, n_features))) model.add(LSTM(50)) model.add(Dense(1)) model.compile(optimizer='adam', loss='mse') -
交通仿真集成:
- 对接SUMO等仿真软件
- 实现"统计-分析-仿真"闭环
-
移动端扩展:
- 开发微信小程序查看实时数据
- 实现异常流量推送通知
在实际开发过程中,有几个关键点需要特别注意:
- 视频处理线程需要做好资源管理,避免内存泄漏
- 大数据量导出时要增加分页查询,防止OOM
- 时间字段的时区处理要保持一致
- 数据库连接池配置要根据预期并发调整
这个系统我在实际部署时遇到过的一个典型问题是视频分析模块的稳定性问题。经过排查发现是OpenCV的本地库依赖问题,最终通过Docker固定环境版本解决。建议在开发初期就建立完整的CI/CD流程,确保环境一致性。
