# haian-jin/tensoir architecture

> Architecture diagram of the GitHub repository haian-jin/tensoir, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/haian-jin/tensoir
- Repository: https://github.com/haian-jin/tensoir

## Overview

TensoIR is a PyTorch inverse-rendering system for learning scene geometry, materials, and lighting from multi-view images. Its main workflow loads scene images and lighting, trains a tensor-factorized scene representation, then renders learned-lighting views or relights the scene under unseen environment maps; it can also export a mesh. The README documents single-light, rotated multi-light, general multi-light, and optional NeRF-Synthetic training modes. Internal links are limited to relationships supported by the README or source-index references; several implementation details were not sampled.

Main entry points: [`renderer.py`](https://github.com/haian-jin/tensoir/blob/main/renderer.py) (Renderer), [`models/tensoRF_rotated_lights.py`](https://github.com/haian-jin/tensoir/blob/main/models/tensoRF_rotated_lights.py) (Rotated Tensor Field), [`opt.py`](https://github.com/haian-jin/tensoir/blob/main/opt.py) (Run Configuration), [`scripts/relight_importance.py`](https://github.com/haian-jin/tensoir/blob/main/scripts/relight_importance.py) (Relight Sampling)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_inputs["Scene Inputs"]
  node_scene_data[("Scene Images")]
  node_environment_maps[("Environment Maps")]
  node_config["Run Configuration<br/>[opt.py]"]
  node_camera_rays["Camera Rays<br/>[ray_utils.py]"]
  node_blender_data["Blender Dataset<br/>[blender.py]"]
  node_single_data["Single-Light Dataset<br/>[tensoIR_simple.py]"]
  node_rotated_data["Rotated-Light Dataset"]
  node_general_data["General-Light Dataset"]
end

subgraph group_learning["Scene Learning"]
  node_training_single["Single-Light Training<br/>[train_tensoIR.py]"]
  node_training_simple["NeRF-Synthetic Training"]
  node_training_rotated["Rotated-Light Training"]
  node_training_general["General-Light Training"]
  node_rotated_field["Rotated Tensor Field"]
  node_general_field["General Tensor Field"]
  node_base_field["Tensor Field Base"]
  node_general_base["General Field Base"]
  node_initial_field["Initial Tensor Field<br/>[tensoRF_init.py]"]
  node_shading["SH Lighting Basis<br/>[sh.py]"]
end

subgraph group_rendering["Rendering and Relighting"]
  node_relight_math["Relighting Utilities<br/>[relight_utils.py]"]
  node_renderer["Renderer<br/>[renderer.py]"]
  node_importance["Relight Sampling"]
end

subgraph group_outputs["Analysis and Outputs"]
  node_mesh_export["Mesh Export<br/>[export_mesh.py]"]
  node_metrics["Image Metrics<br/>[utils.py]"]
  node_results[("Rendered Results")]
end

node_researcher(("Researcher"))

node_researcher -->|"sets options"| node_config
node_scene_data -.->|"loads images"| node_single_data
node_environment_maps -->|"loads lighting"| node_general_data
node_camera_rays -->|"generates rays"| node_single_data
node_camera_rays -->|"generates rays"| node_rotated_data
node_camera_rays -->|"generates rays"| node_general_data
node_config -->|"configures run"| node_training_single
node_config -->|"configures run"| node_training_simple
node_config -->|"configures run"| node_training_rotated
node_config -->|"configures run"| node_training_general
node_single_data -.->|"provides samples"| node_training_single
node_blender_data -.->|"provides samples"| node_training_simple
node_rotated_data -->|"provides samples"| node_training_rotated
node_general_data -->|"provides samples"| node_training_general
node_training_single -->|"trains model"| node_rotated_field
node_training_simple -->|"trains model"| node_rotated_field
node_training_rotated -->|"trains model"| node_rotated_field
node_training_general -->|"trains model"| node_general_field
node_rotated_field -->|"extends field"| node_base_field
node_general_field -->|"extends field"| node_general_base
node_base_field -->|"evaluates basis"| node_shading
node_general_base -->|"evaluates basis"| node_shading
node_relight_math -->|"uses alpha conversion"| node_initial_field
node_renderer -->|"renders BRDF"| node_relight_math
node_training_single -->|"renders tests"| node_renderer
node_training_simple -->|"renders tests"| node_renderer
node_training_rotated -->|"renders tests"| node_renderer
node_training_general -->|"renders tests"| node_renderer
node_researcher -->|"requests relighting"| node_importance
node_importance -->|"loads checkpoint"| node_rotated_field
node_importance -->|"renders relighting"| node_renderer
node_importance -->|"samples unseen light"| node_environment_maps
node_renderer -->|"computes metrics"| node_metrics
node_renderer -->|"saves renders"| node_results
node_researcher -->|"requests extraction"| node_mesh_export
node_mesh_export -->|"loads checkpoint"| node_rotated_field
node_mesh_export -->|"writes mesh"| node_results

click node_config "https://github.com/haian-jin/tensoir/blob/main/opt.py"
click node_camera_rays "https://github.com/haian-jin/tensoir/blob/main/dataLoader/ray_utils.py"
click node_blender_data "https://github.com/haian-jin/tensoir/blob/main/dataLoader/blender.py"
click node_single_data "https://github.com/haian-jin/tensoir/blob/main/dataLoader/tensoIR_simple.py"
click node_rotated_data "https://github.com/haian-jin/tensoir/blob/main/dataLoader/tensoIR_rotation_setting.py"
click node_general_data "https://github.com/haian-jin/tensoir/blob/main/dataLoader/tensoIR_general_multi_lights.py"
click node_training_single "https://github.com/haian-jin/tensoir/blob/main/train_tensoIR.py"
click node_training_simple "https://github.com/haian-jin/tensoir/blob/main/train_tensoIR_simple.py"
click node_training_rotated "https://github.com/haian-jin/tensoir/blob/main/train_tensoIR_rotated_multi_lights.py"
click node_training_general "https://github.com/haian-jin/tensoir/blob/main/train_tensoIR_general_multi_lights.py"
click node_rotated_field "https://github.com/haian-jin/tensoir/blob/main/models/tensoRF_rotated_lights.py"
click node_general_field "https://github.com/haian-jin/tensoir/blob/main/models/tensoRF_general_multi_lights.py"
click node_base_field "https://github.com/haian-jin/tensoir/blob/main/models/tensorBase_rotated_lights.py"
click node_general_base "https://github.com/haian-jin/tensoir/blob/main/models/tensorBase_general_multi_lights.py"
click node_initial_field "https://github.com/haian-jin/tensoir/blob/main/models/tensoRF_init.py"
click node_shading "https://github.com/haian-jin/tensoir/blob/main/models/sh.py"
click node_relight_math "https://github.com/haian-jin/tensoir/blob/main/models/relight_utils.py"
click node_renderer "https://github.com/haian-jin/tensoir/blob/main/renderer.py"
click node_importance "https://github.com/haian-jin/tensoir/blob/main/scripts/relight_importance.py"
click node_mesh_export "https://github.com/haian-jin/tensoir/blob/main/scripts/export_mesh.py"
click node_metrics "https://github.com/haian-jin/tensoir/blob/main/utils.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_scene_data,node_environment_maps,node_config,node_camera_rays,node_blender_data,node_single_data,node_rotated_data,node_general_data toneBlue
class node_training_single,node_training_simple,node_training_rotated,node_training_general,node_rotated_field,node_general_field,node_base_field,node_general_base,node_initial_field,node_shading toneAmber
class node_relight_math,node_renderer,node_importance toneMint
class node_mesh_export,node_metrics,node_results toneRose
class node_researcher toneIndigo
```

## Components

### Scene Inputs

- **Scene Images**
- **Environment Maps**
- [Run Configuration](https://github.com/haian-jin/tensoir/blob/main/opt.py): `opt.py`
- [Camera Rays](https://github.com/haian-jin/tensoir/blob/main/dataLoader/ray_utils.py): `dataLoader/ray_utils.py`
- [Blender Dataset](https://github.com/haian-jin/tensoir/blob/main/dataLoader/blender.py): `dataLoader/blender.py`
- [Single-Light Dataset](https://github.com/haian-jin/tensoir/blob/main/dataLoader/tensoIR_simple.py): `dataLoader/tensoIR_simple.py`
- [Rotated-Light Dataset](https://github.com/haian-jin/tensoir/blob/main/dataLoader/tensoIR_rotation_setting.py): `dataLoader/tensoIR_rotation_setting.py`
- [General-Light Dataset](https://github.com/haian-jin/tensoir/blob/main/dataLoader/tensoIR_general_multi_lights.py): `dataLoader/tensoIR_general_multi_lights.py`

### Scene Learning

- [Single-Light Training](https://github.com/haian-jin/tensoir/blob/main/train_tensoIR.py): `train_tensoIR.py`
- [NeRF-Synthetic Training](https://github.com/haian-jin/tensoir/blob/main/train_tensoIR_simple.py): `train_tensoIR_simple.py`
- [Rotated-Light Training](https://github.com/haian-jin/tensoir/blob/main/train_tensoIR_rotated_multi_lights.py): `train_tensoIR_rotated_multi_lights.py`
- [General-Light Training](https://github.com/haian-jin/tensoir/blob/main/train_tensoIR_general_multi_lights.py): `train_tensoIR_general_multi_lights.py`
- [Rotated Tensor Field](https://github.com/haian-jin/tensoir/blob/main/models/tensoRF_rotated_lights.py): `models/tensoRF_rotated_lights.py`
- [General Tensor Field](https://github.com/haian-jin/tensoir/blob/main/models/tensoRF_general_multi_lights.py): `models/tensoRF_general_multi_lights.py`
- [Tensor Field Base](https://github.com/haian-jin/tensoir/blob/main/models/tensorBase_rotated_lights.py): `models/tensorBase_rotated_lights.py`
- [General Field Base](https://github.com/haian-jin/tensoir/blob/main/models/tensorBase_general_multi_lights.py): `models/tensorBase_general_multi_lights.py`
- [Initial Tensor Field](https://github.com/haian-jin/tensoir/blob/main/models/tensoRF_init.py): `models/tensoRF_init.py`
- [SH Lighting Basis](https://github.com/haian-jin/tensoir/blob/main/models/sh.py): `models/sh.py`

### Rendering and Relighting

- [Relighting Utilities](https://github.com/haian-jin/tensoir/blob/main/models/relight_utils.py): `models/relight_utils.py`
- [Renderer](https://github.com/haian-jin/tensoir/blob/main/renderer.py): `renderer.py`
- [Relight Sampling](https://github.com/haian-jin/tensoir/blob/main/scripts/relight_importance.py): `scripts/relight_importance.py`

### Analysis and Outputs

- [Mesh Export](https://github.com/haian-jin/tensoir/blob/main/scripts/export_mesh.py): `scripts/export_mesh.py`
- [Image Metrics](https://github.com/haian-jin/tensoir/blob/main/utils.py): `utils.py`
- **Rendered Results**

### Other components

- **Researcher**

## Connections

- Researcher → Run Configuration: sets options (evidence: `README.md`)
- Scene Images → Single-Light Dataset: loads images
- Environment Maps → General-Light Dataset: loads lighting (evidence: `dataLoader/tensoIR_general_multi_lights.py`)
- Camera Rays → Single-Light Dataset: generates rays (evidence: `dataLoader/tensoIR_simple.py`)
- Camera Rays → Rotated-Light Dataset: generates rays (evidence: `dataLoader/tensoIR_rotation_setting.py`)
- Camera Rays → General-Light Dataset: generates rays (evidence: `dataLoader/tensoIR_general_multi_lights.py`)
- Run Configuration → Single-Light Training: configures run (evidence: `README.md`)
- Run Configuration → NeRF-Synthetic Training: configures run (evidence: `README.md`)
- Run Configuration → Rotated-Light Training: configures run (evidence: `README.md`)
- Run Configuration → General-Light Training: configures run (evidence: `README.md`)
- Single-Light Dataset → Single-Light Training: provides samples
- Blender Dataset → NeRF-Synthetic Training: provides samples
- Rotated-Light Dataset → Rotated-Light Training: provides samples
- General-Light Dataset → General-Light Training: provides samples
- Single-Light Training → Rotated Tensor Field: trains model (evidence: `train_tensoIR.py`)
- NeRF-Synthetic Training → Rotated Tensor Field: trains model (evidence: `train_tensoIR_simple.py`)
- Rotated-Light Training → Rotated Tensor Field: trains model (evidence: `train_tensoIR_rotated_multi_lights.py`)
- General-Light Training → General Tensor Field: trains model (evidence: `train_tensoIR_general_multi_lights.py`)
- Rotated Tensor Field → Tensor Field Base: extends field (evidence: `models/tensoRF_rotated_lights.py`)
- General Tensor Field → General Field Base: extends field (evidence: `models/tensoRF_general_multi_lights.py`)
- Tensor Field Base → SH Lighting Basis: evaluates basis (evidence: `models/tensorBase_rotated_lights.py`)
- General Field Base → SH Lighting Basis: evaluates basis (evidence: `models/tensorBase_general_multi_lights.py`)
- Relighting Utilities → Initial Tensor Field: uses alpha conversion (evidence: `models/relight_utils.py`)
- Renderer → Relighting Utilities: renders BRDF (evidence: `renderer.py`)
- Single-Light Training → Renderer: renders tests (evidence: `README.md`)
- NeRF-Synthetic Training → Renderer: renders tests (evidence: `README.md`)
- Rotated-Light Training → Renderer: renders tests (evidence: `README.md`)
- General-Light Training → Renderer: renders tests (evidence: `README.md`)
- Researcher → Relight Sampling: requests relighting (evidence: `README.md`)
- Relight Sampling → Rotated Tensor Field: loads checkpoint (evidence: `scripts/relight_importance.py`)
- Relight Sampling → Renderer: renders relighting (evidence: `scripts/relight_importance.py`)
- Relight Sampling → Environment Maps: samples unseen light (evidence: `README.md`)
- Renderer → Image Metrics: computes metrics (evidence: `renderer.py`)
- Renderer → Rendered Results: saves renders (evidence: `README.md`)
- Researcher → Mesh Export: requests extraction (evidence: `README.md`)
- Mesh Export → Rotated Tensor Field: loads checkpoint (evidence: `scripts/export_mesh.py`)
- Mesh Export → Rendered Results: writes mesh (evidence: `README.md`)
