This repository contains a FEM solver for the complete electrode model (CEM) used in electrical impedance tomography (EIT). The FEM solver is implemented in FenicsX. The Jacobian computation follows the work by Margotti (Section 5.2.2.)
This solver was used in the submission to KTC2023 by the team Alexander Denker, Zeljko Kereta, Imraj Singh, Tom Freudenberg, Tobias Kluth, Simon Arridge and Peter Maass from University of Bremen and University College London.
Let
where
where
For a fixed
for
We define the forward operator as
The goal in EIT is to recover the conductivity distribution
Recover
$\sigma$ from measurements$U^{(k)}$ with$F(\sigma)I^{(k)} = U^{(k)}$ for current patterns$I^{(k)}, k=1,\dots, K$
There exist a variety of methods to solve this inverse problem. This repository will contain different reconstruction methods:
- Linearised Reconstruction, see e.g. Kaipio et al. (2000)
- Gauss-Newton Methods, see e.g. Borsic et al. (2010)
- L1-Sparsity, see e.g. Gehre et al. (2012)
In addition, data-driven methods will be added at a later point.
You will need to install FenicsX:
conda create -n fenicsx-env
conda activate fenicsx-env
conda install -c conda-forge fenics-dolfinx mpich pyvista
FenicsX is compatible with pytorch. The code is tested with pytorch version 2.3.1 and CUDA 12.1. This can be installed via:
conda install pytorch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 pytorch-cuda=12.1 -c pytorch -c nvidia
The script reconstruct_simulated_data.py
contains an example to reconstruct from (noisy) simulated measurements with both the L1-Sparsity algorithm, a Gauss-Newton method with a Gaussian smoothness regulariser and a Gauss-Newton method with a (smoothed) TV regulariser. We use 16 electrodes and apply 15 current injections. The current injection are of the form All against 1
, i.e., we apply current between electrodes 1-2,1-3,1-4, ...,1-16. In addition, we add 1% relative Gaussian noise to the measurements.
There exist a preliminary version of a torch wrapper in src/torch_wrapper.py
with an example script in torch_reconstructor.py
. We use the same experimental setting as before. For the optimiser we make use of ADAM with a fixed step size.
I tested the code also on the KIT4 dataset, available on zenodo. Example reconstructions are below:
If you use this FEM solver in your work, please cite:
@article{denker2024data,
title={Data-driven approaches for electrical impedance tomography image segmentation from partial boundary data},
author={Denker, Alexander and Kereta, {\v{Z}}eljko and Singh, Imraj and Freudenberg, Tom and Kluth, Tobias and Maass, Peter and Arridge, Simon},
journal={Applied Mathematics for Modern Challenges},
pages={0--0},
year={2024},
publisher={Applied Mathematics for Modern Challenges}
}