Freelance project
Image Denoiser
- Problem
- Different kinds of image noise need different fixes, and one general denoiser tends to blur detail while trying to remove all of them at once.
- Approach
- A fine-tuned ResNet-18 first identifies the type of noise, then routes the image to a RIDNet trained from scratch for that one type, which denoises it in overlapping 80×80 patches.
- Result
- PSNR of 28–35 dB and SSIM of 0.72–0.92 on test images.
- My role
- Freelance AI engineer (2024–2025). Built the system end to end for a client: data pipeline, models, training and app.
- Stack
- Python
- TensorFlow / Keras
- ResNet-18
- RIDNet
- OpenCV
- scikit-image
- Streamlit
- Links
01
Architecture
- Noisy image: the user uploads a photo in the Streamlit app.
- ResNet-18 classifies which kind of noise the image has. It starts from pretrained weights and is fine-tuned for this classification.
- Router: each noise type has its own denoising model, and the router sends the image to the one that matches.
- Patch split: the image is cut into overlapping 80×80 patches, so the denoiser works on any image size with a fixed input shape and bounded memory.
- RIDNet specialist: a RIDNet (a denoising CNN with feature attention) trained from scratch on that one noise type cleans each patch.
- Stitch: the cleaned patches are put back together into the full-size image; the overlap between patches keeps their borders from showing.
- Next noise type: when an image has more than one kind of noise, the steps repeat with the next specialist, one noise type at a time.
- Streamlit app: the cleaned image is shown together with its PSNR and SSIM scores.
02
Key decisions
A specialist per noise type instead of one general model
Each RIDNet only has to learn one kind of corruption, so it can remove that noise without also smoothing away the detail another noise type would need kept. The cost is several models to train and ship, and the whole result depends on the classifier: a wrong noise type sends the image to the wrong specialist.
Overlapping 80×80 patches instead of whole images
Patches keep the model input small and fixed, so training is cheap and large photos do not run out of memory. The overlap, needed so the patch grid does not show in the output, means some pixels are denoised more than once, which costs extra computation.
Fine-tune the classifier, train the denoisers from scratch
Recognising the type of noise is a classification task where pretrained ResNet-18 features help, so fine-tuning gets good results from a small dataset. The denoisers learn low-level pixel statistics for one noise type each, so they were trained from scratch; that takes longer than reusing weights.
03
Results
- PSNR 28–35 dB and SSIM 0.72–0.92 on test images; the app reports both metrics.
- Images with more than one kind of noise are cleaned one noise type at a time by the matching specialists.
04
What I'd do next
- Report the noise classifier's accuracy and a confusion matrix, since every later step depends on it.
- Compare against one general denoiser trained on all noise types, to measure what the specialists actually add.
- Detect several noise types at once with a multi-label classifier instead of handling them strictly one after another.