需先安装 Rust 1.88+;Web 端仅支持 Chrome 134+ 的 Windows 与 macOS;Android 构建需单独安装 SDK/NDK 并用 cargo ndk 编译 Rust 代码,Android Studio 不会自动重建。
brush
ArthurBrusseeApache-2.0活跃维护用 Rust 实现的 3D 重建与高斯泼溅训练工具,让普通显卡也能跑三维重建,降低使用门槛。
3D Reconstruction for all
cargo run --releaseREADME 未说明具体显存要求;支持 macOS/Windows/Linux、AMD/Nvidia/Intel 显卡、Android 及浏览器,Web 端需 Chrome 134+(Windows/macOS)。
基于高斯泼溅的跨平台 3D 重建引擎,无需 CUDA 依赖即可在多种设备上训练与查看
用 Rust 实现的 3D 重建与高斯泼溅训练工具,让普通显卡也能跑三维重建,降低使用门槛。
核心能力
- 用高斯泼溅从 COLMAP 或 Nerfstudio 数据训练 3D 场景
- 基于 WebGPU 与 Burn 框架,覆盖 AMD/Nvidia/Intel 显卡
- 训练中可实时交互查看渲染效果并对比输入视图
- 支持透明图与 masks 文件夹遮罩训练区域
- 可作 splat 查看器加载 .ply 与 .compressed.ply 并支持 URL 流式加载
容易踩的坑
- v0.3.0最新正式版2025-09-14 · 2025-09-14 17:39 UTC
<video src=https://github.com/user-attachments/assets/5756967a-846c-44cf-bde9-3ca4c86f1a4d>A video showing various Brush features and scenes
Brush 0.3 is a massive update to bring high quality splats to all platforms, while training faster, and bringing a ton of new features!
Brush now trains using the "MCMC" splatting technique, but, with its own variation that still grows splats automatically. This keeps the best of both worlds: splats grow first where they are needed, yet explore the scene like in MCMC, to improve quality. This table has some preliminary results. You can set a limit of the maximum number of splats like in the original MCMC. Training works especially better on large scenes where not all views are visible from all angles. Training now also supports massive datasets bigger than RAM and starts instantly.
The web version also gains a lot of new features, with fullscreen modes, efficient file loading, directory loading, bundler integration, NPM compatibility, and faster training. Training on the web is not nearly at feature parity with the desktop version.
Release Note Highlights:
Training
- "MCMC like" training. Higher quality and more robust. Still grows splats automatically like previous methods, while also allowing a maximum nr. of splats cap. For a more detailled write up, see this PR
- Train on datasets bigger than RAM. Only up to some amount of gigs are cached, other files are loaded by the dataloader while training. [1]
- Start training faster [1]
- Training bounds are now based on the splat bounds instead of the camera bounds [1] [2]
- Improve backwards speed with thanks to @fhahlbohm [1] [2] [3] [4] [5] [6] [7]
- Always use
init.plyas the init for the training if it exists [1] - Prefer colmap datasets over nerfstudio, fixes import if your dataset has some random json in it [1]
- Add LPIPS loss [1] [2]
- Use a separable convolution for SSIM [1]
- Lots of other tweaks to the training dynamics, bug fixes, version bumps etc.
UI
- The UI has gone through some redesigns to be cleaner and easier to use
- Add a grid widget [1]
- The arrow keys now rotate the model and move it up/down. Combined with the grid this is helpful to align the ground. [[1]](https://github.com/ArthurBrussee/
- 0.2.02025-01-30 · 2025-01-30 00:05 UTC
查看更新说明
Brush 0.2 goes from a proof of concept to a tool ready for real world data! It still only implements the “basics” of Gaussian Splatting, but trains as fast as gsplat to a (slightly) higher quality than gsplat. It also comes with nicer workflows, a CLI, dynamic gaussian rendering, and lots of other new features.
The next release will focus on going beyond the basics of Gaussian Splatting, and implementing extensions that help to make Brush more robust, faster, and higher quality than other splatting alternatives. This might mean that the outputs are no longer 100% compatible with other splat viewers, so more work will also be done to make the Brush web viewer a great experience.
Features
-
Brush now measures higher PSNR/SSIM than gsplat on the mipnerf360 scenes. Of course, gsplat with some more tuned settings might reach these numbers as well, but this shows Brush is grown up now!
- See the results table
-
Faster training overall by optimizing the kernels, fixing various slowdowns, and reducing memory use.
-
Brush now has a CLI!
- Simply run brush –help to get an overview. The basic usage is brush PATH –args.
- Any command works with
--with-viewerwhich opens the UI for easy debugging.
-
Add flythrough controls supporting both orbiting, FPS controls, flythrough controls, and panning.
- See the ‘controls’ popout in the scene view for a full overview.
-
Load data from a URL. If possible the data will be streamed in, and the splat will update in real-time. -For a web version, just pass in ?url=
-
On the web, pass in ?zen=true to enable ‘zen’ mode which makes the viewer fullscreen.
-
Add support for viewing dynamic splats
- Either loaded as a sequence of PLY files (in a folder or zip)
- Or as a custom data format “ply with delta frames”
- This was used for Cat4D and for Cap4D
- Felix kindly shared their script to export this data for reference.
-
Open directories directly, instead of only zip files.
- ZIP files are still supported for all operations - as this is important for the web version.
-
Support transparent images.
- Images with alpha channels will force the output splat to match this transparency.
- Alternatively, you can include a folder of ‘masks’. This will ignore those parts of the image while training.
-
More flexible COLMAP & nerfstudio dataset format
-
Support more of the various options, and differing file structures.
-
If your dataset has a single ply file, it will be used for the initial point cloud.
-
While training, the up-axis is rotated such that the ground is flat (thanks to @fhahlbohm)
- Note: The exported ply will however still match your input data. I’m investigating how to best handle this in the future - either as an option to rotate the splat, or by writing metadata into the exported splat.
-
Enhancements
- Add alpha_loss_weight arg to control how heavy to weigh the alpha loss
- Nb: not applicable to masks mode
- Log memory usage to rerun while training
- Fix SH clamping values to 0 (#76 thanks to @fhahlbohm)
- Better logic to pick ‘nearest’ dataset view
- Better splat pruning logic
- Remove ESC to close
- The web version has SSIM enabled again
- Display more detailed error traces in the UI and CLI when something goes wrong
- Different method of emitting tile intersections (#63 for details)
- Fixes some potential corruptions depending on your driver/shader compiler.
- Read up-axis from PLY file if it’s included
- Eval PSNR/SSIM now simulate a 8 bit roundt
-
- brush-0.0.1Brush 0.0.12024-11-12 · 2024-11-12 17:38 UTC
查看更新说明
Initial release
This is the initial release of Brush, see the README for more information on the project!
Release notes since the original OS release:
-
Add ability to train with transparent images
-
Add option to select GPU with the CUBECL_DEFAULT_DEVICE environment variable
-
Add 2D image trainer example
-
Tweak splitting cloning logic, adds +- 0.5 PSNR
-
Fixed backwards gradient for quaternions & SH
-
Fix exporting ply files
-
Fix evaluation not running
-
Fix some NaNs on the web version
-
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Brush
<video src=https://github.com/user-attachments/assets/5756967a-846c-44cf-bde9-3ca4c86f1a4d>A video showing various Brush features and scenes
Brush is a 3D reconstruction engine using Gaussian splatting. It works on a wide range of systems: macOS/windows/linux, AMD/Nvidia/Intel cards, Android, and in a browser. To achieve this, it uses WebGPU compatible tech and the Burn machine learning framework.
Machine learning for real time rendering has tons of potential, but most ML tools don't work well with it: Rendering requires realtime interactivity, usually involve dynamic shapes & computations, don't run on most platforms, and it can be cumbersome to ship apps with large CUDA deps. Brush on the other hand produces simple dependency free binaries, runs on nearly all devices, without any setup.
Try the web demo NOTE: Only works on Chrome and Edge. Firefox and Safari are hopefully supported soon)
Features
Training
Brush takes in COLMAP data or datasets in the Nerfstudio format. Training is fully supported natively, on mobile, and in a browser. While training you can interact with the scene and see the training dynamics live, and compare the current rendering to input views as the training progresses.
It also supports masking images:
- Images with transparency. This will force the final splat to match the transparency of the input.
- A folder of images called 'masks'. This ignores parts of the image that are masked out.
Black pixels in the mask are ignored, white pixels are kept. Pass
--invert-masksif your masks are the other way around.
Viewer
Brush also works well as a splat viewer, including on the web. It can load .ply & .compressed.ply files. You can stream in data from a URL (for a web app, simply append ?url=).
Brush also can load .zip of splat files to display them as an animation, or a special ply that includes delta frames (see cat-4D and Cap4D!).
CLI
Brush can be used as a CLI. Run brush --help to get an overview. Every CLI command can work with --with-viewer which also opens the UI, for easy debugging.
Rerun
https://github.com/user-attachments/assets/f679fec0-935d-4dd2-87e1-c301db9cdc2c
While training, additional data can be visualized with the excellent rerun. To install rerun on your machine, please follow their instructions. Open the ./brush_blueprint.rbl in the viewer for best results.
Building Brush
First install rust 1.88+. You can run tests with cargo test --all. Brush uses the wonderful rerun for additional visualizations while training, run cargo install rerun-cli if you want to use it.
Windows/macOS/Linux
Use cargo run --release from the workspace root to make an optimized build. Use cargo run to run a debug build.
Web
Brush can be compiled to WASM. Run npm run dev to start the demo website using Next.js, see the web directory in app/brush-app/web.
Brush uses wasm-pack to build the WASM bundle. You can also use it without a bundler, see wasm-pack's documentation.
WebGPU is still an upcoming standard, and as such, only Chrome 134+ on Windows and macOS is currently supported.
Android
As a one time setup, make sure you have the Android SDK & NDK installed.
- Check if ANDROID_NDK_HOME and ANDROID_HOME are set
- Add the Android target to rust
rustup target add aarch64-linux-android - Install cargo-ndk to manage building a lib
cargo install cargo-ndk
Each time you change the rust code, run
cargo ndk -t arm64-v8a -o crates/brush-app/app/src/main/jniLibs/ build- Nb: Nb, for best performance, build in release mode. This is separate from the Android Studio app build configuration.
cargo ndk -t arm64-v8a -o crates/brush-app/app/src/main/jniLibs/ build --release
You can now either run the project from Android Studio (Android Studio does NOT build the rust code), or run it from the command line:
./gradlew build
./gradlew installDebug
adb shell am start -n com.splats.app/.MainActivity
You can also open this folder as a project in Android Studio and run things from there. Nb: Running in Android Studio does not rebuild the rust code automatically.
Benchmarks
Rendering and training are generally faster than gsplat. You can run benchmarks of some of the kernels using cargo bench.
Acknowledgements
gSplat, for their reference version of the kernels
Peter Hedman, George Kopanas & Bernhard Kerbl, for the many discussions & pointers.
The Burn team, for help & improvements to Burn along the way
Raph Levien, for the original version of the GPU radix sort.
GradeEterna, for feedback and their scenes.
Disclaimer
This is not an official Google product. This repository is a forked public version of the google-research repository