一、项目简介
本项目把微观车辆轨迹数据转换成可预测的流量时序,并用 PyTorch 训练 RNN 与 LSTM 两条回归链路,再由 FastAPI 封装成可直接登录使用的 Web 平台。
平台把一条完整链路拆成三段:数据段读取法国 Créteil 的 VANET 轨迹 CSV,清洗后按 100 米空间网格与 5 分钟时间窗聚合成流量、平均速度与公交数量;训练段以 12 步历史窗口预测未来 3 步,同时记录逐轮损失与学习率;应用段提供在线预测、步长外推、批量推理、数据浏览、历史留存、统计看板与网页端真实训练。

流量预测页:左侧填历史序列并选择模型,右侧实时绘出历史段与预测段
二、数据说明
1. 数据来源与字段
数据来自公开的微观车辆移动轨迹数据集 vanet-trace-creteil-20130924-0700-0900,记录法国 Créteil 地区 Europarc 环岛在 2013 年 9 月 24 日 07:00--09:00 的逐秒车辆状态,采用 CC BY-NC 4.0 许可。原始 CSV 以分号分隔,共 96 万余行,包含 10 个字段。
| 字段 | 含义 | 类型 |
|---|---|---|
| timestep_time | 时间步,从采集起点按秒递增 | 浮点 |
| vehicle_id | 车辆唯一标识,含类型与流向信息 | 字符串 |
| vehicle_type | 车辆类型,Bus 或 Vehicle | 字符串 |
| vehicle_x / vehicle_y | 平面坐标,单位米 | 浮点 |
| vehicle_speed | 瞬时速度,单位米每秒 | 浮点 |
| vehicle_angle / vehicle_slope | 航向角与坡度 | 浮点 |
| vehicle_lane | 车道标识 | 字符串 |
| vehicle_pos | 车辆在车道内的位置 | 浮点 |
2. 清洗与聚合结果
依次做去重、缺失值删除与异常值剔除:轨迹中不存在重复行,18 处缺失值直接删除,速度按 0--200 m/s 合理区间过滤、坐标按四分位距过滤,合计剔除 11.7 万行,最终保留 845,756 条记录,覆盖 5,103 辆车与 7,384 个时间步。车辆构成以普通车为主,公交车 11,108 条记录。
| 指标 | 数值 | 说明 |
|---|---|---|
| 原始记录数 | 962,721 | CSV 中的全部轨迹记录 |
| 清洗后记录数 | 845,756 | 剔除缺失与异常后的有效轨迹 |
| 车辆数 | 5,103 | 去重后的车辆标识数量 |
| 时间步 | 7,384 | 按秒记录,跨度约 2 小时 |
| 空间网格 | 46 | 100 米网格,覆盖环岛及周边道路 |
| 聚合时间窗 | 25 | 每个窗口 300 秒 |
| 单窗平均流量 | 737.4 | 46 个网格的窗口均值 |
| 单窗最高流量 | 12,468 | 出现在网格 12_5 |
3. 网格流量分布
聚合后 46 个网格的流量高度集中:排名第一的 12_5 累计 171,495 辆次、峰值 12,468,占全部流量近三成;前五个网格合计占比过半,其余多为边缘路段的低频网格。

数据浏览页:规模指标、网格时序、流量热力与网格排行
三、模型训练与结果
1. 序列构造与归一化
按网格分组后滑动切窗,每条样本取连续 12 个窗口的车流量作为输入,对应输出未来 3 个窗口,得到 503 条有效序列。归一化使用全部样本的极值做统一 Min-Max,避免输入与目标各自缩放导致尺度过大,参数写入 normalize_params.json 供推理复用。
2. 网络结构与训练配置
RNN 与 LSTM 使用一致的规模与训练口径,便于公平对比:输入维度 1、隐藏层 64、两层堆叠、第 1 层 Dropout 0.2,末层接全连接输出 3 维。损失为均方误差,优化器 Adam,初始学习率 0.001,配合 ReduceLROnPlateau 按验证损失折半衰减,梯度裁剪上限 1.0,训练 50 轮并按验证损失保存最优权重。
3. 训练过程
LSTM 在第 39 轮取得最佳验证损失 0.000029,末轮训练损失 0.005329、验证损失 0.000034;学习率由 0.001 逐级衰减至 0.000125。RNN 在第 5 轮即达最佳验证损失 0.001295,之后长期停留在 0.0016 附近,说明基础循环结构对这段时序的拟合能力有限。

LSTM 训练产物:训练与验证损失、学习率衰减曲线
4. 评估结果
在测试集上反归一化后计算四项指标,LSTM 全面优于 RNN:
| 指标 | RNN | LSTM | 变化 |
|---|---|---|---|
| MAE | 496.3673 | 55.5674 | 下降 88.81% |
| RMSE | 548.8459 | 90.5668 | 下降 83.50% |
| MAPE | 478.10% | 52.80% | 下降 88.96% |
| R² | −4.4498 | 0.8516 | 提升 5.3014 |
RNN 的 R² 为负,意味着其预测效果还不如直接取均值,MAPE 也因小流量样本被放大而失真,因此 R² 一列给出的是绝对差而非百分比。LSTM 的 R² 达到 0.8516,可解释约 85% 的流量波动,与训练过程中验证损失的收敛趋势一致。

模型对比页:四项指标柱状与雷达对照
四、系统功能设计
平台共有八个功能页,入口统一放在左侧分组导航,窄屏下收为左侧抽屉。每个页面各自保留独立容器,切换时只改显隐并调用上一页的销毁钩子,返回即拉取最新数据。
1. 登录与注册
页面中心单栏卡片,登录与注册共用同一张 3 : 4 比例的卡片,标题使用楷体并按词义断行。密码以 PBKDF2-SHA256 加盐哈希保存,会话通过 HttpOnly Cookie 维持七天;注册校验用户名长度与密码强度。

登录页:实拍背景与 3:4 登录卡片
2. 流量预测
粘贴历史序列、选择 LSTM 或 RNN、指定预测步长即可推理。结果同时给出逐步预测值、未来时段的均值与峰值、实际推理耗时,并把历史段与预测段画在同一条曲线上,用虚线区分预测部分,下表逐项列出环比变化。
3. 批量预测
可按流量排名自动取网格序列,也可手动逐行粘贴多组序列。一次最多提交 200 组,逐组给出结果与失败原因,成功项汇总成柱状对比与明细表,并支持导出 CSV。

批量预测结果:各组对比与明细
4. 数据浏览
展示清洗后的记录数、车辆数、网格数与时间窗数,可切换网格查看完整流量与平均速度双轴时序,并以热力矩阵呈现流量前 16 个网格在全部时间窗上的分布,右侧配网格流量排行表。热力图按分位数取色,避免强偏态数据把多数格子压在浅色端。
5. 预测历史
按类型、模型与网格筛选历史记录,每条记录保留输入序列、预测结果、均值、峰值与耗时,可查看详情或整表导出 CSV。所有记录写入 SQLite,并按账号隔离。

预测历史页:筛选、分页与导出
6. 统计分析
汇总预测总次数、平均预测流量、历史峰值与平均耗时,并按模型占比、预测类型、每日次数与网格使用排行四个维度统计;另附数据集中各小时的平均流量。

统计分析页:模型占比、类型分布与网格排行
7. 模型对比
读取训练脚本输出的对比结果,以柱状图与雷达图并列展示两种模型的四项指标,表格逐项列出数值、变化幅度与更优者。页面注明数据来源为测试集评估,指标未做二次加工。
8. 模型训练
在浏览器配置模型类型、轮数、学习率、批次、隐藏层维度、层数、Dropout、序列长度与预测步长后发起真实训练。训练在独立子进程中执行,页面按秒轮询状态并实时绘制训练损失与学习率曲线,滚动显示训练日志;训练中可提交新的学习率由训练进程在下一轮确认生效,也可安全停止。结束后可下载 best 与 last 权重,并一键加载为当前推理模型。

模型训练页:超参数配置、实时曲线与日志
9. 指标展示
解析训练日志中的逐轮记录,动态绘制两种模型的训练与验证损失、学习率变化,验证损失单独用对数坐标呈现收敛差异;右侧给出四项评估指标与训练总结,页面下方原样收录训练脚本输出的原始产物图。

指标展示页:动态曲线与原始训练产物
五、技术栈
| 类别 | 技术 | 用途 |
|---|---|---|
| 编程语言 | Python、JavaScript | 后端服务、模型训练与前端页面 |
| 深度学习 | PyTorch | RNN 与 LSTM 的建模、训练与推理 |
| 数据处理 | Pandas、NumPy | 轨迹清洗、网格聚合、序列构造与归一化 |
| Web 服务 | FastAPI、Uvicorn | 接口服务与静态资源托管 |
| Web 前端 | 原生模块化 JS、CSS | 页面与交互,无需构建工具 |
| 数据存储 | SQLite | 账号、会话、预测记录与训练任务 |
| 图表 | ECharts | 按当前主题变量动态绘制曲线、热力与雷达图 |
| 任务调度 | 子进程 + 状态文件 | 训练任务执行、进度回传与控制指令 |
六、项目结构
| 目录 | 说明 |
|---|---|
| main.py | 原始训练入口,保留不动 |
| src/data_processing | 数据加载、清洗、特征工程与序列构造 |
| src/models | RNN 与 LSTM 网络定义 |
| src/training | 训练、评估与对比图表 |
| src/prediction | 推理封装 |
| data/models | 权重、归一化参数、训练日志与产物 |
| web/一键启动.bat | Windows 启动入口 |
| web/run.py | 环境检查与 Uvicorn 启动 |
| web/main.py | 服务装配与静态资源托管 |
| web/app/config.py | 路径、端口、序列与聚合参数 |
| web/app/db.py | SQLite 访问与建表 |
| web/app/security.py | 账号与会话 |
| web/app/api | 认证、预测、数据、历史与模型接口 |
| web/app/services | 数据中枢、推理、训练与指标解析 |
| web/static | 主题样式、页面脚本、图表库与背景图 |
| web/templates | 登录页与主界面模板 |
七、运行说明
1. 安装依赖
bash
pip install -r requirements.txt
Web 端复用项目原有环境,需要 fastapi 与 uvicorn,不升级 PyTorch 与 CUDA。
2. 启动 Web 平台
bash
双击 web/一键启动.bat
# 或在 web 目录执行
python run.py
服务默认监听 http://127.0.0.1:8100,使用初始化管理员账号登录。首次启动会读取轨迹 CSV 并生成聚合缓存,之后直接复用;重复启动会提示服务已在运行,端口被其他程序占用时只提示、不结束进程。
3. 发起预测与训练
登录后进入「流量预测」页填写序列即可推理,点击「载入真实样例」会自动取流量最高的网格前 12 个时间窗;「模型训练」页配置好超参数后点击「启动训练」,训练在独立子进程执行,页面实时回显损失曲线与日志,结束后可把新权重加载为推理模型。