| --- |
| license: apache-2.0 |
| pipeline_tag: image-to-image |
| tags: |
| - onnx |
| - onnxruntime-web |
| - image-colorization |
| - ddcolor |
| --- |
| |
| # DDColor-tiny — fp16 ONNX (512×512) |
|
|
| An ONNX export of **DDColor-tiny** ([piddnad/DDColor](https://github.com/piddnad/DDColor), |
| ICCV 2023) for black-and-white / grayscale **image colorization**, exported for |
| in-browser inference with [onnxruntime-web](https://onnxruntime.ai/). |
|
|
| This is the model behind the **[Edge Tools](https://app.edgetools.io) Image |
| Colorizer** ([`/colorize-image`](https://app.edgetools.io/colorize-image)), which |
| runs it fully client-side — images are never uploaded anywhere. |
|
|
| ## Files |
|
|
| | File | Size | What | |
| | --- | --- | --- | |
| | `ddcolor-tiny-fp16.onnx` | ~130 MB | DDColor-tiny, float16 **weights**, float32 I/O, fixed 512×512 input | |
|
|
| ## Tensor contract |
|
|
| | | Name | Shape | dtype | |
| | --- | --- | --- | --- | |
| | Input | (first input) | `(1, 3, 512, 512)` | `float32` | |
| | Output | (first output) | `(1, 2, 512, 512)` | `float32` | |
|
|
| The weights are float16 but the **I/O boundary is plain float32** |
| (`keep_io_types=True`), so no fp16 tensor plumbing is needed and op support on the |
| ORT wasm execution provider stays maximal. |
|
|
| ## Pre / post-processing |
|
|
| DDColor predicts **chroma only**; luminance comes from the source image. Using |
| CIE Lab in OpenCV's float convention (`L∈[0,100]`, `a,b∈~[-127,127]`, D65 white, |
| sRGB gamma — DDColor is trained against `cv2.cvtColor` float Lab): |
|
|
| 1. Normalise input to `[0,1]` and compute the **original-resolution L** channel. |
| 2. Resize to 512×512, rebuild a grayscale RGB from L (`a=b=0`, Lab→RGB) and feed |
| it as `(1,3,512,512)` float32. **No ImageNet normalisation** (`do_normalize=False`). |
| 3. The model returns **ab** as `(1,2,512,512)`. |
| 4. Resize ab back to the original size, concatenate with the **original-resolution |
| L**, and convert Lab→RGB. Only chroma is low-res; full-res luminance is preserved. |
|
|
| ## Provenance |
|
|
| Exported from the upstream PyTorch checkpoint — reproducible from public sources: |
|
|
| - **Architecture code**: [`piddnad/DDColor`](https://github.com/piddnad/DDColor) |
| pinned at `2adb63f2656ac41cbdf7b894cddd94121a3faf13` |
| (`basicsr.archs.ddcolor_arch`, `encoder_name="convnext-t"`, |
| `decoder_name="MultiScaleColorDecoder"`, `num_output_channels=2`, |
| `last_norm="Spectral"`, `num_queries=100`, `num_scales=3`, `dec_layers=9`). |
| - **Weights**: [`piddnad/ddcolor_paper_tiny`](https://huggingface.co/piddnad/ddcolor_paper_tiny) |
| `pytorch_model.bin`, SHA-256-verified |
| (`8a1277bc90a1bfbb6d2d83933a9a6bc821931879ca93e26e4fcec12165d41fce`). |
| - **Export**: `torch.onnx.export`, **opset 17**, fixed 512×512 input, then weights |
| cast to float16 via `onnxconverter_common.float16.convert_float_to_float16( |
| ..., keep_io_types=True)`. `onnxsim` / symbolic-shape-infer are skipped — the |
| input is fixed-size, so shapes are already static. |
| - **Validation**: every published build is checked by an automated colorization |
| test against this exact artifact before upload — a grayscale input must come |
| back with real chroma while preserving the source luminance. |
|
|
| ## License |
|
|
| **Apache-2.0**, inherited from the upstream DDColor project |
| ([LICENSE](https://github.com/piddnad/DDColor/blob/master/LICENSE)). |
|
|
| ## Citation |
|
|
| ```bibtex |
| @inproceedings{kang2023ddcolor, |
| title={DDColor: Towards Photo-Realistic Image Colorization via Dual Decoders}, |
| author={Kang, Xiaoyang and Yang, Tao and Ouyang, Wenqi and Ren, Peiran and Li, Lingzhi and Xie, Xuansong}, |
| booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)}, |
| year={2023} |
| } |
| ``` |
|
|