# MV-SAM3D reconstructs objects from several views instead of one

> MV-SAM3D is a multi-view 3D reconstruction framework that extends SAM 3D Objects to use observations from several viewpoints, with single-object and multi-object modes and a pose optimisation stage. It is a research code release with a custom licence, a paper on arXiv, and a dependency stack that includes bpy, spconv and xformers.

**devinli123/MV-SAM3D** — SAM 3D Objects with Multi-view Images

- Repository: https://github.com/devinli123/MV-SAM3D
- Stars: 559 · Forks: 51
- Language: Python
- License: NOASSERTION
- Published: 2026-10-22 · Updated: 2026-10-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/devinli123-mv-sam3d

## One image is the limit the framework is built to break

MV-SAM3D is a multi-view 3D reconstruction framework that extends SAM 3D Objects to use observations from multiple viewpoints. The stated goal is to produce more stable geometry, texture and scene-level consistency, and the comparison tables in the documentation make the argument visually, with a single-view baseline reconstructed from one input image next to a multi-view result built from eight inputs. The research question is a familiar one in computer vision. A single image of an object carries an ambiguity: the back of the object is never observed, so any reconstruction of it is a guess dressed as geometry, and the guess can differ from run to run. Several views of the same object resolve that ambiguity in the way you would expect, and the multi-object comparison in the documentation is a description of exactly that symptom, with a caption noting that shape and pose are often unstable in the single-view baseline, that multi-view improves object quality, and that the full model with pose optimisation gives improved overall scene alignment. The paper is available on arXiv at 2603.11633, and the citation is given as MV-SAM3D: Adaptive Multi-View Fusion for Layout-Aware 3D Generation.

## The data layout expects one folder per object

The data format is a directory tree, and the layout assumes the objects are already separated, which means the input preparation is part of the work rather than something the model discovers. The structure is a scene directory with an `images/` folder and then one subdirectory per object.

```text
scene/
├── images/
│   ├── 0.png
│   ├── 1.png
│   └── ...
├── object_a/
│   ├── 0.png
│   ├── 1.png
│   └── ...
├── object_b/
│   └── ...
└── ...
```

Mask files are RGBA PNG where alpha indicates the foreground, so the segmentation comes from the alpha channel rather than from a separate mask file, and the per-object folders hold the masked images for that object across the same views. The build script for the dataset takes the scene path and the object names, and a separate script runs the depth stage over an image directory.

```bash
python preprocessing/build_mvsam3d_dataset.py \
  --input data/your_scene \
  --objects keyboard,speaker,mug,stuffed_toy
```

```bash
python scripts/run_da3.py \
  --image_dir ./data/your_scene/images \
  --output_dir ./da3_outputs/your_scene
```

The second script produces a depth output that the inference command then consumes as a `.npz` file, so the pipeline is: prepare the dataset, run the depth stage, then run reconstruction.

## Inference for a single object, and the flags that matter

The single-object inference command takes an input path, a mask prompt naming the object, and a path for the depth output.

```bash
python run_inference_weighted.py \
  --input_path ./data/example \
  --mask_prompt stuffed_toy \
  --da3_output ./da3_outputs/example/da3_output.npz
```

For a scene with several objects, the mask prompt becomes a comma-separated list and two extra flags appear.

```bash
python run_inference_weighted.py \
  --input_path ./data/desk_objects0 \
  --mask_prompt keyboard,speaker,mug,stuffed_toy \
  --da3_output ./da3_outputs/desk_objects0/da3_output.npz \
  --merge_da3_glb \
  --run_pose_optimization
```

The `--merge_da3_glb` flag combines the per-object outputs into a single scene, and `--run_pose_optimization` enables the stage that the documentation's own comparison separates out as the difference between MV-SAM3D without pose optimisation and the full model. The defaults are listed separately in the documentation, and they are worth knowing because the weighted behaviour is on unless you change it. Stage 1 weighting is enabled with `stage1_entropy_alpha=30.0`, stage 2 weighting is enabled with `stage2_weight_source=entropy`, and the stage 2 alpha defaults are `stage2_entropy_alpha=30.0` and `stage2_visibility_alpha=30.0`.

## A dependency list that dictates the environment

The requirements tell you what kind of project this is. The list includes bpy at 4.3.0, which is Blender as a Python module, plus open3d, pymeshfix, point-cloud-utils, xatlas, polyscope and pyrender for geometry handling and visualisation. On the learning side there is hydra-core with the hydra-submitit-launcher, fvcore, mosaicml-streaming and webdataset, which is a data loading stack for large corpora. The training and quantisation side brings bitsandbytes, auto_gptq, peft and xformers at 0.0.28.post3, alongside spconv-cu121 for sparse convolution and nvidia-cuda-nvcc-cu12. The default environment sets `PIP_EXTRA_INDEX_URL` to the NVIDIA package index and the PyTorch cu121 wheel index, so a GPU is assumed rather than optional. There is also a git-referenced dependency, MoGe from Microsoft, pinned to a specific commit hash. The pyproject builds with hatchling and the hatch-requirements-txt plugin, with the dependencies read out of `requirements.txt` and optional dependency groups for p3d, inference and dev, each with its own requirements file.

## What the documentation does not tell you

There are real gaps, and for a research code release they are worth understanding before you invest time. The installation section is a pointer rather than a guide: it says to follow the environment setup from SAM 3D Objects and Depth Anything 3, so the real installation work lives in two other repositories. The licence is described only as being in the `LICENSE` file, and the recorded licence identifier is a custom one that GitHub cannot classify, so the terms have to be read directly before you use the output commercially, particularly since the output is 3D assets. There are no GitHub releases and no tagged versions, so there is nothing to pin and no changelog to consult, and the last push to the repository was on 2026-05-30. The results comparison is presented as rendered animations rather than as numbers, so there is no quantitative claim to check, and the captions describe the improvement qualitatively. The repository layout does suggest where the work is: `sam3d_objects/` holds the extended model code, `preprocessing/` the dataset build, `scripts/` the depth stage, `notebook/` for exploration, `environments/` for the environment definitions, and separate `run_inference.py` and `run_inference_weighted.py` entry points, so the unweighted path is still present alongside the one the documentation focuses on.

## Conclusion

Adopt MV-SAM3D if you are working on single-image 3D object reconstruction and have multi-view captures of the same scene available, and you are prepared to build the surrounding environment yourself. Skip it if you have a single image of a scene, since the multi-view fusion is the point, and skip it if you need a maintained package, because this is a research release with a custom licence and no tagged versions. Before you commit, set up the SAM 3D Objects and Depth Anything 3 environments as the documentation instructs, and check the data format the masks must follow.

## FAQ

### What does MV-SAM3D add to SAM 3D Objects?

It extends SAM 3D Objects to use observations from multiple viewpoints rather than a single image, and is designed to produce more stable geometry, texture and scene-level consistency. It supports both single-object and multi-object generation.

### How do I run multi-object inference with MV-SAM3D?

Run `run_inference_weighted.py` with an input path, a comma-separated `--mask_prompt` list of object names, a `--da3_output` path for the depth output, plus `--merge_da3_glb` to combine the objects and `--run_pose_optimization` to enable the pose stage.

### What data format does MV-SAM3D expect?

A scene directory containing an `images/` folder and one subdirectory per object, each holding the masked images for that object across the views. Mask files are RGBA PNG where the alpha channel indicates the foreground.

### What are the default weighting settings in MV-SAM3D?

Stage 1 weighting is enabled with `stage1_entropy_alpha=30.0`, stage 2 weighting is enabled with `stage2_weight_source=entropy`, and the stage 2 alpha defaults are `stage2_entropy_alpha=30.0` and `stage2_visibility_alpha=30.0`.

## Sources

- [devinli123/MV-SAM3D on GitHub](https://github.com/devinli123/MV-SAM3D)
- [Issues](https://github.com/devinli123/MV-SAM3D/issues)
- [README](https://github.com/devinli123/MV-SAM3D/blob/main/README.md)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/devinli123-mv-sam3d
