Integrate LINO_UniPS photometric stereo normal estimation directly into your Meshroom photogrammetry pipeline.
LINO_UniPS is a universal photometric stereo method based on a light-invariant normal estimator. It predicts high-quality per-pixel surface normals from multi-lighting images without requiring known light directions. The method leverages diffusion model priors and handles arbitrary numbers of input images with varying illumination conditions.
- Python 3.10+
- CUDA 12.x + NVIDIA GPU (ampere or newer recommended for bfloat16 support)
- Meshroom 2025+ (develop branch)
Prerequisite: a working Meshroom installation.
cd /path/to/your/plugins
git clone https://github.com/meshroomHub/mrLINOUniPS.git
cd mrLINOUniPSMeshroom looks for a folder named venv at the plugin root.
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install torch torchvision
pip install -r requirements.txt
deactivateThis installs LINO_UniPS and all its dependencies automatically via pip.
bash download_weights.shThis downloads the pretrained model (~338 MB) from HuggingFace into weights/:
weights/
└── lino.pth
The plugin auto-detects this file. No config.json needed.
export MESHROOM_PLUGINS_PATH=/path/to/your/plugins/mrLINOUniPS:$MESHROOM_PLUGINS_PATHLaunch Meshroom: the LINOUniPS node appears under Photometric Stereo.
| Parameter | Label | Description |
|---|---|---|
inputSfm |
Input SfMData | SfMData JSON file with multi-lighting views grouped by poseId (required) |
maskFolder |
Mask Folder | Folder with mask PNGs named by poseId or viewId |
downscale |
Downscale Factor | Integer downscale factor for input images (1-8, default: 1) |
nbImages |
Number of Images | Number of lighting images per pose (-1 = all) |
useGpu |
Use GPU | Use GPU for inference (default: true) |
| Parameter | Description |
|---|---|
outputFolder |
Folder containing normal map PNGs |
outputSfmDataNormal |
SfMData file referencing normal maps |
If you prefer to work from a local LINO_UniPS clone instead of pip install:
- Clone the repo:
git clone -b meshroom https://github.com/meshroomHubWarehouse/LINO_UniPS.git - Edit
meshroom/config.json:[ {"key": "LINO_UNIPS_PATH", "type": "path", "value": "/path/to/LINO_UniPS"} ] - Place
lino.pthin the LINO_UniPS directory or itsweights/subdirectory.
The node searches for weights in this order:
- Plugin
weights/directory - LINO_UniPS code directory (from config.json)
- Torch hub cache (
~/.cache/torch/hub/checkpoints/lino.pth)
mrLINOUniPS/
├── meshroom/
│ ├── config.json # Plugin configuration (optional for dev)
│ └── LINOUniPS/
│ ├── __init__.py
│ └── LINOUniPS.py # Meshroom node definition
├── weights/ # Downloaded model weights
│ └── lino.pth
├── venv/ # Python virtual environment
├── download_weights.sh # Weight download script
├── requirements.txt # Python dependencies (pip install from git)
└── README.md
For more details on how Meshroom plugins work, see:
- Meshroom Plugin Install Guide
- mrHelloWorld: step-by-step tutorials for building Meshroom plugins
This work is supported by DOPAMIn (Diffusion Open de Photogrammetrie par AliceVision/Meshroom pour l'Industrie), selected in the 2024 cohort of the OPEN programme run by CNRS Innovation. OPEN supports the valorization of open-source scientific software by providing dedicated developer resources, governance expertise, and industry partnership support.
Lead researcher: Jean-Denis Durou, IRIT (INP-Toulouse)
| Project | Description |
|---|---|
| LINO_UniPS | Light-invariant normal estimator for universal photometric stereo |
| mrSDMUniPS | Meshroom plugin for SDM-UniPS photometric stereo |
| mrOpenRNb | Meshroom plugin for neural surface reconstruction from normals |
This project is licensed under the Mozilla Public License 2.0.