📄 Official PyTorch implementation of our CVPR 2026 (Poster) paper.
Junhyuk Seo* · Sanghyuk Seo* · Dawoon Kim · Heeseok Oh†
Hansung University
*Equal contribution · †Corresponding author
{withop9974, aissh, 2071290, ohhs}@hansung.ac.kr
- [2026-02] 🎉 R3-PCQA has been accepted to CVPR 2026 as a Poster!
- [2026-05] Initial code released.
Prevailing no-reference 3D point cloud quality assessment methods predominantly treat 2D projections and 3D point clouds as independent modalities and rely on simplistic feature fusion, thereby neglecting fundamental mechanisms underlying human 3D perception. To address this limitation, we introduce R3-PCQA (Ray-Reprojection-Reinforcement 3D Point Cloud Quality Assessor), a novel and principled framework that explicitly encodes perceptual priors into the assessment pipeline: A geometric-aware ray-based reprojection pipeline simulates viewpoint-dependent observation of 3D structure. A reinforcement-learning-based quality-salient subcloud selector adaptively attends to perceptually informative regions. The global view attention module aggregates local quality responses across viewpoints, forming a unified representation that facilitates reliable cross-view inference. Extensive experiments demonstrate that R3-PCQA achieves state-of-the-art performance on SJTU-PCQA, WPC, and WPC2.0.
R3-PCQA emulates three HVS priors — viewpoint-dependent processing, selective attention, and multiview integration — via four lightweight components:
- Geometric-aware Reprojection — Casts rays from 20 icosahedral viewpoints and uses K-means + KNN to build precise pixel-to-subcloud correspondences, bridging 2D projections and 3D geometry.
- Local View Encoder — Per-view fusion of fine texture features (2D) and coarse geometric features (3D) into a coupled local view token.
- Quality-Salient Subcloud Selector (QSS) — A REINFORCE-trained contextual-bandit policy that selects the perceptually most informative subcloud per view — the first RL module for PCQA.
- Global View Attention — Multi-head attention over all view tokens for local-to-global aggregation, yielding the final quality score.
R3-PCQA/
├── train.py
├── inference.py
├── src/
│ ├── model.py
│ ├── data_loader.py
│ ├── pixel_coordinate_utils.py
│ ├── trainer_utils.py
│ └── preprocessing/
│ ├── projection.py
│ └── reprojection.py
├── data_csv/
│ ├── SJTU_MOS.csv
│ ├── WPC_MOS.csv
│ └── WPC2.0_MOS.csv
├── assets/
│ └── pipeline.png
├── LICENSE
└── README.md
cd src/preprocessing
python projection.py \
--input /path/to/ply/files \
--output /path/to/projections \
--width 1080 \
--height 1080 \
--depth_scale 30python reprojection.py \
--projection_dir /path/to/projections \
--ply_dir /path/to/ply/files \
--coord_output /path/to/pixel_coordinates \
--patch_output /path/to/3d_patchespython train.py \
--data_path /workspace/dataset/WPC_MOS_no_100.csv \
--kmeans_patches_dir /path/to/3d_patches \
--pixel_coords_dir /path/to/pixel_coordinates \
--projection_dir /path/to/projections \
--num_epochs 40 \
--warmup_epochs 20 \
--batch_size 4 \
--learning_rate 1e-4 \
--lambda_view 1.0 \
--lambda_policy 1.0 \
--cuda_device 0python inference.py \
--model_path ./endtoend_results/experiment_xxx/fold_1/fold_1_best_plcc_model.pth \
--data_path /workspace/dataset/WPC_MOS_no_100.csv \
--kmeans_patches_dir /path/to/3d_patches \
--pixel_coords_dir /path/to/pixel_coordinates \
--projection_dir /path/to/projections \
--batch_size 4 \
--cuda_device 0- PyTorch
- NumPy
- Pandas
- scikit-learn
- scipy
- tqdm
- wandb (optional)
- torchvision
- PIL
- open3d (== 0.19.0)
- opencv-python
