learning-munsell / README.md
KelSolaar's picture
Add *Classification Code* + *Multi-Error Predictor* model variant achieving Delta-E 0.53 with 100% code accuracy.
869514e
---
license: bsd-3-clause
language:
- en
tags:
- python
- colour
- color
- colour-science
- color-science
- colour-spaces
- color-spaces
- colourspace
- colorspace
pipeline_tag: tabular-regression
library_name: onnxruntime
metrics:
- mae
model-index:
- name: from_xyY (CIE xyY to Munsell)
results:
- task:
type: tabular-regression
name: CIE xyY to Munsell Specification
dataset:
name: CIE xyY to Munsell Specification
type: munsell-renotation
metrics:
- type: delta-e
value: 0.51
name: Delta-E CIE2000
- type: inference_time_ms
value: 0.061
name: Inference Time (ms/sample)
- name: to_xyY (Munsell to CIE xyY)
results:
- task:
type: tabular-regression
name: Munsell Specification to CIE xyY
dataset:
name: Munsell Specification to CIE xyY
type: munsell-renotation
metrics:
- type: delta-e
value: 0.48
name: Delta-E CIE2000
- type: inference_time_ms
value: 0.066
name: Inference Time (ms/sample)
---
# Learning Munsell - Machine Learning for Munsell Color Conversions
A project implementing machine learning-based methods for bidirectional conversion between CIE xyY colourspace values and Munsell specifications.
**Two Conversion Directions:**
- **from_xyY**: CIE xyY to Munsell specification
- **to_xyY**: Munsell specification to CIE xyY
## Project Overview
### Objective
Provide 100-1000x speedup for batch Munsell conversions compared to colour-science routines while maintaining high accuracy.
### Results
**from_xyY** (CIE xyY to Munsell) — 30 models evaluated on all 2,734 REAL Munsell colors:
| Model | Delta-E | Speed (ms) |
|------------------------------------------------------|------------|------------|
| Colour Library (Baseline) | 0.00 | 116.3 |
| **Multi-MLP + Multi-Error Predictor** | **0.51** | 0.061 |
| Multi-ResNet + Multi-Error Predictor (Large Dataset) | 0.52 | 0.096 |
| Transformer + Error Predictor (Large Dataset) | 0.52 | 0.163 |
| Multi-Head + Multi-Error Predictor (Large Dataset) | 0.53 | 0.046 |
| Multi-MLP (Class. Code) + Multi-Error Predictor | 0.53 | 0.049 |
| MLP + Error Predictor | 0.53 | 0.036 |
| Multi-Head + Multi-Error Predictor | 0.54 | 0.057 |
| Multi-ResNet (Large Dataset) | 0.56 | 0.047 |
| Multi-Head (Large Dataset) | 0.57 | 0.012 |
| FT-Transformer | 0.70 | 0.067 |
| Unified MLP | 0.71 | 0.074 |
| Transformer (Large Dataset) | 0.73 | 0.120 |
| Mixture of Experts | 0.74 | 0.021 |
| Multi-MLP | 0.91 | 0.027 |
| Multi-MLP (Classification Code) | 0.92 | 0.026 |
| MLP + Self-Attention | 0.88 | 0.185 |
| Deep + Wide | 1.18 | 0.078 |
| MLP (Base Only) | 1.30 | **0.009** |
| Multi-MLP (Hue Angle sin/cos) | 1.78 | 0.021 |
- **Best Accuracy**: Multi-MLP + Multi-Error Predictor — Delta-E 0.51, 1,905x faster
- **Fastest**: MLP Base Only (0.009 ms/sample) — 13,365x faster than Colour library
- **Best Balance**: MLP + Error Predictor — 3,196x faster with Delta-E 0.53
**to_xyY** (Munsell to CIE xyY) — 6 models evaluated on all 2,734 REAL Munsell colors:
| Model | Delta-E | Speed (ms) |
|---------------------------------------|------------|------------|
| Colour Library (Baseline) | 0.00 | 1.40 |
| **Multi-MLP + Multi-Error Predictor** | **0.48** | 0.066 |
| Multi-Head + Multi-Error Predictor | 0.51 | 0.054 |
| Simple MLP | 0.52 | 0.002 |
| Multi-MLP | 0.57 | 0.028 |
| Multi-Head | 0.60 | 0.013 |
| Multi-MLP + Error Predictor | 0.61 | 0.060 |
- **Best Accuracy**: Multi-MLP + Multi-Error Predictor — Delta-E 0.48, 21x faster
- **Fastest**: Simple MLP (0.002 ms/sample) — 669x faster than Colour library
### Approach
- **30 models** tested for from_xyY (MLP, Multi-Head, Multi-MLP, Multi-ResNet, Transformers, FT-Transformer, Mixture of Experts)
- **6 models** tested for to_xyY (Simple MLP, Multi-Head, Multi-MLP with error predictors)
- **Two-stage models** (base + error predictor) proved most effective
- **Best model**: Multi-MLP + Multi-Error Predictor with Delta-E 0.51
- **Training data**: ~1.4M samples from dense xyY grid with boundary refinement and forward Munsell sampling
- **Deployment**: ONNX format with ONNX Runtime
For detailed architecture comparisons, model benchmarks, training pipeline details, and experimental results, see [docs/learning_munsell.md](docs/learning_munsell.md).
## Installation
**Dependencies (Runtime)**:
- numpy >= 2.0
- onnxruntime >= 1.16
**Dependencies (Training)**:
- torch >= 2.0
- scikit-learn >= 1.3
- matplotlib >= 3.9
- mlflow >= 2.10
- optuna >= 3.0
- colour-science >= 0.4.7
- click >= 8.0
- onnx >= 1.15
- onnxscript >= 0.5.6
- tqdm >= 4.66
- jax >= 0.4.20
- jaxlib >= 0.4.20
- flax >= 0.10.7
- optax >= 0.2.6
- scipy >= 1.12
- tensorboard >= 2.20
From the project root:
```bash
cd learning-munsell
# Install all dependencies (creates virtual environment automatically)
uv sync
```
## Usage
### Generate Training Data
```bash
uv run python learning_munsell/data_generation/generate_training_data.py
```
**Note**: This step is computationally expensive (uses iterative algorithm for ground truth).
### Train Models
**xyY to Munsell (from_xyY)**
Best performing model (Multi-MLP + Multi-Error Predictor):
```bash
# Train base Multi-MLP
uv run python learning_munsell/training/from_xyY/train_multi_mlp.py
# Train multi-error predictor
uv run python learning_munsell/training/from_xyY/train_multi_mlp_multi_error_predictor.py
```
Alternative architectures:
```bash
uv run python learning_munsell/training/from_xyY/train_multi_resnet_large.py
uv run python learning_munsell/training/from_xyY/train_multi_head_large.py
uv run python learning_munsell/training/from_xyY/train_ft_transformer.py
uv run python learning_munsell/training/from_xyY/train_unified_mlp.py
uv run python learning_munsell/training/from_xyY/train_deep_wide.py
uv run python learning_munsell/training/from_xyY/train_mlp_attention.py
```
**Munsell to xyY (to_xyY)**
Best performing model (Multi-MLP + Multi-Error Predictor):
```bash
# Train base Multi-MLP
uv run python learning_munsell/training/to_xyY/train_multi_mlp.py
# Train multi-error predictor
uv run python learning_munsell/training/to_xyY/train_multi_mlp_multi_error_predictor.py
```
Other architectures:
```bash
uv run python learning_munsell/training/to_xyY/train_multi_head.py
uv run python learning_munsell/training/to_xyY/train_multi_mlp_error_predictor.py
uv run python learning_munsell/training/to_xyY/train_multi_head_multi_error_predictor.py
```
Train the differentiable approximator for use in Delta-E loss:
```bash
uv run python learning_munsell/training/to_xyY/train_munsell_to_xyY_approximator.py
```
### Hyperparameter Search
```bash
uv run python learning_munsell/training/from_xyY/hyperparameter_search_multi_head.py
uv run python learning_munsell/training/from_xyY/hyperparameter_search_multi_head_error_predictor.py
```
### Compare All Models
```bash
uv run python learning_munsell/comparison/from_xyY/compare_all_models.py
uv run python learning_munsell/comparison/to_xyY/compare_all_models.py
```
Generates comprehensive HTML reports at `reports/from_xyY/model_comparison.html` and `reports/to_xyY/model_comparison.html`.
### Monitor Training
**MLflow**:
```bash
uv run mlflow ui --backend-store-uri "sqlite:///mlruns.db" --port=5000
```
Open <http://localhost:5000> in your browser.
## Directory Structure
```
learning-munsell/
+-- data/ # Training data
| +-- training_data.npz # Generated training samples
| +-- training_data_large.npz # Large dataset (~1.4M samples)
| +-- training_data_params.json # Generation parameters
| +-- training_data_large_params.json
+-- models/ # Trained models (ONNX + PyTorch)
| +-- from_xyY/ # xyY to Munsell models (34 ONNX models)
| | +-- multi_mlp_multi_error_predictor.onnx # BEST
| | +-- ... (additional model variants)
| +-- to_xyY/ # Munsell to xyY models (6 ONNX models)
| +-- multi_mlp_multi_error_predictor.onnx # BEST
| +-- ... (additional model variants)
+-- learning_munsell/ # Source code
| +-- analysis/ # Analysis scripts
| +-- comparison/ # Model comparison scripts
| +-- data_generation/ # Data generation scripts
| +-- interpolation/ # Classical interpolation methods
| +-- losses/ # Loss functions (JAX Delta-E)
| +-- models/ # Model architecture definitions
| +-- training/ # Model training scripts
| +-- utilities/ # Shared utilities
+-- docs/ # Documentation
+-- reports/ # HTML comparison reports
+-- logs/ # Script output logs
+-- mlruns.db # MLflow experiment tracking database
```
## About
**Learning Munsell** by Colour Developers
Research project for the Colour library
<https://github.com/colour-science/colour>