ptv3 / README.md
xmfcx's picture
feat: add ptv3 v4.0 artifacts (from awf.ml.dev.web.auto/perception/models/ptv3/v4)
1673104 verified
|
Raw
History Blame Contribute Delete
7.13 kB
---
license: apache-2.0
pipeline_tag: object-detection
tags:
- autoware
- ros2
- autonomous-driving
- lidar
- point-cloud
- 3d-object-detection
- semantic-segmentation
- point-transformer
- tensorrt
- onnx
---
# Point Transformer V3 for Autoware (`ptv3`)
Dual-task 3D perception models for LiDAR point clouds, used by the
[`autoware_ptv3`](https://github.com/autowarefoundation/autoware_universe/tree/main/perception/autoware_ptv3)
node in [Autoware](https://github.com/autowarefoundation/autoware).
The models follow the **Point Transformer V3 (PTv3)** [1] architecture: a shared sparse-convolution point
transformer encoder feeding two task heads, one for 3D object detection and one for 3D semantic segmentation.
The sparse convolution backend corresponds to [spconv](https://github.com/traveller59/spconv), which Autoware
consumes through [spconv_cpp](https://github.com/autowarefoundation/spconv_cpp). The models are exported as
ONNX so they can be deployed across hardware; Autoware builds the TensorRT engines from the ONNX files on
first launch.
## Model overview
| | |
| --- | --- |
| Task | Joint 3D object detection (oriented bounding boxes) and 3D semantic segmentation from a LiDAR point cloud |
| Architecture | Point Transformer V3 encoder (sparse convolutions) with separate detection and segmentation heads |
| Detection classes | `CAR`, `TRUCK`, `BUS`, `BICYCLE`, `PEDESTRIAN`, `TRAFFIC_CONE`, `BARRIER` |
| Segmentation classes | `car`, `truck`, `bus`, `bicycle`, `pedestrian`, `traffic_cone`, `barrier`, `debris`, `drivable_flat`, `non_drivable_flat`, `vegetation`, `building`, `vertical_thin`, `static_clutter`, `noise` |
| Point cloud range [m] | `[-122.88, -122.88, -3.0, 122.88, 122.88, 5.0]` |
| Voxel size (x, y, z) [m] | `0.12, 0.12, 0.12` |
| Runtime | TensorRT (FP16 by default) via the `autoware_ptv3` ROS 2 node, with sparse-conv plugins from `autoware_tensorrt_plugins` |
| Format | ONNX (Autoware builds the TensorRT engines locally on first launch) |
| License | Apache-2.0 |
The network is split into three ONNX sub-models, matching how the node consumes them:
1. **Encoder** (`ptv3_encoder.onnx`): shared PTv3 backbone with encoder channels
`[32, 64, 128, 256, 512]`, serialization orders `z` and `z-trans`, and pooling strides `[2, 2, 2, 2]`.
2. **Detection head** (`ptv3_det3d_head.onnx`): predicts up to 500 oriented 3D boxes with velocity
(`has_twist: true`) over a BEV grid with `bbox_voxel_size: [0.96, 0.96, 8.0]`.
3. **Segmentation head** (`ptv3_seg3d_head.onnx`): per-point classification over the 15 segmentation
classes listed above.
Each head can be enabled or disabled independently at launch time (`use_det3d_head`, `use_seg3d_head`).
Pre-processing (voxelization) and post-processing (IoU NMS, yaw normalization, distance-based score
thresholding, class remapping by area, point filtering) run in the node, not in the ONNX graphs.
## Files
| File | Description |
| --- | --- |
| `ptv3_encoder.onnx` | Shared PTv3 encoder |
| `ptv3_det3d_head.onnx` | 3D object detection head |
| `ptv3_seg3d_head.onnx` | 3D semantic segmentation head |
| `ml_package_ptv3_encoder.param.yaml` | Encoder model parameters (range, voxel size, channels) |
| `ml_package_ptv3_det3d_head.param.yaml` | Detection head model parameters (classes, proposals, BEV voxel size) |
| `ml_package_ptv3_seg3d_head.param.yaml` | Segmentation head model parameters (class names, visualization palette) |
| `deploy_metadata.yaml` | Deployment metadata (records the model version) |
> **TensorRT engines are not distributed here.** TensorRT engines are specific to the GPU architecture and
> TensorRT version they are built on and are not portable, so Autoware builds them locally from the ONNX files
> on first launch (or via `build_only:=true`).
## Inputs and outputs (as used by the node)
**Input**: `~/input/pointcloud` (`sensor_msgs/msg/PointCloud2`), by default remapped to
`/sensing/lidar/concatenated/pointcloud`. The node detects the input point format automatically on the first
received message and supports `XYZIRCAEDT` (10 fields), `XYZIRADRT` (9 fields), `XYZIRC` (6 fields), and
`XYZI` (4 fields).
**Outputs**:
| Topic | Type | Description |
| --- | --- | --- |
| `~/output/objects` | `autoware_perception_msgs/msg/DetectedObjects` | Detected 3D objects after score filtering and IoU NMS |
| `~/output/pointcloud/segmentation` | `sensor_msgs/msg/PointCloud2` | XYZ cloud with class ID and probability fields |
| `~/output/pointcloud/visualization` | `sensor_msgs/msg/PointCloud2` | XYZ cloud with RGB field (colored by class palette) |
| `~/output/pointcloud/filtered` | `sensor_msgs/msg/PointCloud2` | Input cloud with configured classes filtered out (default: `drivable_flat`) |
The node also publishes processing-time and latency debug topics under `debug/`.
## Usage in Autoware
Autoware's setup (the Ansible artifacts role) downloads these artifacts to `~/autoware_data/ml_models/ptv3/`,
and the node launches with, e.g.:
```bash
ros2 launch autoware_ptv3 ptv3.launch.xml \
model_path:=$HOME/autoware_data/ml_models/ptv3
```
Add `build_only:=true` to build the TensorRT engines from the ONNX files as a one-off pre-task. The
`ml_package_ptv3_*.param.yaml` files in this repository are loaded from the model directory at launch, while
node parameters (precision, workspace sizes, filtering, score thresholds) come from the package's
`config/ptv3.param.yaml`. See the
[package README](https://github.com/autowarefoundation/autoware_universe/tree/main/perception/autoware_ptv3)
for the full parameter reference.
## Training
The model was trained on the T4Dataset using approximately 4,000 frames, as documented in the package README.
A public training configuration is not documented in the package.
- Sparse convolution backend: <https://github.com/traveller59/spconv>
- C++ sparse convolution implementation used by Autoware: <https://github.com/autowarefoundation/spconv_cpp>
- Point Transformer V3 paper: arXiv:2312.10035
## Provenance
| | |
| --- | --- |
| Original hosting | `https://awf.ml.dev.web.auto/perception/models/ptv3/v4/` |
| Source version path | `ptv3/v4` |
| This repository | `AutowareFoundation/ptv3`, tag `v4.0` |
## Limitations
- Trained on the T4Dataset sensor configuration; accuracy on a different LiDAR setup (mounting position, beam
count, concatenated clouds) can drop without fine-tuning.
- Only the classes listed above are detected or segmented. Other road users fall outside the label set.
- Evaluation metrics for this model are not publicly documented.
## Citation
```bibtex
@inproceedings{wu2024ptv3,
title = {Point Transformer V3: Simpler, Faster, Stronger},
author = {Wu, Xiaoyang and Jiang, Li and Wang, Peng-Shuai and Liu, Zhijian and Liu, Xihui and Qiao, Yu and Ouyang, Wanli and He, Tong and Zhao, Hengshuang},
booktitle = {CVPR},
year = {2024}
}
```
## References
- [1] Wu et al., "Point Transformer V3: Simpler, Faster, Stronger", CVPR 2024, arXiv:2312.10035.
- spconv: <https://github.com/traveller59/spconv>
- spconv_cpp: <https://github.com/autowarefoundation/spconv_cpp>