adler-j / learned_gradient_tomography

Solving ill-posed inverse problems using iterative deep neural networks
89 stars 30 forks source link

Use poisson noise instead of white noise #4

Open Fedour opened 5 years ago

Fedour commented 5 years ago

Hi, I'm currently using your learned gradient tomography in a 3D case. I would like to use a poisson noise instead of a white noise

So in your generate_data function I replace:

data = operator(phantom)
noisy_data = data + odl.phantom.white_noise(operator.range) * np.mean(np.abs(data)) * 0.05
fbp = pseudoinverse(noisy_data)

By:

data = operator(phantom)
noise = np.random.poisson(0.05,size=operator.range.shape)
noisy_data = data + noise
fbp = pseudoinverse(noisy_data)

But I don't get a good result, the image is only noisy in some places

After some researches I noticed that it was due to the following code:


# Ensure operator has fixed operator norm for scale invariance
opnorm = odl.power_method_opnorm(operator)
operator = (1 / opnorm) * operator
pseudoinverse = pseudoinverse * opnorm

But if I remove this part of code the network does not learn anymore.

I would like to know if there is a clean way to apply a good poisson noise on data. Thank you in advance for your assistance with this.

adler-j commented 5 years ago

Hello, great to hear that you are interested.

With respect to poisson noise, you need to provide a data vector as input, e.g.

data = operator(phantom)
noisy_data = np.random.poisson(data)
fbp = pseudoinverse(noisy_data)

With respect to the operator norm scaling, this is needed to ensure that all values in the network are "approximately normal", you could have a look at e.g. this paper for more info http://proceedings.mlr.press/v9/glorot10a.html

One way to solve this is to apply the scaling inside the network rather than on the operator.