zero-dce-litert / README.md
mlboydaisuke's picture
Upload README.md with huggingface_hub
405ead9 verified
|
Raw
History Blame Contribute Delete
3.06 kB
---
license: apache-2.0
library_name: litert
pipeline_tag: image-to-image
base_model: sayakpaul/zero-dce
tags:
- litert
- tflite
- on-device
- android
- low-light-enhancement
- image-enhancement
- zero-dce
- gpu
---
# Zero-DCE — LiteRT (TFLite) GPU, FP16
On-device [LiteRT](https://ai.google.dev/edge/litert) (`.tflite`) conversion of
**[Zero-DCE](https://github.com/Li-Chongyi/Zero-DCE)** (Zero-Reference Deep Curve
Estimation) for **low-light image enhancement**. The DCE-Net is a tiny 7-layer CNN
that estimates pixel-wise tone curves; the curves are applied iteratively (8×) to
brighten the image. The whole pipeline (curve estimation **and** the iterative
application) is baked into the graph, so the model takes a dark image and returns the
enhanced image directly.
The model runs **fully on the LiteRT `CompiledModel` GPU accelerator** (ML Drift):
every op is GPU-native, no CPU fallback, no Flex/Custom ops. Converted with
[`litert-torch`](https://github.com/google-ai-edge/ai-edge-torch) **with no patches**.
## Files
| File | Precision | Size |
|------|-----------|------|
| `zerodce_512_fp16.tflite` | fp16 weights | ~0.18 MB |
| `zerodce_512.tflite` | fp32 | ~0.34 MB |
## I/O
- **Input**: `[1, 512, 512, 3]` float32, **NHWC**, RGB, range **`[0, 1]`** (just divide
by 255 — no mean/std normalization).
- **Output**: `[1, 512, 512, 3]` float32, **NHWC**, RGB, range `[0, 1]` — the enhanced
image. Multiply by 255 to display.
## Ops
The graph lowers entirely to GPU-clean builtins — the iterative curve application
`x = x + r·(x² − x)` is written as `x*x` so it becomes `MUL`, not `POW`:
```
CONV_2D x7, MUL x16, SUB x8, ADD x8, SLICE x8, CONCATENATION x3, TANH x1
```
No `GATHER_ND`, no Flex/Custom, no >4D reshapes.
## Fidelity
- Converted fp32 vs original PyTorch: **corr 1.0000**, max|diff| ~2e-5.
- fp16 vs fp32: **corr 1.0000**, max|diff| ~3e-5.
## On-device (Pixel 8a, verified)
The fp16 model compiles to **58 / 58 nodes on the LiteRT GPU delegate (LITERT_CL)** —
full GPU residency, no CPU fallback.
## Usage (Android, LiteRT CompiledModel)
```kotlin
val model = CompiledModel.create(
context.assets, "zerodce_512_fp16.tflite",
CompiledModel.Options(Accelerator.GPU), null
)
val inputs = model.createInputBuffers()
val outputs = model.createOutputBuffers()
inputs[0].writeFloat(rgbFloats01) // [1,512,512,3] interleaved RGB in [0,1]
model.run(inputs, outputs)
val enhanced = outputs[0].readFloat() // [1,512,512,3] in [0,1]
```
A complete Android sample (live camera + gallery low-light enhancement) is available in
[google-ai-edge/litert-samples](https://github.com/google-ai-edge/litert-samples).
## License & attribution
- License: **Apache-2.0** (© the Zero-DCE authors,
[Li-Chongyi/Zero-DCE](https://github.com/Li-Chongyi/Zero-DCE)). Original work:
Guo et al., *"Zero-Reference Deep Curve Estimation for Low-Light Image Enhancement"*,
CVPR 2020. This is a format conversion of the official weights (no architectural
changes); all credit to the original authors.