Skip to content
imaged

Motion deblur

NAFNet-REDS

Recover a sharp image from a single motion-blurred frame.

MIT
Explore model

About this model

NAFNet is a small image-restoration network from Megvii. The "REDS" checkpoint is trained on the REDS motion-blur benchmark, where blur comes from camera shake and fast subject motion. One forward pass takes a blurred frame and returns the deblurred copy.

The build the SDK ships is OpenCV's int8 ONNX export of NAFNet width-64. About 87 MB on disk, runs on CPU on every supported platform.

What you can build

  • Recover a readable license plate from a single CCTV grab.
  • Sharpen doorbell-camera frames before OCR or face matching.
  • Clean up handheld field photos taken in poor light.
  • Pre-process archival scans before downstream pipelines.

Variants & downloads

Choose the build for your app

Model files are being prepared.

Explore the model’s examples, source links, and integration notes while download variants are added.

Example inference

Input
A motion-blurred license plate from a CCTV grab.
Output
The same plate, deblurred. The characters are now readable.

Performance

Results depend on the device, runtime, and test conditions. Each measurement keeps its own context.

M1 Max, macOS 15, ONNX Runtime 1.17

See original catalog hardware notes · CPU

1.67 s

Warm inference

Catalog reference · variant unspecifiedCold start (ms): 1672.3

Reference result from the existing catalog; conversion variant and measurement date were not recorded.

M1 Max, macOS 15, ONNX Runtime 1.17

See original catalog hardware notes · CoreML

10.21 s

Warm inference

Catalog reference · variant unspecifiedCold start (ms): 24700.62

Reference result from the existing catalog; conversion variant and measurement date were not recorded.

Integration examples

Vision SDK integration

cpp

#include "imaged/sdk.hpp"
#include "imaged/families/deblur/deblur_family.hpp"

imaged::SDK::AI ai;
auto& config = ai.getOptions();
config.set("deblur.model", "weights/nafnet-reds.onnx");
config.set("deblur.inference.provider", "cpu");

imaged::SDK::DeblurFamily family;
family.load(config);

imaged::SDK::Image image;
image.load("blurry.jpg");

auto result = family.run(&image);
auto* sharp = std::get_if<imaged::SDK::ImageResult>(&result);
sharp->image.save("sharp.jpg");