[CVPR'26 π
Highlight]
MoRel: Long-Range Flicker-Free 4D Motion Modeling via Anchor Relay-based Bidirectional Blending with Hierarchical Densification
Sangwoon Kwak1*,
Weeyoung Kwon2*,
Jun Young Jeong1,
Geonho Kim2,
Won-Sik Cheong1,
Jihyong Oh2β
1Electronics and Telecommunications Research Institute (ETRI)
2Chung-Ang University
*Equal contribution, β Corresponding author
This repository is the official PyTorch implementation of "MoRel: Long-Range Flicker-Free 4D Motion Modeling via Anchor Relay-based Bidirectional Blending with Hierarchical Densification."
- 2025.12.10: MoRel ArXiv and Project page are initially released.
- 2026.02.21: MoRel is accepted to CVPR 2026! π₯
- 2026.03.26: MoRel ArXiv is updated (camera-ready version).
- 2026.04.09: MoRel is selected as a Highlight at CVPR 2026! β¨
- 2026.04.10: MoRel codebase is initially released.
Abstract
Recent advances in 4D Gaussian Splatting (4DGS) have extended the high-speed rendering capability of 3D Gaussian Splatting (3DGS) into the temporal domain, enabling real-time rendering of dynamic scenes. However, one of the major remaining challenges lies in modeling long-range motion-contained dynamic videos, where a naΓ―ve extension of existing methods leads to severe memory explosion, temporal flickering, and failure to handle appearing or disappearing occlusions over time.
To address these challenges, we propose a novel 4DGS framework characterized by an Anchor Relay-based Bidirectional Blending (ARBB) mechanism, named MoRel, which enables temporally consistent and memory-efficient modeling of long-range dynamic scenes. Our method progressively constructs locally canonical anchor spaces at key-frame time indices and models inter-frame deformations at the anchor level, enhancing temporal coherence.
By learning bidirectional deformations between Key-frame Anchors (KfA) and adaptively blending them through learnable opacity control, our approach mitigates temporal discontinuities and flickering artifacts. We further introduce a Feature-variance-guided Hierarchical Densification (FHD) scheme that effectively densifies KfAs while preserving rendering efficiency.
Method Overview
MoRel proceeds through four stages:
| Stage | Name | Description |
|---|---|---|
| GCA | Global Canonical Anchor | Trains a single globally consistent anchor scaffold over the entire sequence |
| KfA | Key-frame Anchor | Periodically placed local canonical spaces, initialized from GCA and refined per key-frame |
| PWD | Progressive Windowed Deformation | Each KfA learns forward/backward deformation fields within a local temporal window |
| IFB | Intermediate Frame Blending | Learns temporal opacity weights to smoothly blend neighboring KfAs |
git clone <repository_url>
cd MoRel
# Install dependencies and create conda environment
bash install.sh
# Activate the environment
conda activate morelThe install script creates a conda environment named morel and installs all required packages including submodules (depth-diff-gaussian-rasterization, simple-knn).
Multi-camera synchronized capture dataset. Each scene contains per-frame multi-view images and per-frame sparse point clouds (from COLMAP triangulation).
Dataset: First, obtain the original SelfCap dataset from FreeTimeGS, then locate the data as described below.
data/selfcap/
βββ <scene>/ # e.g. bike, corgi, yoga, dance
βββ images/
β βββ 0000/ # camera 0000
β β βββ 000000.jpg
β β βββ 000001.jpg
β β βββ ...
β βββ 0001/ # camera 0001
β βββ ...
βββ colmap/
β βββ <frame_id>/ # 6-digit frame index (e.g. 000000)
β β βββ images/ # per-frame images (symlinked)
β β βββ sparse/
β β β βββ cameras.txt
β β β βββ images.txt
β β βββ masks/ # foreground masks
β βββ ...
βββ dense_pcds/
βββ 000000.ply # dense point cloud at frame 0
βββ 002000.ply
βββ ...
Note: Scenes are available in three temporal lengths β
short(~300 frames),medium(~1200 frames),long(~3600 frames).
Custom multi-camera dataset. Run scripts/run_colmap_custom.sh once per scene to obtain camera parameters, then scripts/run_colmap_custom_all_frames.sh to generate per-frame sparse point clouds.
data/custom/
βββ <scene>/ # e.g. Makeup, RX0_251029_s01t01
βββ frames/ # (or images/)
β βββ cam01/
β β βββ 000001.jpg
β β βββ 000002.jpg
β β βββ ...
β βββ cam02/
β βββ ...
βββ cameras.txt # COLMAP camera intrinsics (generated once)
βββ images.txt # COLMAP camera extrinsics (generated once)
βββ points3D.txt # Sparse 3D points from frame 0
βββ pcds/
β βββ frame_000001.ply # Per-frame sparse point clouds
β βββ frame_000002.ply
β βββ ...
βββ colmap_frame0/ # Working directory from run_colmap_custom.sh
βββ ... # (can be deleted after cameras.txt is generated)
COLMAP preparation steps for Custom dataset:
# Step 1: Run full SfM on the first frame to get camera parameters
bash scripts/run_colmap_custom.sh
# Step 2: Triangulate sparse point clouds for all frames
bash scripts/run_colmap_custom_all_frames.shOther Supported Datasets (HyperNeRF, Dycheck, DyNeRF)
Download from the HyperNeRF dataset page.
data/hypernerf/
βββ <scene>/ # e.g. 3dprinter, chickchicken
βββ camera/
β βββ <frame_id>.json # per-frame camera parameters
β βββ ...
βββ rgb/
β βββ 1x/
β β βββ <frame_id>.png
β β βββ ...
β βββ 2x/ # half resolution
βββ colmap/
β βββ sparse/
β βββ dense/
βββ dataset.json
βββ points.npy
Download from the Dycheck dataset page.
data/dycheck/
βββ <scene>/ # e.g. apple, block, spin
βββ camera/
β βββ <frame_id>.json
β βββ ...
βββ rgb/
β βββ 1x/
β βββ 2x/
βββ depth/
β βββ 1x/
β βββ 2x/
βββ colmap/
β βββ sparse/
β βββ dense/
βββ dataset.json
Note: Dycheck uses masked metrics (mPSNR, mSSIM, mLPIPS) as reported in the paper. Refer to Dycheck's evaluation modules for masked evaluation.
Download from the Neural 3D Video dataset page.
data/dynerf/
βββ <scene>/ # e.g. flame_steak, coffee_martini
βββ cam00/
β βββ images/
β βββ 0000.png
β βββ 0001.png
β βββ ...
βββ cam01/
βββ ...
βββ colmap/
βββ sparse/
βββ dense/
Pre-written run scripts are located in run_scripts/. Each script interactively prompts for options.
cd run_scripts
bash run_selfcap.shExample session:
Enter the GPU ID (default: 0): 0
Enter the port (default: 5000): 5000
Enter the config number (default: 1.0): 1.0
Select the scene to run:
[bike_1] 0: short 1: medium 2: long
[bike_2] 3: short 4: medium 5: long
[corgi] 6: short 7: medium 8: long
[yoga] 9: short 10: medium 11: long
[dance] 12: short 13: medium 14: long
[all] short_all: 15 medium_all: 16 long_all: 17
Enter your choice (default: 0): 6
Skip training? (rendering only) [y/n, default: n]: n
Fine-tuning? [y/n, default: n]: n
This will train on corgi_short and then render train/test/interpolation views automatically.
cd run_scripts
bash run_custom.shExample session:
Enter the GPU ID (default: 0): 0
Enter the port (default: 5000): 5000
Enter the config number (default: 1.0): 1.0
Enter the scene name: {your_scene_name}
(e.g. /path/to/MoRel/data/custom/{your_scene_name})
Enter the scene data path: /path/to/MoRel/data/custom/{your_scene_name}
Skip training? (rendering only) [y/n, default: n]: n
Fine-tuning? [y/n, default: n]: n
You can also run each step individually:
# Training
PYTHONPATH='.' CUDA_VISIBLE_DEVICES=0 python train.py \
-s data/selfcap/bike_short \
--port 5000 \
--expname "selfcap_1.0/bike_short" \
--configs arguments/selfcap/config_1.0.py
# Rendering
PYTHONPATH='.' CUDA_VISIBLE_DEVICES=0 python render.py \
--model_path "output/selfcap_1.0/bike_short" \
--configs arguments/selfcap/config_1.0.py \
--render_frame_end 300 \
--streaming_video \
--skip_test --skip_interpolation
# Evaluation
PYTHONPATH='.' CUDA_VISIBLE_DEVICES=0 python metrics.py \
--model_path "output/selfcap_1.0/bike_short"
# Aggregate metrics across scenes
python collect_metric.py \
--output_path "output/selfcap_1.0" \
--dataset selfcapConfigs are located in arguments/<dataset>/. The default configuration for all datasets is config_1.0.py.
To experiment with different hyperparameters, simply create a new config file (e.g., config_2.0.py) in the same folder and specify the version number when running the script:
Enter the config number (default: 1.0): 2.0
To override parameters for a specific scene only, create a file named <scene_name>.py in the same folder β only the parameters defined in it will overwrite the base config.
Please visit our project page for video demos, qualitative comparisons, and quantitative results.
This source code is built upon prior excellent works (3DGS, 4DGS, Scaffold-GS). We sincerely appreciate the authors for their outstanding contributions.
We also sincerely thank EasyVolcap, Long Volumetric Video, and FreeTimeGS for providing the excellent raw dataset that made our long-range video experiments possible.
@InProceedings{kwak2026morel,
title={MoRel: Long-Range Flicker-Free 4D Motion Modeling via Anchor Relay-based Bidirectional Blending with Hierarchical Densification},
author={Sangwoon Kwak and Weeyoung Kwon and Jun Young Jeong and Geonho Kim and Won-Sik Cheong and Jihyong Oh},
booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
year={2026},
}
