Skip to main content

D2NT: A High-Performing Depth-to-Normal Translator

Project description

D2NT: A High-Performing Depth-to-Normal Translator

This repo is the official implementation of the paper:

"D2NT: A High-Performing Depth-to-Normal Translator"

[arXiv] [homepage] [video]

compare

trade-off

Installation

Install from PyPI (Recommended)

pip install d2nt

Install from Source

# Clone the repository
git clone https://github.com/fengyi233/depth-to-normal-translator.git
cd depth-to-normal-translator

# Install in development mode
pip install -e .

# Or install normally
pip install .

Prerequisites

  • Python >= 3.7
  • numpy >= 1.20.0
  • opencv-python >= 4.0.0
  • matplotlib >= 3.5.0 (optional, for visualization)

Dataset Preparation

Public real-world datasets generally obtain surface normals by local plane fitting, which makes the surface normal ground truth unreliable. Therefore, we use the synthesis 3F2N dataset provided in this paper to evaluate estimation performance.

The 3F2N dataset can be downloaded from:
GoogleDrive
The dataset is organized as follows:

3F2N
 |-- Easy
 |  |-- android
 |  |  |-- depth
 |  |  |-- normal
 |  |  |-- params.txt
 |  |  |-- pose.txt
 |  |-- cube
 |  |-- ...
 |  |-- torusknot
 |-- Medium
 |  |-- ...
 |-- Hard
 |  |-- ...

Usage

Python Package Usage

After installation, you can use the depth2normal() function directly:

import numpy as np
from d2nt import depth2normal

# Prepare depth map (example)
depth = np.random.rand(480, 640) * 10.0

cam_intrinsic = np.array([
    [525.0, 0, 320.0],  # fx=525.0, u0=320.0
    [0, 525.0, 240.0],  # fy=525.0, v0=240.0
    [0, 0, 1]
])

# Convert depth to normal
normal = depth2normal(depth, cam_intrinsic, version='d2nt_v3')

print(f"Normal map shape: {normal.shape}")  # (480, 640, 3)

Algorithm Versions

  • d2nt_basic: Basic version without any optimization method
  • d2nt_v2: With Discontinuity-Aware Gradient (DAG) filter
  • d2nt_v3: With DAG filter and MRF-based Normal Refinement (MNR) module (recommended)

Python Demo

Run the demo script in the root directory to see visualization results and error maps:

python demo.py

This will display:

  • Ground truth normal map
  • Estimated normal map
  • Error map (in degrees) with mean angular error

The demo uses test data from demo_data/ directory. The results will be saved in demo_results/ directory.

You can change the VERSION parameter in demo.py to select different D2NT versions:

  • d2nt_basic: Basic version without any optimization method
  • d2nt_v2: With Discontinuity-Aware Gradient (DAG) filter
  • d2nt_v3: With DAG filter and MRF-based Normal Refinement (MNR) module (recommended)

Coordinate System and Normal Visualization

Coordinate System

The normal vectors returned by depth2normal() are defined in the camera coordinate system:

  • X-axis (nx): Points to the right in the image
  • Y-axis (ny): Points downward in the image
  • Z-axis (nz): Points forward into the image plane

The normal vectors are normalized unit vectors with values in the range [-1, 1] for each component.

Normal Visualization

This package provides visualization functions that convert normal vectors to RGB images for display:

from d2nt import get_normal_vis, get_normal_vis_reference
import matplotlib.pyplot as plt

# Visualize normal map
normal_vis = get_normal_vis(normal, valid_mask=mask)
plt.imshow(normal_vis)

# Generate normal visualization reference
plt.imsave("normal_vis_reference.png", get_normal_vis_reference())

Visualization Formula: The visualization uses the formula:

normal_img = (1 - normal) / 2

This formula maps normal vectors from the range [-1, 1] to [0, 1] for RGB display. This convention is chosen to match the 3F2N dataset ground truth encoding, where normal maps are stored with this specific encoding scheme.

Note on Different Conventions: Other projects (e.g., DSINE) may use the alternative formula (normal + 1) / 2 for visualization, which is also valid. However, when comparing results or using different datasets, it is important to be aware of which convention is being used, as the color mapping will be inverted. The get_normal_vis() function in this package uses (1 - normal) / 2 to maintain consistency with the 3F2N dataset format.

Cite

If you find our work useful in your research, please consider citing our paper:

@inproceedings{feng2023d2nt,
	author      = {{Yi Feng, Bohuan Xue, Ming Liu, Qijun Chen, and Rui Fan}},
	title       = {{D2NT: A High-Performing Depth-to-Normal Translator}},
	booktitle   = {{IEEE International Conference on Robotics and Automation (ICRA)}},
	year        = {{2023}}
}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

d2nt-0.1.2.tar.gz (6.5 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

d2nt-0.1.2-py3-none-any.whl (10.6 kB view details)

Uploaded Python 3

File details

Details for the file d2nt-0.1.2.tar.gz.

File metadata

  • Download URL: d2nt-0.1.2.tar.gz
  • Upload date:
  • Size: 6.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.8.16

File hashes

Hashes for d2nt-0.1.2.tar.gz
Algorithm Hash digest
SHA256 0f4f98c95488b7d1c7eb3d5cce1c43227d6b68856f1af06c4e97530526a4be56
MD5 bb156d7730038a41f2570d90149267fc
BLAKE2b-256 b56cfeb828a22fb5933257dc74491e0204744e516d1d9a6436f7a6a53410d907

See more details on using hashes here.

File details

Details for the file d2nt-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: d2nt-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 10.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.8.16

File hashes

Hashes for d2nt-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e606d240124b6263a95056c4c123d5cd03e9a1b2f6844bcf78a1115c5064c49a
MD5 26ec212ef57cf8aa1a7b03cf4475e63c
BLAKE2b-256 223686a6f1f9da34c2fa13ebb32ab924188cb5184a7c3f718da0a4f86caa20fd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page