We present a modular neural image signal processing (ISP) framework that produces high-quality display-referred images while providing a high degree of modularity with explicit control over multiple intermediate stages of the rendering pipeline. Our ISP is fully differentiable and requires no manual tuning, and its modular structure not only improves rendering accuracy but also enhances scalability, debuggability, generalization to unseen cameras, and flexibility to support different user-preference picture styles within a lightweight and efficient design.
On top of this modular neural ISP, we developed a user-interactive photo-editing tool that supports diverse editing operations, different picture styles, and enables unlimited post-editable re-rendering and re-styling. The tool accepts DNG raw images from any camera as well as sRGB images from third-party sources. Across multiple test sets, our method consistently delivers competitive qualitative and quantitative performance.
🔗 Paper
You can set up the environment using Conda or venv:
# Create and activate a new conda environment
conda create -n modular_neural_isp_env python=3.9 -y
conda activate modular_neural_isp_env
# Install PyTorch (adjust CUDA version if needed)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
# Install all other dependencies
pip install -r requirements.txt# Create and activate a virtual environment
python -m venv modular_neural_isp_env
source modular_neural_isp_env/bin/activate # macOS/Linux
# On Windows:
# .\modular_neural_isp_env\Scripts\activate
# Install PyTorch (adjust CUDA version if needed)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
# Install all other dependencies
pip install -r requirements.txtSome components of this project require ExifTool to read raw metadata.
Linux (Ubuntu/Debian):
sudo apt install libimage-exiftool-perlArch Linux:
sudo pacman -S perl-image-exiftoolmacOS (Homebrew):
brew install exiftoolWindows:
- Download the Windows package from: https://exiftool.org
- Extract the ZIP file.
- Rename
exiftool(-k).exe→exiftool.exe - Place it somewhere permanent, e.g.
C:\exiftool\exiftool.exe.
If ExifTool is not detected automatically, update EXIFTOOL_PATH in utils/constants.py:
import platform
if platform.system() == 'Windows':
EXIFTOOL_PATH = r'C:\exiftool\exiftool.exe' # Update accordingly
elif platform.system() == 'Darwin': # macOS
EXIFTOOL_PATH = '/usr/local/bin/exiftool' # Update accordingly
else: # Linux
EXIFTOOL_PATH = '/usr/bin/exiftool' # Update accordinglyFor console-based rendering of a DNG raw file taken by any camera (or any sRGB image produced by third-party software) refer to the main directory.
To launch the interactive photo-editing tool, see the gui directory.
To retrain our framework, begin by training the denoiser network (see denoising for instructions). Then train the photofinishing module (refer to photofinishing). Finally, train the detail-enhancement network (see enhancement).
To test our method, check the testing example here.
To benchmark other methods using the same evaluation metrics used in our paper, see the evaluation directory.
If you use this code in your research, please cite our paper:
@article{afifi2025modular,
title={Modular Neural Image Signal Processing},
author={Afifi, Mahmoud and Wang, Zhongling and Zhang, Ran and Brown, Michael S},
journal={arXiv preprint arXiv:2512.08564},
year={2025}
}