Object Detection
TensorRT
ONNX
autoware
ros2
autonomous-driving
lidar
camera
point-cloud
sensor-fusion
pointpainting
pointpillars
Instructions to use AutowareFoundation/image_projection_based_fusion with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- TensorRT
How to use AutowareFoundation/image_projection_based_fusion with TensorRT:
# No code snippets available yet for this library. # To use this model, check the repository files and the library's documentation. # Want to help? PRs adding snippets are welcome at: # https://github.com/huggingface/huggingface.js
- Notebooks
- Google Colab
- Kaggle
File size: 6,729 Bytes
33119d7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | ---
license: apache-2.0
pipeline_tag: object-detection
tags:
- autoware
- ros2
- autonomous-driving
- lidar
- camera
- point-cloud
- sensor-fusion
- pointpainting
- pointpillars
- tensorrt
- onnx
---
# PointPainting for Autoware (`image_projection_based_fusion`)
Camera-LiDAR fusion 3D object detection model for the `pointpainting_fusion` node of the
[`autoware_image_projection_based_fusion`](https://github.com/autowarefoundation/autoware_universe/tree/main/perception/autoware_image_projection_based_fusion)
package in [Autoware](https://github.com/autowarefoundation/autoware).
Following the **PointPainting** [1] approach, LiDAR points are projected onto the output of an image-only 2D
object detector and the class scores are appended to each point. The painted point cloud is then fed to a
CenterPoint-style 3D detection network with a **PointPillars** [2] voxel encoder. The model is exported as ONNX
and runs with TensorRT inside Autoware; the TensorRT engine is built from the ONNX files on first launch.
## Model overview
| | |
| --- | --- |
| Task | 3D object detection (oriented bounding boxes) from a LiDAR point cloud painted with 2D detection class scores |
| Architecture | PointPainting point decoration + PointPillars-style voxel encoder + CenterPoint-style detection head |
| Detected classes | `CAR`, `TRUCK`, `BUS`, `BICYCLE`, `PEDESTRIAN` |
| Painted classes | `CAR`, `BICYCLE`, `PEDESTRIAN` (class scores appended to each point) |
| Runtime | TensorRT (FP16 by default, FP32 selectable) via the `pointpainting_fusion` ROS 2 node |
| Format | ONNX (Autoware builds the TensorRT engine locally on first launch) |
| License | Apache-2.0 |
The network is split into two ONNX sub-models, matching how the node consumes them:
1. **Voxel encoder**: `pts_voxel_encoder_pointpainting.onnx`
- input: `input_features` -> output: `pillar_features`
2. **Backbone / neck / head**: `pts_backbone_neck_head_pointpainting.onnx`
- input: `spatial_features` -> outputs: `heatmap`, `reg`, `height`, `dim`, `rot`, `vel`
Point painting, voxelization, and post-processing (circle NMS, IoU NMS, yaw normalization, distance-based score
thresholding) run in the node, not in the ONNX graphs.
Key model parameters (from `pointpainting_ml_package.param.yaml`): `point_feature_size: 7` (x, y, z, time-lag
and the three painted class scores), `encoder_in_feature_size: 12`, `max_voxel_size: 40000`, point cloud range
`[-121.6, -76.8, -3.0, 121.6, 76.8, 5.0]` m, voxel size `[0.32, 0.32, 8.0]` m, `downsample_factor: 1`.
## Files
| File | Description |
| --- | --- |
| `pts_voxel_encoder_pointpainting.onnx` | Voxel encoder |
| `pts_backbone_neck_head_pointpainting.onnx` | Backbone/neck/head |
| `pointpainting_ml_package.param.yaml` | Model parameters (classes, voxel grid, score thresholds) |
| `detection_class_remapper.param.yaml` | Area-based class remapping (e.g. large car -> truck/trailer) |
| `deploy_metadata.yaml` | Version marker for this artifact set (`version: v5.0`) |
> **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)
**Inputs**
| Topic | Type | Description |
| --- | --- | --- |
| `input/pointcloud` | `sensor_msgs/msg/PointCloud2` | LiDAR point cloud |
| `input/camera_info[N]` | `sensor_msgs/msg/CameraInfo` | Camera information to project 3D points onto image planes |
| `input/rois[N]` | `tier4_perception_msgs/msg/DetectedObjectsWithFeature` | ROIs from each camera's 2D object detector |
| `input/image_raw[N]` | `sensor_msgs/msg/Image` | Images for visualization (debug) |
One `camera_info`/`rois` pair per camera; the launch file defaults to 6 cameras (`input/rois_number`).
**Outputs**
| Topic | Type | Description |
| --- | --- | --- |
| `output/objects` | `autoware_perception_msgs/msg/DetectedObjects` | Detected objects (oriented 3D boxes with class and score) |
| `debug/painted_pointcloud` | `sensor_msgs/msg/PointCloud2` | Painted point cloud (debug) |
## Usage in Autoware
Autoware's setup (ansible artifacts role) downloads these artifacts to
`~/autoware_data/ml_models/image_projection_based_fusion/`; the node then launches with, e.g.:
```bash
ros2 launch autoware_image_projection_based_fusion pointpainting_fusion.launch.xml \
model_name:=pointpainting \
model_path:=$HOME/autoware_data/ml_models/image_projection_based_fusion \
model_param_path:=$(ros2 pkg prefix autoware_image_projection_based_fusion --share)/config/pointpainting.param.yaml
```
Add `build_only:=true` to build the TensorRT engine from the ONNX as a one-off pre-task.
See the [package README](https://github.com/autowarefoundation/autoware_universe/tree/main/perception/autoware_image_projection_based_fusion)
for the full parameter reference, including ROI/point cloud synchronization and matching strategies.
## Training
The model was trained by TIER IV. No public training configuration, dataset description, or training code is
available for this model.
## Provenance and versioning
| | |
| --- | --- |
| Original source | `https://awf.ml.dev.web.auto/perception/models/pointpainting/v5/` |
| Source version path | `pointpainting/v5` |
| Tag in this repository | `v5.0` |
## Limitations
- Only the five classes above are detected, and only car, pedestrian, and bicycle class scores are painted
onto the points. Other road users fall outside the label set.
- Multi-frame painting is not implemented yet (single-frame painting only).
- Fusion quality depends on accurate camera-LiDAR calibration and correct per-camera timestamp offsets
(`rois_timestamp_offsets`), as described in the package README.
- Detection accuracy depends on the upstream 2D object detector that provides the ROIs.
## Citation
```bibtex
@inproceedings{vora2020pointpainting,
title = {PointPainting: Sequential Fusion for 3D Object Detection},
author = {Vora, Sourabh and Lang, Alex H. and Helou, Bassam and Beijbom, Oscar},
booktitle = {CVPR},
year = {2020},
eprint = {1911.10150}
}
@inproceedings{lang2019pointpillars,
title = {PointPillars: Fast Encoders for Object Detection from Point Clouds},
author = {Lang, Alex H. and Vora, Sourabh and Caesar, Holger and Zhou, Lubing and Yang, Jiong and Beijbom, Oscar},
booktitle = {CVPR},
year = {2019}
}
```
## References
- [1] Vora et al., "PointPainting: Sequential Fusion for 3D Object Detection", arXiv:1911.10150, CVPR 2020.
- [2] Lang et al., "PointPillars: Fast Encoders for Object Detection from Point Clouds", CVPR 2019.
|