Hong Li*, Houyuan Chen*, Chongjie Ye$^\dagger$
Zhaoxi Chen, Bohan Li, Shaocong Xu,Xianda Guo
Xuhui Liu, Yikai Wang, Baochang Zhang, Satoshi Ikehata, Boxin Shi, Anyi Rao, Hao Zhao$^\ddagger$
* Equal contribution $^\dagger$ Part of project lead $^\ddagger$ Corresponding author
LINO-UniPS is a method for Univeral Photometric Stereo (PS). It predicts the normal map from a given set of images. Key features include:
PS-Verse, the training dataset.git clone https://github.com/houyuanchen111/lino.git
cd lino
conda create -n LINO python=3.10
conda activate LINO
pip install -r requirements.txt
Download the following benchmarks for evaluate our LiNO-UniPS.
data/ as the folloing directory tree.|-- data
DiLiGenT
βββ ballPNG
βββ ...
LUCES
βββ BALL
βββ ...
DiLiGenT_100
βββ BALL_ABS
βββ ...
DIR_pms
βββ 01_ElephantPNG
βββ ...
To evaluate the performance of LiNO-UniPS on the DiLiGenT, LUCES, and DiLiGenT10Β² benchmarks, run the corresponding scripts below. The pretrained model weights will be downloaded automatically on the first run of eval.py.
# DiLiGenT
python eval.py --task_name DiLiGenT --data_root data/DiLiGenT/ --num_images 16
# LUCES
python eval.py --task_name LUCES --data_root data/LUCES/ --num_images 16
# DiLIGenT10Β²
python eval.py --task_name DiLiGenT_100 --data_root data/DiLiGenT_100/ --num_images 16
# DIR
python eval.py --task_name DIR --data_root data/DIR_pms/ --num_images 64
The evaluation results will be stored in the output directory.
Note for DiLiGenT10Β²: The ground truth normals for this benchmark are withheld for official evaluation. To get your score, you must submit the predicted results, which are saved in .mat format inside the submit directory, to the official evaluation server.
The performance of our released model exceeds the results originally reported in our paper. For this comparison, the results for all competing Universal PS methods (UniPS, SDM-UniPS, Uni MS-PS) are the best scores as reported by the Uni MS-PS.
Table 1: DiLiGenT.
|
Table 2: LUCES.
|
Table 3: DiLiGenT10Β².
|
LINO-UniPS also demonstrates robust performance on multi-light images captured in-the-wild. In the data/Real_data/ directory, we provide two real-world scenes captured using a unique two-iPhone setup, where one device was used for recording and the other as a movable light source.
For more real-world data captured by camera, you can download from UniPS, SDM-UniPS.
After downloading, please place the extracted folders under the data/Real_data/ directory to match the following structure:
|-- data
|-- Real_data
A
βββ mask.png (optional)
βββ [Prefix (default: "L")] imgfile1
βββ [Prefix (default: "L")] imgfile2
βββ ...
B
βββ mask.png (optional)
βββ [Prefix (default: "L")] imgfile1
βββ [Prefix (default: "L")] imgfile2
βββ ...
Then, run the following scripts:
# Real_data. If the value provided for --num_images exceeds the total number of available images, the maximum available number will be used instead.
python eval.py --task_name Real --data_root data/Real_data/ --num_images 12
OLAT results correspond to issue #2. The data is sourced from the OpenIllumination, with a resolution of 3000x4096.
| Captured by iPhone | Captured by Camera (provided by UniPS, SDM-UniPS) | OLAT (OpenIllumination) | |||
|---|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() | |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
This gradio demo is a GUI interface that requires no expert knowledge, suitable for general users. To run the demo, first download the required data from this link. Then, unzip the archive and place its contents into the demo/ directory.
Simply run:
python app.py
You can also use it online. Click here.
Here, we provide a simple way to capture multi-light images.
PrepareWhat you need to prepare is:
Take PhotosKeep the camera and the subject stationary. Capture multiple images by moving the light source to a different position for each shot. For best results, we recommend capturing 4 or more images.
Process and PredictOrganize your captured images into a new folder and place it inside the data/Real_data/ directory. The images should be saved in .jpg or .png format.
For example:
|-- data
|-- Real_data
Your_Object_Name
βββ mask.png (optional)
βββ L_1.jpg
βββ L_2.jpg
βββ ...
mask.png is optional. If needed, it can be generated using RMBG-2.0.
This is for issue #3. The high-quality normals predicted by LINO-UniPS can be utilized as normal bridge for Hi3DGen to generate a high-quality mesh. Compared to vanilla Hi3DGen, the superior quality of the LINO-UniPS normals results in a generated mesh with substantially higher fidelity and richer details. For more results, please refer to the Home page and try it out at Live Demo.
![]() RGB | ![]() Hi3DGen | ![]() LINO-UniPS |
|
Mesh 1: The result of vanilla Hi3DGen. Vertices: 216308, Faces: 432602
Mesh 2: The result of Hi3DGen using the normal of LINO-UniPS.
Vertices: 362438, Faces: 725006
| Mesh 1 | Mesh 2 |
If you find this repository useful, please consider giving a star :star: and citation.
@article{li2025lightnormalsunifiedfeature,
title={Light of Normals: Unified Feature Representation for Universal Photometric Stereo},
author={Hong Li and Houyuan Chen and Chongjie Ye and Zhaoxi Chen and Bohan Li and Shaocong Xu and Xianda Guo and Xuhui Liu and Yikai Wang and Baochang Zhang and Satoshi Ikehata and Boxin Shi and Anyi Rao and Hao Zhao},
journal={arXiv preprint arXiv:2506.18882},
year={2025}
}
Python
99.8%
Hong Li*, Houyuan Chen*, Chongjie Ye$^\dagger$
Zhaoxi Chen, Bohan Li, Shaocong Xu,Xianda Guo
Xuhui Liu, Yikai Wang, Baochang Zhang, Satoshi Ikehata, Boxin Shi, Anyi Rao, Hao Zhao$^\ddagger$
* Equal contribution $^\dagger$ Part of project lead $^\ddagger$ Corresponding author
LINO-UniPS is a method for Univeral Photometric Stereo (PS). It predicts the normal map from a given set of images. Key features include:
PS-Verse, the training dataset.git clone https://github.com/houyuanchen111/lino.git
cd lino
conda create -n LINO python=3.10
conda activate LINO
pip install -r requirements.txt
Download the following benchmarks for evaluate our LiNO-UniPS.
data/ as the folloing directory tree.|-- data
DiLiGenT
βββ ballPNG
βββ ...
LUCES
βββ BALL
βββ ...
DiLiGenT_100
βββ BALL_ABS
βββ ...
DIR_pms
βββ 01_ElephantPNG
βββ ...
To evaluate the performance of LiNO-UniPS on the DiLiGenT, LUCES, and DiLiGenT10Β² benchmarks, run the corresponding scripts below. The pretrained model weights will be downloaded automatically on the first run of eval.py.
# DiLiGenT
python eval.py --task_name DiLiGenT --data_root data/DiLiGenT/ --num_images 16
# LUCES
python eval.py --task_name LUCES --data_root data/LUCES/ --num_images 16
# DiLIGenT10Β²
python eval.py --task_name DiLiGenT_100 --data_root data/DiLiGenT_100/ --num_images 16
# DIR
python eval.py --task_name DIR --data_root data/DIR_pms/ --num_images 64
The evaluation results will be stored in the output directory.
Note for DiLiGenT10Β²: The ground truth normals for this benchmark are withheld for official evaluation. To get your score, you must submit the predicted results, which are saved in .mat format inside the submit directory, to the official evaluation server.
The performance of our released model exceeds the results originally reported in our paper. For this comparison, the results for all competing Universal PS methods (UniPS, SDM-UniPS, Uni MS-PS) are the best scores as reported by the Uni MS-PS.
Table 1: DiLiGenT.
|
Table 2: LUCES.
|
Table 3: DiLiGenT10Β².
|
LINO-UniPS also demonstrates robust performance on multi-light images captured in-the-wild. In the data/Real_data/ directory, we provide two real-world scenes captured using a unique two-iPhone setup, where one device was used for recording and the other as a movable light source.
For more real-world data captured by camera, you can download from UniPS, SDM-UniPS.
After downloading, please place the extracted folders under the data/Real_data/ directory to match the following structure:
|-- data
|-- Real_data
A
βββ mask.png (optional)
βββ [Prefix (default: "L")] imgfile1
βββ [Prefix (default: "L")] imgfile2
βββ ...
B
βββ mask.png (optional)
βββ [Prefix (default: "L")] imgfile1
βββ [Prefix (default: "L")] imgfile2
βββ ...
Then, run the following scripts:
# Real_data. If the value provided for --num_images exceeds the total number of available images, the maximum available number will be used instead.
python eval.py --task_name Real --data_root data/Real_data/ --num_images 12
OLAT results correspond to issue #2. The data is sourced from the OpenIllumination, with a resolution of 3000x4096.
| Captured by iPhone | Captured by Camera (provided by UniPS, SDM-UniPS) | OLAT (OpenIllumination) | |||
|---|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() | |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
This gradio demo is a GUI interface that requires no expert knowledge, suitable for general users. To run the demo, first download the required data from this link. Then, unzip the archive and place its contents into the demo/ directory.
Simply run:
python app.py
You can also use it online. Click here.
Here, we provide a simple way to capture multi-light images.
PrepareWhat you need to prepare is:
Take PhotosKeep the camera and the subject stationary. Capture multiple images by moving the light source to a different position for each shot. For best results, we recommend capturing 4 or more images.
Process and PredictOrganize your captured images into a new folder and place it inside the data/Real_data/ directory. The images should be saved in .jpg or .png format.
For example:
|-- data
|-- Real_data
Your_Object_Name
βββ mask.png (optional)
βββ L_1.jpg
βββ L_2.jpg
βββ ...
mask.png is optional. If needed, it can be generated using RMBG-2.0.
This is for issue #3. The high-quality normals predicted by LINO-UniPS can be utilized as normal bridge for Hi3DGen to generate a high-quality mesh. Compared to vanilla Hi3DGen, the superior quality of the LINO-UniPS normals results in a generated mesh with substantially higher fidelity and richer details. For more results, please refer to the Home page and try it out at Live Demo.
![]() RGB | ![]() Hi3DGen | ![]() LINO-UniPS |
|
Mesh 1: The result of vanilla Hi3DGen. Vertices: 216308, Faces: 432602
Mesh 2: The result of Hi3DGen using the normal of LINO-UniPS.
Vertices: 362438, Faces: 725006
| Mesh 1 | Mesh 2 |
If you find this repository useful, please consider giving a star :star: and citation.
@article{li2025lightnormalsunifiedfeature,
title={Light of Normals: Unified Feature Representation for Universal Photometric Stereo},
author={Hong Li and Houyuan Chen and Chongjie Ye and Zhaoxi Chen and Bohan Li and Shaocong Xu and Xianda Guo and Xuhui Liu and Yikai Wang and Baochang Zhang and Satoshi Ikehata and Boxin Shi and Anyi Rao and Hao Zhao},
journal={arXiv preprint arXiv:2506.18882},
year={2025}
}
Python
99.8%