EIDORS: Electrical Impedance Tomography and Diffuse Optical Tomography Reconstruction Software |
EIDORS
(mirror) Main Documentation Tutorials − Image Reconst − Data Structures − Applications − FEM Modelling − GREIT − Old tutorials − Workshop Download Contrib Data GREIT Browse Docs Browse SVN News Mailing list (archive) FAQ Developer
|
Absolute Imaging: Non-Linear Gauss Newton Image ReconstructionThis tutorial shows use of EIDORS for static image reconstructions. First, use a large (20951 element) model to simulate target inhomogeneities. The mat file with the FEM models may be downloaded here (tutorial151_model.mat).% Create model for Absolute Imaging % Based on example from Stephen Murphy % $Id: tutorial151a.m 2784 2011-07-14 21:25:40Z bgrychtol $ load tutorial151_model.mat % Create Simulation Model sim_img= eidors_obj('image', 'Simulation Image'); sim_img.fwd_model= simmdl; backgnd= .02; sim_img.elem_data= backgnd*ones(size(simmdl.elems,1),1); sim_img.elem_data(target1)= backgnd*2; sim_img.elem_data(target2)= backgnd/4; clf; axes('position',[.1,.1,.65,.8]); show_fem(sim_img); view(-33,20); axes('position',[.8,.1,.15,.8]); show_slices(sim_img,5); print_convert tutorial151a.png '-density 75' Figure: Left: Simulation Model (20951 elements), showing a non-conductive (blue) and conductive (red) target Right: Simulation Model viewed as equispaced horizontal slices % Simulate data for difference and absolute imaging % $Id: tutorial151b.m 2784 2011-07-14 21:25:40Z bgrychtol $ % Create homogeneous simulation Model backgnd= .02; sim_img.elem_data= backgnd*ones(size(simmdl.elems,1),1); v_homg= fwd_solve(sim_img); % Create target simulation Model sim_img.elem_data(target1)= backgnd*2; sim_img.elem_data(target2)= backgnd/4; v_targ= fwd_solve(sim_img); clf; subplot(211); plot([v_homg.meas, v_targ.meas]); print_convert tutorial151b.png '-density 75' Figure: Green Homogeneous measurements, Blue Target measurements, % Difference imaging result % $Id: tutorial151c.m 4839 2015-03-30 07:44:50Z aadler $ % imdl is loaded from file tutorial151_model.mat imdl.reconst_type= 'difference'; imdl.solve= @inv_solve_diff_GN_one_step; imdl.jacobian_bkgnd.value= backgnd; imdl.hyperparameter.value= .1; img_diff= inv_solve(imdl, v_homg, v_targ); clf; axes('position',[.1,.1,.65,.8]); show_fem(img_diff); view(-33,20); axes('position',[.8,.1,.15,.8]); show_slices(img_diff,5); print_convert tutorial151c.png '-density 75' Figure: Left: Reconstructed Image (2266 elements), showing a non-conductive (blue) and conductive (red) target Right: Simulation Model viewed as equispaced horizontal slices function img= tutorial151_nonlinearGN( inv_model, data ) % TUTORIAL151_NONLINEARGN Non-Linear EIT Inverse % img => output image (or vector of images) % inv_model => inverse model struct % data => measurement data % $Id: tutorial151_nonlinearGN.m 3661 2012-11-20 21:18:01Z bgrychtol $ fwd_model= inv_model.fwd_model; img= eidors_obj('image','Solved by tutorial151_nonlinearGN'); img.fwd_model= fwd_model; sol= inv_model.tutorial151_nonlinearGN.init_backgnd * ... ones(size(fwd_model.elems,1),1); RtR = calc_RtR_prior( inv_model ); hp2 = calc_hyperparameter( inv_model )^2; factor= 0; norm_d_data= inf; for iter= 1:inv_model.parameters.max_iterations img.elem_data= sol; simdata= fwd_solve( img ); d_data= data - simdata.meas; prev_norm_d_data= norm_d_data; norm_d_data= norm(d_data); eidors_msg('tutorial151_nonlinearGN: iter=%d err=%f factor=%f', ... iter,norm_d_data, factor, 2); if prev_norm_d_data - norm_d_data < inv_model.parameters.term_tolerance break; end J = calc_jacobian( img); delta_sol = (J.'*J + hp2*RtR)\ (J.' * d_data); factor= linesearch(img, data, sol, delta_sol, norm_d_data); sol = sol + factor*delta_sol; end img.elem_data= sol; % Test several different factors to see which minimizes best function factor= linesearch(img, data, sol, delta_sol, norm_d_data); facts= [0, logspace(-3,0,19)]; norms= norm_d_data; for f= 2:length(facts); img.elem_data= sol + facts(f)*delta_sol; simdata= fwd_solve( img ); norms(f)= norm(data - simdata.meas); end ff= find(norms==min(norms)); factor= facts(ff(end));Using this function, the following code will do absolute imaging % Absolute imaging result % $Id: tutorial151d.m 4839 2015-03-30 07:44:50Z aadler $ % imdl is loaded from file tutorial151_model.mat imdl.reconst_type= 'static'; imdl.solve= @tutorial151_nonlinearGN; imdl.parameters.term_tolerance= 1e-5; imdl.parameters.max_iterations= 10; % special parameter for this model imdl.tutorial151_nonlinearGN.init_backgnd= backgnd; imdl.hyperparameter.value= 2; img_diff= inv_solve(imdl, v_targ); clf; axes('position',[.1,.1,.65,.8]); show_fem(img_diff); view(-33,20); axes('position',[.8,.1,.15,.8]); show_slices(img_diff,5); print_convert tutorial151d.png '-density 75'Running this code gives the following output: >> tutorial151d; EIDORS:[ inv_solve:nonlinear Gauss Newton for absolute imaging demo ] EIDORS:[ tutorial151_nonlinearGN: iter=1 err=52.820965 factor=0.000000 ] EIDORS:[ tutorial151_nonlinearGN: iter=2 err=11.468709 factor=0.014678 ] EIDORS:[ tutorial151_nonlinearGN: iter=3 err=7.208743 factor=0.014678 ] EIDORS:[ tutorial151_nonlinearGN: iter=4 err=2.284559 factor=0.031623 ] EIDORS:[ tutorial151_nonlinearGN: iter=5 err=0.850762 factor=0.014678 ] EIDORS:[ tutorial151_nonlinearGN: iter=6 err=0.599933 factor=0.021544 ] EIDORS:[ tutorial151_nonlinearGN: iter=7 err=0.519560 factor=0.031623 ] EIDORS:[ tutorial151_nonlinearGN: iter=8 err=0.341341 factor=0.068129 ] EIDORS:[ tutorial151_nonlinearGN: iter=9 err=0.307938 factor=0.014678 ] EIDORS:[ tutorial151_nonlinearGN: iter=10 err=0.262837 factor=0.068129 ] Figure: Left: Reconstructed absolute Image (2266 elements), showing a non-conductive (blue) and conductive (red) target Right: Simulation Model viewed as equispaced horizontal slices |
Last Modified: $Date: 2017-03-01 08:44:21 -0500 (Wed, 01 Mar 2017) $ by $Author: aadler $