DDColor
Colorize your grandpa's photos without the model inventing a new face
- image
- IMAGE
You've got a black-and-white family scan (or a box of 1920s film) and you want color without Stable Diffusion quietly deciding the face belongs to someone else. That's the gap DDColor fills. It's the photo-realistic colorizer from piddnad's original repo, wrapped as one ComfyUI node, and this pack is the community's go-to way to run it.
The flagship use case says it all: the best-known DDColor-in-ComfyUI thread is a 1920s video restoration where Big Lama Remover scrubs out the timestamp and DDColor supplies the color, frame by frame. It slots into the standard photo-restoration pipeline too - fix the damage first, then colorize, then upscale (the SeedVR2 crowd treats restoration as a separate pass from colorization). DDColor is the colorize step, and the reason it keeps getting picked over diffusion-based colorizers is that it won't invent details, change a face, or rebuild the photo in its own image. It just adds color.
How it works
DDColor is an encoder-decoder: a ConvNeXt vision backbone plus a transformer decoder that predicts the two a/b chroma channels in LAB color space. The node takes your image, converts it to LAB, resizes it to model_input_size, runs the model, upscales the predicted color channels back to your original resolution, and stitches them onto the untouched lightness channel. Because the L channel is never modified, edges and detail stay exactly as they were, and the output comes out at the same size as the input. Nothing generative, no diffusion loop - it's a pure feed-forward network, so it's fast and deterministic.
The inputs that matter
- image - any IMAGE tensor. Feed it whatever you like; it gets colorized at its own resolution.
- model_input_size (default 512, 32–4096) - the model's internal working resolution. This is the fiddly one; more on it below.
- checkpoint - four choices.
ddcolor_paper_tiny.pthis the default and uses the small ConvNeXt-tiny encoder.ddcolor_paper.pth,ddcolor_modelscope.pth, andddcolor_artistic.pthall use the heavy ConvNeXt-large.artisticis the variant tuned toward illustration output rather than straight photo-real.
The output is a single IMAGE, same resolution as what went in - wire it straight into SaveImage or into your upscale chain.
Installing it
Easiest: ComfyUI Manager, search "ComfyUI DDColor", install, restart. Or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/hay86/ComfyUI_DDColor
# restart ComfyUI
Dependencies are numpy, opencv, Pillow, timm, and huggingface_hub - timm being the only one you might not already have. On first run the checkpoint auto-downloads from Hugging Face into ComfyUI/models/ddcolor/, so expect a pause the first time. That's actually this fork's one real improvement over kijai's original wrapper: models land in ComfyUI's official models/ folder instead of a custom one, so Manager sees them and you can grab them manually from piddnad/DDColor-models if auto-download ever balks.
Where people get burned
- VRAM. The ConvNeXt-large checkpoints are hungry. There are real reports of CUDA allocation errors as soon as
model_input_sizegoes above 256 with the full models - and the author of the original wrapper openly admits nobody really understands what the input size should be, since it varies per model and image. Working values people stick to: 256, 512, 1024. If you're on a card with 8GB or less, start at 256 with the tiny model and work up. - No prompt control. DDColor takes an image and a size and nothing else. If you want to tell it "make the dress red," this isn't the node - the diffusion-based colorizers people mention alongside it (NAID et al.) are a different beast, often an API with a key. DDColor is deliberately dumb, and that's why it's reliable.
- First-run stall. The checkpoint download makes the first inference hang for a bit. It's not frozen; it's pulling ~100MB of weights.
Keep expectations calibrated: it adds plausible, photo-real color and preserves the original structure perfectly, but it won't fix scratches, sharpen, or add missing detail. That's what the rest of your restoration workflow is for. Colorize with this, then let an upscaler do its thing - that pairing is where old photos actually come back to life.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| model_input_size | INT | 51232–4096 | — |
| checkpoint | COMBO | ddcolor_paper_tiny.pth | 4 options: ddcolor_paper_tiny.pth, ddcolor_paper.pth, ddcolor_modelscope.pth, ddcolor_artistic.pth |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |