Old family photos are the thing most people want restored and least want to upload. The research models for it exist, but each one is a separate repository with its own command line, and two of the best known are archived. I wrote Unfaded to put them in one pipeline that runs on a local GPU and tells you what it did.
The pipeline
A scan goes through six steps, and each one can be switched off.
- Split cuts every print out of a flatbed scan and straightens it. It uses classical OpenCV, not a model.
- Fade restores levels and removes the colour cast. It skips itself when the print already spans 80 percent of the tonal range.
- Repair finds scratches, creases and dust with an old photo scratch detector and fills them with LaMa. It skips itself if more than 15 percent of the print would be filled.
- Faces runs GFPGAN with a strength slider per face. The default is 35, because at 100 a face can look like someone else.
- Colour uses DDColor on black and white prints and never changes lightness.
- Enlarge uses Real-ESRGAN at 2x or 4x, in tiles for large prints.
Saying what the model invented
Models make things up, so the tool says so. Every step that drew pixels is labelled as invented by the model, and an Invented view paints exactly where. Each result gets an XMP sidecar with the sha256 of the source file, the model and settings of every step, and the steps where a model generated pixels. The original is never touched.
What I measured
I treated the four photos in examples/photos as clean references, drew scratches, creases and dust on them with a known mask at fixed seeds, and ran only the repair step. Mean PSNR rose from 26.8 to 29.0 dB. PSNR improved on three of the four photos and SSIM on two. On one portrait the detector marked parts of the texture as damage and the fill made it slightly worse. The splitter found 12 of 12 prints on synthetic scans with a mean IoU of 0.95.
Those numbers come from damage I drew myself, which is easier than real wear, so I read them as a regression check and not as a promise about your photos. unfaded bench reproduces them.
Limits
The scratch detector misses thin dark lines. DDColor guesses colour and leans warm. Tone recovery turns sepia prints neutral grey. I have only run it on Linux with an RTX 5090. The live demo is a replay of precomputed output.
Code and live demo: https://github.com/Arthur031221/Unfaded and https://arthur031221.github.io/Unfaded/. It is MIT licensed, and the model weights keep their own licenses.

Top comments (1)
I'm glad you show which bits the model invented.