GuardSplat: Efficient and Robust Watermarking for 3D Gaussian Splatting
August 1, 2025 · View on GitHub
Zixuan Chen, Guangcong Wang, Jiahao Zhu, Jianhuang Lai, Xiaohua Xie.
IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 2025
TL;DR: GuardSplat is an efficient watermarking framework to protect the copyright of 3DGS assets. It presents superior performance to state-of-the-art watermarking approaches in capacity, invisibility, robustness, security, and training efficiency.
Framework
Overview of GuardSplat. (a) Given a binary message , we first transform it into CLIP tokens using the proposed message tokenization. We then employ CLIP's textual encoder to map to the textual feature . Finally, we feed into message decoder to extract the message for optimization. (b) For each 3D Gaussian, we freeze all the attributes and build a learnable spherical harmonic (SH) offset as the watermarked SH feature, which can be added to the original SH features as to render the watermarked views. (c) We first feed the 2D rendered views to CLIP's visual encoder to acquire the visual feature and then employ the pre-trained message decoder to extract the message . A differentiable distortion layer is used to simulate various visual distortions during optimization. and are optimized by the corresponding losses, respectively.
1) Get start
- Python 3.12
- CUDA 12.1 or higher
- NVIDIA RTX 3090
- PyTorch 2.5.1 or higher
Create a python env using conda
conda create -n GuardSplat python=3.12 -y
conda activate GuardSplat
Install the required libraries
bash setup.sh
Please see setup.sh in details.
2) Train and evaluate the message decoder
python make_decoder.py --mode train --msg_len <message_length> --save --num_epochs <training_epochs>
python make_decoder.py --mode test --msg_len <message_length>
3) Train a 3DGS model
python gaussian-splatting/train.py -s <nerf_dir>/<nerf_item> -m <result_dir> -w
4) Watermark a 3DGS model (blender or llff mode)
# no distortions
python run_watermark.py -s <nerf_dir>/<nerf_item> -m <result_dir> -w --mode train --msg_len <message_length> --sdir <watermark_dir> --dtype blender
# single distortion
python run_watermark.py -s <nerf_dir>/<nerf_item> -m <result_dir> -w --mode train --msg_len <message_length> --sdir <watermark_dir> --dtype blender atypes <distortion>
# combined distortions
python run_watermark.py -s <nerf_dir>/<nerf_item> -m <result_dir> -w --mode train --msg_len <message_length> --sdir <watermark_dir> --dtype blender atypes <distortion1> <distortion2> ... <distortionN>
More details can be shown in run.sh.
Citation
@InProceedings{Chen_2025_CVPR,
author = {Chen, Zixuan and Wang, Guangcong and Zhu, Jiahao and Lai, Jianhuang and Xie, Xiaohua},
title = {GuardSplat: Efficient and Robust Watermarking for 3D Gaussian Splatting},
booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
month = {June},
year = {2025},
pages = {16325-16335}
}
Acknowledgement
We build our project based on gaussian-splatting and CLIP. The differentiable JPEG compression and VAE attack are implemented based on Diff-JPEG and WatermarkAttacker, respectively. We also follow the settings used in CopyRNeRF and WateRF. We sincerely thank them for their wonderful work and code release.