Eidors-logo    

EIDORS: Electrical Impedance Tomography and Diffuse Optical Tomography Reconstruction Software

EIDORS (mirror)
Main
Documentation
Examples
Tutorials
− Image Reconst
− Data Structures
− Application Examples
− FEM Modelling
Download
Contrib Data
GREIT
Browse SVN

News
FAQ
Developer
                       

 

Hosted by SourceForge.net Logo

 

Introduction to dual models

Dual model systems use two models of the underlying system:
  • a fine (high density) FEM, on which to perform the forward model (calculate measurements from parameters), and
  • a coarse (lower density) FEM, on which to perform the inverse problem (reconstructing image parameters from measurements)

Figure: Schematic of a dual model based inverse problem

Simulated data

First, simulate some data, based on a 576 element mesh
% Simulate data $Id: dual_model01.m 1535 2008-07-26 15:36:27Z aadler $
imdl= mk_common_model('c2c2',16);
img=calc_jacobian_bkgnd(imdl);
vh=fwd_solve(img);
idx=[365,328,292,259,227,198,170,145,121];
img.elem_data([idx,idx+1,101,81])=1.1;
vi=fwd_solve(img);

subplot(221)
show_fem(img);
print -r125 -dpng dual_model01a.png;


Figure: Simulation data

Simple Example: Dual model using multi-element parameters

Next, we compare two coarse meshes
  1. A 64 element mesh where the fine==coarse mesh. There are 64 conductivity parameters to solve
  2. A 64 element mesh where 4 inner elements have the same conductivity. Thus there are 64-(4-1)=61 conductivity parameters to solve
  3. A 64 element mesh where 9 elements in an inner pie slice have the same conductivity. Thus there are 64-(9-1)=56 conductivity parameters to solve
% Simulate data $Id: dual_model02.m 1535 2008-07-26 15:36:27Z aadler $

% create base model
mdl_base=mk_common_model('a2c0',16);
mdl_base.RtR_prior = @noser_image_prior;
mdl_base.hyperparameter.value = 3e-2;

elems= mdl_base.fwd_model.elems;
nodes= mdl_base.fwd_model.nodes;
e= size(elems,1);


for model = 1:3
   if model==1
% Model 1: coarse==fine. each elem has a parameter
      params= 1:e; 
   elseif model==2
% Model 2: coarse model, inner circle has one parameter
      params= [1,1,1,1, 2:e-3];
   elseif model==3
% Model 3: coarse model, top left slice has one parameter
      params= 1:e;
      params([4,8,15:16,23:24,34:36])= 0;
      [jnk1,jnk2,params]= unique(params);
   end

% Create inverse_model
   imdl(model)= mdl_base;
   imdl(model).fwd_model.coarse2fine = sparse(1:e,params,1,e,max(params));

   subplot(2,3, model)
   show_fem(imdl(model).fwd_model);

% Show parameter numbers
   numeros= reshape(sprintf('%2d',params),2,e)';
   xc=mean(reshape(nodes(elems,1),e,3),2);
   yc=mean(reshape(nodes(elems,2),e,3),2);
   text(xc,yc,numeros,'FontSize',8, ...
            'HorizontalAlignment','center');

end

print -r125 -dpng dual_model02a.png;


Figure: Left "Fine" mesh (64 parameters) Middle Coarse mesh (61 parameters) Right Coarse mesh (56 parameters)

Coarse to Fine Mapping

If we consider a smaller model, where
   % fine_param_1 == coarse_param_1
   % fine_param_2 == coarse_param_2
   % fine_param_3 == coarse_param_3
   % fine_param_4 == coarse_param_3
Then the mapping from coarse to fine would be
   [ 1 0 0 ] [ coarse_param_1 ]   [ fine_param_1 ]
   [ 0 1 0 ] [ coarse_param_2 ] = [ fine_param_2 ]
   [ 0 0 1 ] [ coarse_param_3 ]   [ fine_param_3 ]
   [ 0 0 1 ]                      [ fine_param_4 ]

Image Reconstructions

% Simulate data $Id: dual_model03.m 1535 2008-07-26 15:36:27Z aadler $

for model= 1:3
   img= inv_solve(imdl(model), vh, vi);
   subplot(2,3,model)
   show_fem(img);
end

print -r125 -dpng dual_model03a.png;


Figure: Reconstructed images. Left "Fine" mesh (64 parameters) Middle Coarse mesh (61 parameters) Right Coarse mesh (56 parameters)

Example #2: Fine and Coarse meshes

We consider a coarse mesh of 64 elements, and fine meshes of 64 (same as coarse), 256, and 576 elements
% create fine meshes $Id: dual_model04.m 1535 2008-07-26 15:36:27Z aadler $

% create base model
mdl_coarse=mk_common_model('a2c0',16);

for model = 1:3
   if model==1
% Model 1: 64 elements
      mdl_str= 'a2c0';
   elseif model==2
% Model 2: 256 elements
      mdl_str= 'b2c0';
   elseif model==3
% Model 3: 576 elements
      mdl_str= 'c2c0';
   end

   mdl_fine= mk_common_model(mdl_str,16);
   mdl_fine.fwd_model.mk_coarse_fine_mapping.n_interp= 150;
   mdl_fine.RtR_prior = @noser_image_prior;
   mdl_fine.hyperparameter.value = 3e-2;

   imdl(model)= mdl_fine;
   imdl(model).fwd_model.coarse2fine = ...
       mk_coarse_fine_mapping( mdl_fine.fwd_model, mdl_coarse.fwd_model);

   subplot(2,3, model)
   show_fem(mdl_fine.fwd_model);

end

print -r125 -dpng dual_model04a.png;


Figure: Reconstructed images. Left "Fine" mesh (64 elements) Middle Fine mesh (256 elements) Right Fine mesh (576 elements)
Reconstruct images, and then image onto the coarse model and the fine model.
% Simulate data $Id: dual_model05.m 1535 2008-07-26 15:36:27Z aadler $

% Reconstruct
for model= 1:3
   img(model)= inv_solve(imdl(model), vh, vi);
end

% Show image mapped to fine model
for model= 1:3
   subplot(2,3,model)
   show_fem(img(model));
end

print -r125 -dpng dual_model05b.png;

% Show image mapped to coarse model
for model= 1:3
   subplot(2,3,model)
   img(model).fwd_model = mdl_coarse.fwd_model;
   show_fem(img(model));
end

print -r125 -dpng dual_model05a.png;


Figure: Reconstructed images mapped onto the coarse model. Left "Fine" mesh (64 elements) Middle Fine mesh (256 elements) Right Fine mesh (576 elements)

Figure: Reconstructed images mapped onto the fine model. Left "Fine" mesh (64 elements) Middle Fine mesh (256 elements) Right Fine mesh (576 elements)

Last Modified: $Date: 2008-07-26 11:36:27 -0400 (Sat, 26 Jul 2008) $ by $Author: aadler $