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
| 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. | |