TransNormal / README.md
Longxiang-ai's picture
Update TransNormal model card usage
796f97a verified
|
Raw
History Blame Contribute Delete
5.19 kB
---
license: cc-by-nc-4.0
library_name: diffusers
pipeline_tag: image-to-image
inference: false
base_model:
- stabilityai/stable-diffusion-2-base
datasets:
- Longxiang-ai/TransNormal-Synthetic
tags:
- normal-estimation
- surface-normal-estimation
- transparent-objects
- diffusion
- dinov3
- image-to-image
- computer-vision
- robotics
---
# TransNormal
Official model weights for **TransNormal: Dense Visual Semantics for Diffusion-based Transparent Object Normal Estimation** (ICML 2026).
TransNormal estimates camera-space surface normal maps from a single RGB image, with a focus on transparent objects such as laboratory glassware. The model adapts Stable Diffusion 2 as a single-step normal regressor and injects dense DINOv3 visual semantics through cross-attention.
**Links:** [Paper](https://arxiv.org/abs/2602.00839) | [Project page](https://longxiang-ai.github.io/TransNormal/) | [Code](https://github.com/longxiang-ai/TransNormal) | [Dataset](https://huggingface.co/datasets/Longxiang-ai/TransNormal-Synthetic)
> **Important:** The generic Hugging Face / Diffusers "Use this model" snippet is not sufficient for this repository. TransNormal uses a custom pipeline and requires a DINOv3 backbone in addition to the weights stored here. Please use the instructions below.
## What This Repository Contains
This model repository contains:
- Fine-tuned TransNormal diffusion pipeline weights.
- `cross_attention_projector.pt`, the DINOv3-to-U-Net cross-attention projector.
- SD2-compatible VAE, U-Net, tokenizer, scheduler, and config files.
This repository does **not** contain the DINOv3 backbone weights. Download them separately as described below.
## Installation
```bash
git clone https://github.com/longxiang-ai/TransNormal.git
cd TransNormal
conda create -n TransNormal python=3.10 -y
conda activate TransNormal
pip install -r requirements.txt
```
The code requires `transformers>=4.56.0` for Hugging Face DINOv3 support. BF16 is recommended for DINOv3 inference.
## Download Weights
Download the TransNormal weights from this repository:
```bash
pip install huggingface_hub
python -c "from huggingface_hub import snapshot_download; snapshot_download('Longxiang-ai/TransNormal', local_dir='./weights/transnormal')"
```
Download the DINOv3 ViT-H+/16 backbone separately:
```bash
python -c "from huggingface_hub import snapshot_download; snapshot_download('facebook/dinov3-vith16plus-pretrain-lvd1689m', local_dir='./weights/dinov3_vith16plus')"
```
Access to DINOv3 may require approval from Meta / Hugging Face. See the [DINOv3 repository](https://github.com/facebookresearch/dinov3) and [Meta AI DINOv3 downloads](https://ai.meta.com/resources/models-and-libraries/dinov3-downloads/) for details.
## Python Usage
```python
import torch
from transnormal import TransNormalPipeline, create_dino_encoder, save_normal_map
device = "cuda"
dtype = torch.bfloat16
dino_encoder = create_dino_encoder(
model_name="dinov3_vith16plus",
weights_path="./weights/dinov3_vith16plus",
projector_path="./weights/transnormal/cross_attention_projector.pt",
device=device,
dtype=dtype,
freeze_encoder=True,
)
pipe = TransNormalPipeline.from_pretrained(
"./weights/transnormal",
dino_encoder=dino_encoder,
torch_dtype=dtype,
safety_checker=None,
)
pipe = pipe.to(device)
normal_map = pipe(
image="path/to/image.jpg",
timestep=999,
output_type="np",
)
save_normal_map(normal_map, "output_normal.png")
```
## Command Line Usage
Single image:
```bash
python inference.py \
--image path/to/image.jpg \
--output normal.png \
--model_path ./weights/transnormal \
--dino_path ./weights/dinov3_vith16plus \
--projector_path ./weights/transnormal/cross_attention_projector.pt \
--timestep 999
```
Batch inference:
```bash
python inference_batch.py \
--input_dir ./examples/input \
--output_dir ./examples/output \
--model_path ./weights/transnormal \
--dino_path ./weights/dinov3_vith16plus \
--timestep 999
```
## Output Format
The output is a normal-map visualization in `[0, 1]`, where `0.5` represents zero for each normal component. See the [GitHub README](https://github.com/longxiang-ai/TransNormal#output-format) for the current camera-coordinate convention and saving utilities.
## Dataset
The accompanying **TransNormal-Synthetic** dataset is available at:
https://huggingface.co/datasets/Longxiang-ai/TransNormal-Synthetic
It provides physics-based rendered transparent labware scenes with RGB images, surface normal maps, depth maps, masks, material variants, and camera metadata.
## License
This model is released under [CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/). For commercial licensing inquiries, please contact the authors.
## Citation
If you find this work useful, please cite:
```bibtex
@misc{li2026transnormal,
title={TransNormal: Dense Visual Semantics for Diffusion-based Transparent Object Normal Estimation},
author={Mingwei Li and Hehe Fan and Yi Yang},
year={2026},
eprint={2602.00839},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2602.00839},
}
```