GVK-Engine/day-012-series1-capstone
GitHub: GVK-Engine/day-012-series1-capstone
将 11 个自动驾驶感知子项目汇编为统一的顶石展示,涵盖 LiDAR 检测、3D 目标检测、BEV 融合、跟踪、深度补全与域偏移分析等完整感知链路。
Stars: 0 | Forks: 0
# 第 12 天 - 系列 1:感知顶石项目
## 系列 1 是什么
按顺序构建的十一个感知项目。每一个都在回答前一个项目提出的问题。每一个都使用真实的传感器数据,产生真实的数据,并发现那些在我测量之前并不明显的事物。
这不是一个教程合集。每个项目都有新颖的发现。每个发现都与下一个紧密相连。
## 系列 1 顶石项目视频
[](https://drive.google.com/file/d/1s65BKqvUQzPcdGB2qv0QXHKWCKKKOO5K/view)
*所有 11 个项目被编译成一个视频。包含每个项目的所有视觉输出。点击观看。*
## 11 个项目
### 第 01 天 - LiDAR 障碍物检测
起点。原始的 Velodyne HDL-64E 点云、体素化、RANSAC 地面去除、DBSCAN 聚类。在真实的 KITTI 数据上每帧检测到 28 个物体,耗时 86ms。确立了后续每个项目都赖以构建的基线 pipeline。
```
28 objects per frame
86ms end-to-end pipeline
KITTI HDL-64E sensor
```
### 第 02 天 - 双目相机深度安全性
在 KITTI 双目图像对上运行双目视差估计。测量了每个距离范围内的深度精度。结果很明确:相机在 0-10m 范围内实现了 1.04m 的 MAE,但即使在无雨、无雾、无恶劣环境的晴朗天气下,超过 35m 后也会变得不可靠。
```
MAE 1.04m at 0-10m
MAE 8.81m beyond 50m
Reliable only to 35m
```
这一发现为第 8 天的整个传感器融合论证奠定了基础。
### 第 03 天 - PointPillars 3D 检测器
从零开始构建 PointPillars。包含 Pillar 特征提取、伪图像投影、2D 检测头。在 KITTI 上进行训练。在 8 个 epoch 内实现了 98.9% 的 loss 降幅。拥有 250 万个参数。没有使用预训练权重。在这个层面上理解其架构,使得后续每一个深度学习项目的构建速度都变得更快。
```
2.5M parameters built from scratch
98.9% training loss reduction
KITTI 3D object detection
```
### 第 04 天 - 多相机 BEV 感知
使用 IPM 同质性投影将六个相机融合为单一的鸟瞰图(BEV)表示。在 nuScenes 新加坡数据集上运行检测。从任何单个相机都无法看到的视角,同时观察到 178 个物体。这与 Tesla 在其纯视觉技术栈中使用的表示方式相同。
```
178 objects from 6 cameras
Bird's eye view fusion
nuScenes Singapore dataset
```
### 第 05 天 - 多目标跟踪 SORT
在 KITTI 检测结果的基础之上实现了 SORT 跟踪。包含 Kalman 滤波器状态预测、匈牙利算法分配、基于 IoU 的匹配。实现了 95.1% 的 MOTP,击败了原论文公布的 77.5%。核心洞察:瓶颈不在跟踪器,而在检测器。基于优质检测结果运行快速但不完美的跟踪器,其表现要优于基于弱检测结果运行的复杂跟踪器。
```
95.1% MOTP, beats paper 77.5%
1158 FPS tracker throughput
Detector is the bottleneck
```
### 第 06 天 - 语义分割 ROS2
在 ROS2 Humble 节点内部署了 DeepLabV3。测量了包含 ROS2 消息开销在内的真实推理时间,而不仅仅是原始的 PyTorch 推理。在 RTX 4050 上达到 52.6 FPS。单独测量了预热开销,发现第一帧的处理时间是稳态的 3.2 倍,这是大多数 benchmark 会忽略的情况。
```
52.6 FPS on RTX 4050
ROS2 Humble deployment
Warmup cost measured: 3.2x first frame
```
### 第 07 天 - 恶劣天气感知
将 Marshall-Palmer 雨衰模型和 Koschmieder 雾消光模型应用于真实的 KITTI LiDAR 扫描数据。测试了 42 种雨雾组合。结果令我惊讶。100mm/hr 的降雨(相当于凤凰城的季风雨级别)是可存活的。而能见度低于 75m 的大雾则不可存活。它们不是对称的失败,在安全文档中不应被同等对待。
```
Rain safe at 100mm/hr
Fog unsafe below 75m visibility
42 conditions tested, ODD boundary measured
```
### 第 08 天 - LiDAR 与相机深度补全
结合第 2 天的发现(相机在 35m 以外不可靠)和第 7 天的发现(LiDAR 能够在各种降雨中存活),构建了能够弥补两者不足的融合方案。将稀疏 LiDAR 投影到相机图像上,由密集补全网络填补空缺。在 0-10m 范围内,MAE 比仅使用相机改善了 44 倍。仅用 1.3% 的稀疏输入实现了 100% 的空间覆盖率。
```
44x MAE improvement 0-10m
100% coverage from 1.3% sparse input
108-frame demo video
```
### 第 09 天 - Domain Shift 分析
将在德国 KITTI 数据上训练的同一个检测器,部署到新加坡的 nuScenes 数据上。检测率下降了 58.4%。随后我花了时间寻找根本原因。原因不在于城市,也不在于场景复杂度,而在于传感器。HDL-64E 每次扫描产生 121k 个点,而 HDL-32E 产生 34k 个点。检测器学习到了特定于某一种传感器的点密度模式,当这些模式发生改变时就会失败。
```
58.4% detection drop across datasets
Root cause: sensor, not scene
HDL-64E 121k pts vs HDL-32E 34k pts
```
### 第 10 天 - 神经占用网络
构建了一个 4 状态的体素不确定性系统。FREE-CONFIRMED 表示激光束穿过了该体素并确认其为空。FREE-ASSUMED 表示既没有确认它为空,也没有任何证据与之矛盾。这两种状态有着本质的区别,在路径规划中将它们同等对待,正是导致自动驾驶汽车驶入被遮挡物体的原因。
在 40 万个 KITTI 样本上训练了一个 3D CNN。达到了 100% 的准确率。发现了不安全的规划边界:在距离传感器 40m 处,FREE-CONFIRMED 和 FREE-ASSUMED 体素的状态趋于均等。超过该距离后,系统便无法区分安全空间与不确定空间。
```
4-state uncertainty classification
Unsafe planning boundary at 40m
3D CNN 72k parameters, 100% accuracy
282ms pipeline on RTX 4050
```
### 第 11 天 - ASU 校园感知
将基于 KITTI 训练的 YOLOv8 检测器,部署到我在 ASU Tempe 校园拍摄的真实视频素材上。系统地测量了五种类型的失败情况。
最重要的发现:阳光眩光会导致检测率骤降 56.5%。随后,我在相同的视频素材上运行了拥有 6800 万参数的 YOLOv8x(比 nano 版本大 20 倍)。它在眩光下的表现比小模型更差。模型规模无法解决训练分布不匹配的问题。亚利桑那州的阳光完全超出了阴沉的德国高速公路视频素材的分布范围。任何规模的扩展都无法解决这个问题。
```
56.5% detection drop in Arizona sun
YOLOv8x worse than nano in glare
Golf cart: 0 detections, vocabulary gap
2565 frames across 8 campus scenarios
```
## 紧密相连的故事
```
Day 2: cameras fail beyond 35m
Day 7: LiDAR survives rain, fails in dense fog
Day 8: fuse them together, cover both failures
Day 9: same detector, different city, 58.4% drop
Day 11: same detector, different continent, same problem
root cause confirmed: distribution mismatch
Day 10: not just where objects are
but where space is safe to plan through
the representation that ties perception to planning
```
## 系列 1 总结
| 项目 | 核心发现 |
|---------|-------------|
| 第 01 天 LiDAR 检测 | 86ms,28 个物体,KITTI 基线 |
| 第 02 天 双目深度 | 相机在 35m 外不安全 |
| 第 03 天 PointPillars | 从零开始实现 98.9% 的 loss 降幅 |
| 第 04 天 BEV 感知 | 178 个物体,融合 6 个相机 |
| 第 05 天 MOT SORT | 95.1% MOTP,超越已发表论文 |
| 第 06 天 语义分割 | 实时 ROS2 pipeline 中达到 52.6 FPS |
| 第 07 天 恶劣天气 | 雾在 75m 以下不安全,雨可存活 |
| 第 08 天 深度补全 | MAE 改善 44 倍,100% 覆盖率 |
| 第 09 天 Domain Shift | 下降 58.4%,原因在传感器而非场景 |
| 第 10 天 占用网络 | 不安全规划边界为 40m |
| 第 11 天 ASU 感知 | 扩大规模无法解决 domain shift |
## 所有项目代码库
| 项目 | 代码库 |
|---------|------------|
| 第 01 天 | [day-001-lidar-obstacle-detection](https://github.com/GVK-Engine/day-001-lidar-obstacle-detection) |
| 第 02 天 | [day-002-stereo-depth-analysis](https://github.com/GVK-Engine/day-002-stereo-depth-analysis) |
| 第 03 天 | [day-003-pointpillars-3d-detector](https://github.com/GVK-Engine/day-003-pointpillars-3d-detector) |
| 第 04 天 | [day-004-bev-perception](https://github.com/GVK-Engine/day-004-bev-perception) |
| 第 05 天 | [day-005-multi-object-tracking](https://github.com/GVK-Engine/day-005-multi-object-tracking) |
| 第 06 天 | [day-006-semantic-segmentation](https://github.com/GVK-Engine/day-006-semantic-segmentation) |
| 第 07 天 | [day-007-adverse-weather-perception](https://github.com/GVK-Engine/day-007-adverse-weather-perception) |
| 第 08 天 | [day-008-depth-completion](https://github.com/GVK-Engine/day-008-depth-completion) |
| 第 09 天 | [day-009-domain-shift](https://github.com/GVK-Engine/day-009-domain-shift) |
| 第 10 天 | [day-010-occupancy-network](https://github.com/GVK-Engine/day-010-occupancy-network) |
| 第 11 天 | [day-011-asu-perception](https://github.com/GVK-Engine/day-011-asu-perception) |
## 运行顶石项目视频生成器
```
git clone https://github.com/GVK-Engine/day-012-series1-capstone
cd day-012-series1-capstone
pip install -r requirements.txt
```
更新 `capstone_video.py` 中的所有项目路径,使其与您本地的目录结构相匹配。
```
py -3.11 capstone_video.py
```
通过提取所有 11 个项目文件夹中的每个视觉输出,生成 `series1_capstone.mp4`。
## 技术栈
`Python 3.11` `PyTorch 2.6` `OpenCV` `Matplotlib` `imageio` `NumPy` `YOLOv8` `ROS2 Humble` `KITTI` `nuScenes`
## 接下来是什么
系列 1 涵盖了从原始传感器数据到世界表示的完整感知栈。系列 2 将在此基础上构建规划和控制。系列 3 会将所有内容集成到仿真环境中的运行自动驾驶系统里。
在系列 1 中测量到的感知问题(如 domain shift、恶劣天气、词汇表缺失、不确定性量化),正是导致在全新城市部署 AV(自动驾驶汽车)系统变得困难重重的根本原因。系列 2 将在明确感知边界所在位置的基础上展开。
标签:3D目标检测, 传感器融合, 多目标跟踪, 机器人, 激光雷达检测, 自动驾驶感知, 计算机视觉