vdsr-litert / README.md
mlboydaisuke's picture
Upload README.md with huggingface_hub
28af143 verified
|
Raw
History Blame Contribute Delete
2.7 kB
---
license: mit
library_name: litert
pipeline_tag: image-to-image
tags:
- litert
- tflite
- on-device
- android
- super-resolution
- vdsr
- gpu
---
# VDSR — LiteRT (TFLite) GPU, FP16
On-device [LiteRT](https://ai.google.dev/edge/litert) (`.tflite`) conversion of
**VDSR** (Very Deep Super-Resolution, CVPR'16) for single-image super-resolution.
VDSR is a 20-layer CNN that refines the **luminance (Y)** of an image and adds a global
residual.
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**
VDSR has no in-network upsampling, so the graph is just `conv + ReLU + residual add`
(no PixelShuffle, no PReLU), unlike most SR models.
## Files
| File | Precision | Size |
|------|-----------|------|
| `vdsr_256_fp16.tflite` | fp16 weights | ~1.35 MB |
| `vdsr_256.tflite` | fp32 | ~2.68 MB |
## I/O
- **Input**: `[1, 256, 256, 1]` float32, **NHWC**, the luminance (Y) of a bicubic-upscaled
image, range `[0, 1]`.
- **Output**: `[1, 256, 256, 1]` float32, **NHWC**, the refined (sharper) Y, range `[0, 1]`.
To super-resolve a color image: convert to YCbCr, run Y through the model, recombine the
refined Y with the original Cb/Cr, convert back to RGB.
## Ops
```
CONV_2D x19, DEPTHWISE_CONV_2D x1, ADD x1
```
No `GATHER_ND`, no Flex/Custom, no PixelShuffle/PReLU.
## Fidelity
- Converted fp32 vs original PyTorch: **corr 1.0000**.
- fp16 vs fp32: **corr 1.0000**.
## On-device (Pixel 8a, verified)
The fp16 model compiles to **41 / 41 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, "vdsr_256_fp16.tflite",
CompiledModel.Options(Accelerator.GPU), null
)
val inputs = model.createInputBuffers()
val outputs = model.createOutputBuffers()
inputs[0].writeFloat(yChannel) // [1,256,256,1] luminance in [0,1]
model.run(inputs, outputs)
val refinedY = outputs[0].readFloat() // [1,256,256,1] in [0,1]
```
A complete Android sample (camera + gallery super-resolution) is available in
[google-ai-edge/litert-samples](https://github.com/google-ai-edge/litert-samples).
## License & attribution
- License: **MIT**. Weights from [`twtygqyy/pytorch-vdsr`](https://github.com/twtygqyy/pytorch-vdsr).
Original work: Kim et al., *"Accurate Image Super-Resolution Using Very Deep
Convolutional Networks"*, CVPR 2016. This is a format conversion of the weights (no
architectural changes); all credit to the original authors.