Note
New to DeepInverse? Get started with the basics with the 5 minute quickstart tutorial.
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", ""],
)

0%| | 0/200 [00:00<?, ?it/s]
0%| | 1/200 [00:00<00:29, 6.64it/s]
1%| | 2/200 [00:00<00:28, 6.99it/s]
2%|β | 3/200 [00:00<00:27, 7.12it/s]
2%|β | 4/200 [00:00<00:26, 7.31it/s]
2%|β | 5/200 [00:00<00:26, 7.42it/s]
3%|β | 6/200 [00:00<00:25, 7.50it/s]
4%|β | 7/200 [00:00<00:25, 7.55it/s]
4%|β | 8/200 [00:01<00:25, 7.58it/s]
4%|β | 9/200 [00:01<00:25, 7.58it/s]
5%|β | 10/200 [00:01<00:25, 7.59it/s]
6%|β | 11/200 [00:01<00:25, 7.55it/s]
6%|β | 12/200 [00:01<00:25, 7.52it/s]
6%|β | 13/200 [00:01<00:25, 7.44it/s]
7%|β | 14/200 [00:01<00:25, 7.43it/s]
8%|β | 15/200 [00:02<00:24, 7.47it/s]
8%|β | 16/200 [00:02<00:24, 7.53it/s]
8%|β | 17/200 [00:02<00:24, 7.41it/s]
9%|β | 18/200 [00:02<00:24, 7.33it/s]
10%|β | 19/200 [00:02<00:24, 7.35it/s]
10%|β | 20/200 [00:02<00:24, 7.34it/s]
10%|β | 21/200 [00:02<00:24, 7.32it/s]
11%|β | 22/200 [00:02<00:24, 7.29it/s]
12%|ββ | 23/200 [00:03<00:24, 7.36it/s]
12%|ββ | 24/200 [00:03<00:23, 7.41it/s]
12%|ββ | 25/200 [00:03<00:23, 7.42it/s]
13%|ββ | 26/200 [00:03<00:23, 7.43it/s]
14%|ββ | 27/200 [00:03<00:23, 7.42it/s]
14%|ββ | 28/200 [00:03<00:23, 7.42it/s]
14%|ββ | 29/200 [00:03<00:22, 7.46it/s]
15%|ββ | 30/200 [00:04<00:22, 7.48it/s]
16%|ββ | 31/200 [00:04<00:22, 7.47it/s]
16%|ββ | 32/200 [00:04<00:22, 7.33it/s]
16%|ββ | 33/200 [00:04<00:22, 7.36it/s]
17%|ββ | 34/200 [00:04<00:22, 7.46it/s]
18%|ββ | 35/200 [00:04<00:21, 7.54it/s]
18%|ββ | 36/200 [00:04<00:21, 7.51it/s]
18%|ββ | 37/200 [00:04<00:21, 7.43it/s]
19%|ββ | 38/200 [00:05<00:21, 7.44it/s]
20%|ββ | 39/200 [00:05<00:21, 7.46it/s]
20%|ββ | 40/200 [00:05<00:21, 7.53it/s]
20%|ββ | 41/200 [00:05<00:20, 7.60it/s]
21%|ββ | 42/200 [00:05<00:20, 7.64it/s]
22%|βββ | 43/200 [00:05<00:20, 7.60it/s]
22%|βββ | 44/200 [00:05<00:20, 7.63it/s]
22%|βββ | 45/200 [00:06<00:20, 7.62it/s]
23%|βββ | 46/200 [00:06<00:20, 7.64it/s]
24%|βββ | 47/200 [00:06<00:20, 7.55it/s]
24%|βββ | 48/200 [00:06<00:20, 7.58it/s]
24%|βββ | 49/200 [00:06<00:19, 7.62it/s]
25%|βββ | 50/200 [00:06<00:19, 7.55it/s]
26%|βββ | 51/200 [00:06<00:19, 7.51it/s]
26%|βββ | 52/200 [00:06<00:19, 7.47it/s]
26%|βββ | 53/200 [00:07<00:20, 7.33it/s]
27%|βββ | 54/200 [00:07<00:19, 7.36it/s]
28%|βββ | 55/200 [00:07<00:19, 7.36it/s]
28%|βββ | 56/200 [00:07<00:19, 7.42it/s]
28%|βββ | 57/200 [00:07<00:19, 7.25it/s]
29%|βββ | 58/200 [00:07<00:19, 7.24it/s]
30%|βββ | 59/200 [00:07<00:19, 7.25it/s]
30%|βββ | 60/200 [00:08<00:19, 7.26it/s]
30%|βββ | 61/200 [00:08<00:19, 7.27it/s]
31%|βββ | 62/200 [00:08<00:18, 7.28it/s]
32%|ββββ | 63/200 [00:08<00:18, 7.32it/s]
32%|ββββ | 64/200 [00:08<00:18, 7.37it/s]
32%|ββββ | 65/200 [00:08<00:18, 7.49it/s]
33%|ββββ | 66/200 [00:08<00:17, 7.56it/s]
34%|ββββ | 67/200 [00:09<00:17, 7.60it/s]
34%|ββββ | 68/200 [00:09<00:17, 7.57it/s]
34%|ββββ | 69/200 [00:09<00:17, 7.51it/s]
35%|ββββ | 70/200 [00:09<00:17, 7.54it/s]
36%|ββββ | 71/200 [00:09<00:17, 7.57it/s]
36%|ββββ | 72/200 [00:09<00:16, 7.61it/s]
36%|ββββ | 73/200 [00:09<00:16, 7.65it/s]
37%|ββββ | 74/200 [00:09<00:16, 7.62it/s]
38%|ββββ | 75/200 [00:10<00:16, 7.59it/s]
38%|ββββ | 76/200 [00:10<00:16, 7.66it/s]
38%|ββββ | 77/200 [00:10<00:16, 7.66it/s]
39%|ββββ | 78/200 [00:10<00:15, 7.66it/s]
40%|ββββ | 79/200 [00:10<00:15, 7.63it/s]
40%|ββββ | 80/200 [00:10<00:15, 7.59it/s]
40%|ββββ | 81/200 [00:10<00:15, 7.57it/s]
41%|ββββ | 82/200 [00:10<00:15, 7.49it/s]
42%|βββββ | 83/200 [00:11<00:15, 7.57it/s]
42%|βββββ | 84/200 [00:11<00:15, 7.62it/s]
42%|βββββ | 85/200 [00:11<00:15, 7.66it/s]
43%|βββββ | 86/200 [00:11<00:14, 7.65it/s]
44%|βββββ | 87/200 [00:11<00:14, 7.62it/s]
44%|βββββ | 88/200 [00:11<00:14, 7.63it/s]
44%|βββββ | 89/200 [00:11<00:14, 7.61it/s]
45%|βββββ | 90/200 [00:12<00:14, 7.54it/s]
46%|βββββ | 91/200 [00:12<00:14, 7.48it/s]
46%|βββββ | 92/200 [00:12<00:14, 7.46it/s]
46%|βββββ | 93/200 [00:12<00:14, 7.51it/s]
47%|βββββ | 94/200 [00:12<00:14, 7.50it/s]
48%|βββββ | 95/200 [00:12<00:13, 7.57it/s]
48%|βββββ | 96/200 [00:12<00:13, 7.60it/s]
48%|βββββ | 97/200 [00:12<00:13, 7.60it/s]
49%|βββββ | 98/200 [00:13<00:13, 7.62it/s]
50%|βββββ | 99/200 [00:13<00:13, 7.56it/s]
50%|βββββ | 100/200 [00:13<00:13, 7.59it/s]
50%|βββββ | 101/200 [00:13<00:12, 7.63it/s]
51%|βββββ | 102/200 [00:13<00:12, 7.59it/s]
52%|ββββββ | 103/200 [00:13<00:12, 7.60it/s]
52%|ββββββ | 104/200 [00:13<00:12, 7.64it/s]
52%|ββββββ | 105/200 [00:14<00:12, 7.64it/s]
53%|ββββββ | 106/200 [00:14<00:12, 7.54it/s]
54%|ββββββ | 107/200 [00:14<00:12, 7.58it/s]
54%|ββββββ | 108/200 [00:14<00:12, 7.60it/s]
55%|ββββββ | 109/200 [00:14<00:12, 7.57it/s]
55%|ββββββ | 110/200 [00:14<00:11, 7.60it/s]
56%|ββββββ | 111/200 [00:14<00:11, 7.58it/s]
56%|ββββββ | 112/200 [00:14<00:11, 7.65it/s]
56%|ββββββ | 113/200 [00:15<00:11, 7.67it/s]
57%|ββββββ | 114/200 [00:15<00:11, 7.70it/s]
57%|ββββββ | 115/200 [00:15<00:11, 7.68it/s]
58%|ββββββ | 116/200 [00:15<00:10, 7.70it/s]
58%|ββββββ | 117/200 [00:15<00:10, 7.71it/s]
59%|ββββββ | 118/200 [00:15<00:10, 7.68it/s]
60%|ββββββ | 119/200 [00:15<00:10, 7.67it/s]
60%|ββββββ | 120/200 [00:15<00:10, 7.61it/s]
60%|ββββββ | 121/200 [00:16<00:10, 7.66it/s]
61%|ββββββ | 122/200 [00:16<00:10, 7.68it/s]
62%|βββββββ | 123/200 [00:16<00:10, 7.65it/s]
62%|βββββββ | 124/200 [00:16<00:09, 7.67it/s]
62%|βββββββ | 125/200 [00:16<00:09, 7.58it/s]
63%|βββββββ | 126/200 [00:16<00:10, 7.37it/s]
64%|βββββββ | 127/200 [00:16<00:10, 7.27it/s]
64%|βββββββ | 128/200 [00:17<00:09, 7.27it/s]
64%|βββββββ | 129/200 [00:17<00:09, 7.25it/s]
65%|βββββββ | 130/200 [00:17<00:09, 7.17it/s]
66%|βββββββ | 131/200 [00:17<00:09, 7.22it/s]
66%|βββββββ | 132/200 [00:17<00:09, 7.21it/s]
66%|βββββββ | 133/200 [00:17<00:09, 7.24it/s]
67%|βββββββ | 134/200 [00:17<00:09, 7.28it/s]
68%|βββββββ | 135/200 [00:18<00:08, 7.31it/s]
68%|βββββββ | 136/200 [00:18<00:08, 7.37it/s]
68%|βββββββ | 137/200 [00:18<00:08, 7.46it/s]
69%|βββββββ | 138/200 [00:18<00:08, 7.55it/s]
70%|βββββββ | 139/200 [00:18<00:08, 7.58it/s]
70%|βββββββ | 140/200 [00:18<00:07, 7.53it/s]
70%|βββββββ | 141/200 [00:18<00:07, 7.51it/s]
71%|βββββββ | 142/200 [00:18<00:07, 7.49it/s]
72%|ββββββββ | 143/200 [00:19<00:07, 7.51it/s]
72%|ββββββββ | 144/200 [00:19<00:07, 7.48it/s]
72%|ββββββββ | 145/200 [00:19<00:07, 7.50it/s]
73%|ββββββββ | 146/200 [00:19<00:07, 7.53it/s]
74%|ββββββββ | 147/200 [00:19<00:07, 7.50it/s]
74%|ββββββββ | 148/200 [00:19<00:06, 7.56it/s]
74%|ββββββββ | 149/200 [00:19<00:06, 7.65it/s]
75%|ββββββββ | 150/200 [00:19<00:06, 7.73it/s]
76%|ββββββββ | 151/200 [00:20<00:06, 7.76it/s]
76%|ββββββββ | 152/200 [00:20<00:06, 7.78it/s]
76%|ββββββββ | 153/200 [00:20<00:06, 7.78it/s]
77%|ββββββββ | 154/200 [00:20<00:05, 7.80it/s]
78%|ββββββββ | 155/200 [00:20<00:05, 7.76it/s]
78%|ββββββββ | 156/200 [00:20<00:05, 7.71it/s]
78%|ββββββββ | 157/200 [00:20<00:05, 7.62it/s]
79%|ββββββββ | 158/200 [00:21<00:05, 7.58it/s]
80%|ββββββββ | 159/200 [00:21<00:05, 7.63it/s]
80%|ββββββββ | 160/200 [00:21<00:05, 7.66it/s]
80%|ββββββββ | 161/200 [00:21<00:05, 7.71it/s]
81%|ββββββββ | 162/200 [00:21<00:04, 7.70it/s]
82%|βββββββββ | 163/200 [00:21<00:04, 7.70it/s]
82%|βββββββββ | 164/200 [00:21<00:04, 7.76it/s]
82%|βββββββββ | 165/200 [00:21<00:04, 7.80it/s]
83%|βββββββββ | 166/200 [00:22<00:04, 7.76it/s]
84%|βββββββββ | 167/200 [00:22<00:04, 7.72it/s]
84%|βββββββββ | 168/200 [00:22<00:04, 7.64it/s]
84%|βββββββββ | 169/200 [00:22<00:04, 7.54it/s]
85%|βββββββββ | 170/200 [00:22<00:03, 7.54it/s]
86%|βββββββββ | 171/200 [00:22<00:03, 7.53it/s]
86%|βββββββββ | 172/200 [00:22<00:03, 7.50it/s]
86%|βββββββββ | 173/200 [00:23<00:03, 7.42it/s]
87%|βββββββββ | 174/200 [00:23<00:03, 7.10it/s]
88%|βββββββββ | 175/200 [00:23<00:03, 6.93it/s]
88%|βββββββββ | 176/200 [00:23<00:03, 7.03it/s]
88%|βββββββββ | 177/200 [00:23<00:03, 7.08it/s]
89%|βββββββββ | 178/200 [00:23<00:03, 7.13it/s]
90%|βββββββββ | 179/200 [00:23<00:02, 7.18it/s]
90%|βββββββββ | 180/200 [00:23<00:02, 7.33it/s]
90%|βββββββββ | 181/200 [00:24<00:02, 7.36it/s]
91%|βββββββββ | 182/200 [00:24<00:02, 7.30it/s]
92%|ββββββββββ| 183/200 [00:24<00:02, 7.34it/s]
92%|ββββββββββ| 184/200 [00:24<00:02, 7.38it/s]
92%|ββββββββββ| 185/200 [00:24<00:02, 7.37it/s]
93%|ββββββββββ| 186/200 [00:24<00:01, 7.53it/s]
94%|ββββββββββ| 187/200 [00:24<00:01, 7.61it/s]
94%|ββββββββββ| 188/200 [00:25<00:01, 7.61it/s]
94%|ββββββββββ| 189/200 [00:25<00:01, 7.65it/s]
95%|ββββββββββ| 190/200 [00:25<00:01, 7.70it/s]
96%|ββββββββββ| 191/200 [00:25<00:01, 7.52it/s]
96%|ββββββββββ| 192/200 [00:25<00:01, 7.34it/s]
96%|ββββββββββ| 193/200 [00:25<00:00, 7.29it/s]
97%|ββββββββββ| 194/200 [00:25<00:00, 7.31it/s]
98%|ββββββββββ| 195/200 [00:26<00:00, 7.29it/s]
98%|ββββββββββ| 196/200 [00:26<00:00, 7.13it/s]
98%|ββββββββββ| 197/200 [00:26<00:00, 7.22it/s]
99%|ββββββββββ| 198/200 [00:26<00:00, 7.29it/s]
100%|ββββββββββ| 199/200 [00:26<00:00, 7.35it/s]
100%|ββββββββββ| 200/200 [00:26<00:00, 7.45it/s]
100%|ββββββββββ| 200/200 [00:26<00:00, 7.49it/s]
Measurement PSNR: 27.3 dB
Poisson2Sparse PSNR: 31.1 dB
- References:
Total running time of the script: (0 minutes 27.220 seconds)