Poisson denoising using Poisson2Sparse#

This code shows how to restore a single image corrupted by Poisson noise using Poisson2Sparse, without requiring external training or knowledge of the noise level.

This method is based on the paper β€œPoisson2Sparse” Ta et al.[1] and restores an image by learning a sparse non-linear dictionary parametrized by a neural network using a combination of Neighbor2Neighbor Huang et al.[2], of the negative log Poisson likelihood, of the \(\ell^1\) pixel distance and of a sparsity-inducing \(\ell^1\) regularization function on the weights.

import deepinv as dinv
import torch

Load a Poisson corrupted image#

This example uses an image from the microscopy dataset FMD Zhang et al.[3].

# Seed the RNGs for reproducibility
torch.manual_seed(0)
torch.cuda.manual_seed(0)

device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu"

physics = dinv.physics.Denoising(dinv.physics.PoissonNoise(gain=0.01, normalize=True))

x = dinv.utils.demo.load_example(
    "FMD_TwoPhoton_MICE_R_gt_12_avg50.png", img_size=(256, 256)
).to(device)
x = x[:, 0:1, :64, :64]
x = x.clamp(0, 1)
y = physics(x)

Define the Poisson2Sparse model

backbone = dinv.models.ConvLista(
    in_channels=1,
    out_channels=1,
    kernel_size=3,
    num_filters=512,
    num_iter=10,
    stride=2,
    threshold=0.01,
)

model = dinv.models.Poisson2Sparse(
    backbone=backbone,
    lr=1e-4,
    num_iter=200,
    weight_n2n=2.0,
    weight_l1_regularization=1e-5,
    verbose=True,
).to(device)

Run the model#

Note that we do not pass in the physics model as Poisson2Sparse assumes a Poisson noise model internally and does not depend on the noise level.

x_hat = model(y)

# Compute and display PSNR values
learning_free_psnr = dinv.metric.PSNR()(y, x).item()
model_psnr = dinv.metric.PSNR()(x_hat, x).item()
print(f"Measurement PSNR: {learning_free_psnr:.1f} dB")
print(f"Poisson2Sparse PSNR: {model_psnr:.1f} dB")

# Plot results
dinv.utils.plot(
    [y, x_hat, x],
    titles=["Measurement", "Poisson2Sparse", "Ground truth"],
    subtitles=[f"{learning_free_psnr:.1f} dB", f"{model_psnr:.1f} dB", ""],
)
Measurement, Poisson2Sparse, Ground truth
  0%|          | 0/200 [00:00<?, ?it/s]
  1%|          | 2/200 [00:00<00:12, 16.44it/s]
  2%|▏         | 4/200 [00:00<00:11, 17.21it/s]
  3%|β–Ž         | 6/200 [00:00<00:11, 17.43it/s]
  4%|▍         | 8/200 [00:00<00:10, 17.54it/s]
  5%|β–Œ         | 10/200 [00:00<00:10, 17.61it/s]
  6%|β–Œ         | 12/200 [00:00<00:10, 17.64it/s]
  7%|β–‹         | 14/200 [00:00<00:10, 17.68it/s]
  8%|β–Š         | 16/200 [00:00<00:10, 17.70it/s]
  9%|β–‰         | 18/200 [00:01<00:10, 17.72it/s]
 10%|β–ˆ         | 20/200 [00:01<00:10, 17.73it/s]
 11%|β–ˆ         | 22/200 [00:01<00:10, 17.76it/s]
 12%|β–ˆβ–        | 24/200 [00:01<00:09, 17.69it/s]
 13%|β–ˆβ–Ž        | 26/200 [00:01<00:09, 17.66it/s]
 14%|β–ˆβ–        | 28/200 [00:01<00:09, 17.35it/s]
 15%|β–ˆβ–Œ        | 30/200 [00:01<00:09, 17.14it/s]
 16%|β–ˆβ–Œ        | 32/200 [00:01<00:09, 16.91it/s]
 17%|β–ˆβ–‹        | 34/200 [00:01<00:09, 16.96it/s]
 18%|β–ˆβ–Š        | 36/200 [00:02<00:09, 17.19it/s]
 19%|β–ˆβ–‰        | 38/200 [00:02<00:09, 17.33it/s]
 20%|β–ˆβ–ˆ        | 40/200 [00:02<00:09, 17.47it/s]
 21%|β–ˆβ–ˆ        | 42/200 [00:02<00:08, 17.57it/s]
 22%|β–ˆβ–ˆβ–       | 44/200 [00:02<00:08, 17.62it/s]
 23%|β–ˆβ–ˆβ–Ž       | 46/200 [00:02<00:08, 17.68it/s]
 24%|β–ˆβ–ˆβ–       | 48/200 [00:02<00:08, 17.69it/s]
 25%|β–ˆβ–ˆβ–Œ       | 50/200 [00:02<00:08, 17.70it/s]
 26%|β–ˆβ–ˆβ–Œ       | 52/200 [00:02<00:08, 17.74it/s]
 27%|β–ˆβ–ˆβ–‹       | 54/200 [00:03<00:08, 17.51it/s]
 28%|β–ˆβ–ˆβ–Š       | 56/200 [00:03<00:08, 17.59it/s]
 29%|β–ˆβ–ˆβ–‰       | 58/200 [00:03<00:08, 17.63it/s]
 30%|β–ˆβ–ˆβ–ˆ       | 60/200 [00:03<00:07, 17.66it/s]
 31%|β–ˆβ–ˆβ–ˆ       | 62/200 [00:03<00:07, 17.69it/s]
 32%|β–ˆβ–ˆβ–ˆβ–      | 64/200 [00:03<00:07, 17.71it/s]
 33%|β–ˆβ–ˆβ–ˆβ–Ž      | 66/200 [00:03<00:07, 17.72it/s]
 34%|β–ˆβ–ˆβ–ˆβ–      | 68/200 [00:03<00:07, 17.72it/s]
 35%|β–ˆβ–ˆβ–ˆβ–Œ      | 70/200 [00:03<00:07, 17.29it/s]
 36%|β–ˆβ–ˆβ–ˆβ–Œ      | 72/200 [00:04<00:07, 16.96it/s]
 37%|β–ˆβ–ˆβ–ˆβ–‹      | 74/200 [00:04<00:07, 16.66it/s]
 38%|β–ˆβ–ˆβ–ˆβ–Š      | 76/200 [00:04<00:07, 16.61it/s]
 39%|β–ˆβ–ˆβ–ˆβ–‰      | 78/200 [00:04<00:07, 16.93it/s]
 40%|β–ˆβ–ˆβ–ˆβ–ˆ      | 80/200 [00:04<00:06, 17.17it/s]
 41%|β–ˆβ–ˆβ–ˆβ–ˆ      | 82/200 [00:04<00:06, 17.36it/s]
 42%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 84/200 [00:04<00:06, 17.48it/s]
 43%|β–ˆβ–ˆβ–ˆβ–ˆβ–Ž     | 86/200 [00:04<00:06, 17.58it/s]
 44%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 88/200 [00:05<00:06, 17.67it/s]
 45%|β–ˆβ–ˆβ–ˆβ–ˆβ–Œ     | 90/200 [00:05<00:06, 17.67it/s]
 46%|β–ˆβ–ˆβ–ˆβ–ˆβ–Œ     | 92/200 [00:05<00:06, 17.70it/s]
 47%|β–ˆβ–ˆβ–ˆβ–ˆβ–‹     | 94/200 [00:05<00:05, 17.73it/s]
 48%|β–ˆβ–ˆβ–ˆβ–ˆβ–Š     | 96/200 [00:05<00:05, 17.73it/s]
 49%|β–ˆβ–ˆβ–ˆβ–ˆβ–‰     | 98/200 [00:05<00:05, 17.73it/s]
 50%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ     | 100/200 [00:05<00:05, 17.74it/s]
 51%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ     | 102/200 [00:05<00:05, 17.73it/s]
 52%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 104/200 [00:05<00:05, 17.73it/s]
 53%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž    | 106/200 [00:06<00:05, 17.76it/s]
 54%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 108/200 [00:06<00:05, 17.75it/s]
 55%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ    | 110/200 [00:06<00:05, 17.76it/s]
 56%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ    | 112/200 [00:06<00:05, 17.41it/s]
 57%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹    | 114/200 [00:06<00:05, 16.81it/s]
 58%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š    | 116/200 [00:06<00:05, 16.53it/s]
 59%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰    | 118/200 [00:06<00:05, 16.39it/s]
 60%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ    | 120/200 [00:06<00:04, 16.78it/s]
 61%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ    | 122/200 [00:07<00:04, 17.06it/s]
 62%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 124/200 [00:07<00:04, 17.27it/s]
 63%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž   | 126/200 [00:07<00:04, 17.42it/s]
 64%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 128/200 [00:07<00:04, 17.52it/s]
 65%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ   | 130/200 [00:07<00:03, 17.61it/s]
 66%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ   | 132/200 [00:07<00:03, 17.64it/s]
 67%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹   | 134/200 [00:07<00:03, 17.66it/s]
 68%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š   | 136/200 [00:07<00:03, 17.70it/s]
 69%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰   | 138/200 [00:07<00:03, 17.71it/s]
 70%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ   | 140/200 [00:08<00:03, 17.71it/s]
 71%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ   | 142/200 [00:08<00:03, 17.74it/s]
 72%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 144/200 [00:08<00:03, 17.75it/s]
 73%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž  | 146/200 [00:08<00:03, 17.68it/s]
 74%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 148/200 [00:08<00:02, 17.72it/s]
 75%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ  | 150/200 [00:08<00:02, 17.73it/s]
 76%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ  | 152/200 [00:08<00:02, 17.74it/s]
 77%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹  | 154/200 [00:08<00:02, 17.58it/s]
 78%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š  | 156/200 [00:08<00:02, 17.23it/s]
 79%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰  | 158/200 [00:09<00:02, 16.07it/s]
 80%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  | 160/200 [00:09<00:02, 15.37it/s]
 81%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  | 162/200 [00:09<00:02, 16.01it/s]
 82%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 164/200 [00:09<00:02, 16.50it/s]
 83%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž | 166/200 [00:09<00:02, 16.87it/s]
 84%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 168/200 [00:09<00:01, 16.97it/s]
 85%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ | 170/200 [00:09<00:01, 17.19it/s]
 86%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ | 172/200 [00:09<00:01, 17.37it/s]
 87%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹ | 174/200 [00:10<00:01, 17.29it/s]
 88%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š | 176/200 [00:10<00:01, 17.27it/s]
 89%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰ | 178/200 [00:10<00:01, 17.43it/s]
 90%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ | 180/200 [00:10<00:01, 17.52it/s]
 91%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ | 182/200 [00:10<00:01, 17.60it/s]
 92%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 184/200 [00:10<00:00, 17.65it/s]
 93%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž| 186/200 [00:10<00:00, 17.68it/s]
 94%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 188/200 [00:10<00:00, 17.69it/s]
 95%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ| 190/200 [00:10<00:00, 17.72it/s]
 96%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ| 192/200 [00:11<00:00, 17.73it/s]
 97%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹| 194/200 [00:11<00:00, 17.68it/s]
 98%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š| 196/200 [00:11<00:00, 17.50it/s]
 99%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰| 198/200 [00:11<00:00, 17.03it/s]
100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 200/200 [00:11<00:00, 16.68it/s]
100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 200/200 [00:11<00:00, 17.37it/s]
Measurement PSNR: 27.3 dB
Poisson2Sparse PSNR: 31.0 dB
References:

Total running time of the script: (0 minutes 12.987 seconds)

Gallery generated by Sphinx-Gallery