Difference between revisions of "Projects:RegistrationImprovement"

From NAMIC Wiki
Jump to: navigation, search
m (Text replacement - "http://www.slicer.org/slicerWiki/index.php/" to "https://www.slicer.org/wiki/")
 
(27 intermediate revisions by 3 users not shown)
Line 5: Line 5:
 
*Kitware: Casey Goodlett with consultation from Will Schroeder and Stephen Aylward
 
*Kitware: Casey Goodlett with consultation from Will Schroeder and Stephen Aylward
 
*BWH: Ron Kikinis, Dominik Meier, Andriy Fedorov
 
*BWH: Ron Kikinis, Dominik Meier, Andriy Fedorov
 +
 +
= RegisterImages Algorithm =
 +
 +
*ITK Metrics used: [http://www.itk.org/Doxygen/html/classitk_1_1MattesMutualInformationImageToImageMetric.html MattesMutualInformation]
 +
*Optimizer: [http://www.itk.org/Doxygen/html/classitk_1_1OnePlusOneEvolutionaryOptimizer.html OnePlusOne Evolutionary Optimizer] followed by [http://www.itk.org/Doxygen/html/classitk_1_1FRPROptimizer.html FRPR]  in fletcher reeves mode
 +
*Transform Types: Rigid transform [http://www.itk.org/Doxygen/html/classitk_1_1VersorRigid3DTransform.html VersorRigid3DTransform], Affine transform [http://www.itk.org/Doxygen/html/classitk_1_1AffineTransform.html AffineTransform], B-spline transform [http://www.itk.org/Doxygen/html/classitk_1_1BSplineDeformableTransform.html BSplineDeformableTransform]
 +
*Initialization types, details on landmark-based initialization
 +
 +
A user should typically one of the Pipeline methods (PipelineRigid, PipelineAffine, PipelineBspline) as these will run Initalization -> Rigid -> Affine -> Bspline to the specified level.  These are run in order to convergence or maximum # of iterations.  Within each pipeline step there is a two stage optimization.  First the evolution optmizer is run to stochastically chose a starting location for optimization.  After this the FRPR optimizer is used.  Currently multi-resolution optimization is only used in the bspline level.
 +
 +
== Improvement Ideas ==
 +
* Use multi-resolution at all stages
 +
**Both multi-resolution and the sequence of calls with increasing DOF could be implemented as a single recursive scheme. The caller provides an array of DOF and a matching array of resolution levels, which is processed by recursive calls with the first/last element taken from the list. A simulation Matlab program and example is  here: [[Projects:RegistrationImprovement:RecursiveScheme]]
 +
**The GUI can list the many combination as a single list of checkboxes for increasing DOF. The full list would be 3,6,7,9,12,b . The checked boxes provide the input string for the recursive call. [[Media:DOFHierarchy_GUI.jpg‎ ]]
 +
* The prestage to affine maybe should be similarity not rigid (based on assumption that its hard to optimize rotation without scale change).
 +
* Learn from FSL flirt to make an extensive test of a grid of possible rotations to get a good initialization for rotations.
 +
* Ability to specify masks that are used to limit were samples are drawn (this should ultimately be both a label image or a user drawn box)
 +
 +
= TODO =
 +
 +
* Documentation of RegisterImagesMultiRes, TransformFromFiducials
 +
* Update documentation of RegisterImages
 +
* Testing on TBI and Huntingtons data
 +
* Box ROIs using Slicer ROI module (70% completed)
  
 
= Timeline of contributions =
 
= Timeline of contributions =
 +
 +
== Jan 13, 2010 ==
 +
 +
* Mantis based tests for use case library
 +
* XML description of presets (thanks to Jim Miller)
 +
* Fixed some bugs in RegisterImagesMultiRes when dealing with images that have negative spacings.
 +
 +
== Jan 7, 2010 ==
 +
Sped up compilation of command line modules by 40 minutes.
 +
 +
== Dec 15, 2009 ==
 +
There is a new module "Transform from Fiducials" that computes a
 +
linear transform from two fiducials lists with corresponding points.
 +
Currently this can produce transformations which are translation only,
 +
rigid, or similarity.  The intent is for this to be used as a
 +
preprocessing module for further registration.  This is factored out
 +
from the RegisterImages module so that you can see the result of the
 +
fiducial based transform before using that as an initialization.
 +
 +
Development is continuing on  RegisterImagesMultiRes to expose more
 +
parameters of the algorithm to the user and to work with more types of
 +
images.
 +
 +
== Nov 27, 2009 ==
 +
I've merged several improvements into RegisterImagesMultiRes in SVN 11043
 +
 +
Better heuristic for downsampling images of different resolutions
 +
and spacing.  The actual heuristic is implemented in
 +
DownsampleHeuristics.h.  This should enable the algorithm to work on a
 +
much wider range of images.
 +
 +
Heuristic for computing optimizer scales so the user only has to
 +
select one global step size (in units of voxels).  The dimensions of
 +
the image are then used to compute the scalings for each component of
 +
the transform.
 +
 +
support for saving the output transform in addition to the resampled image
 +
 +
== November 16, 2009 ==
 +
 +
Module committed to slicer.  Currently only works on very specific images due to assumptions in the multi-resolution downsampling.
 +
 +
== November 6, 2009 ==
 +
 +
New registration module called MoreSearch implemented in NAMIC sandbox.  A new registration module that is now in a rough draft stage for testing and further improvment.  The improvements in this module are user of multi-resolution, a new set of ITK transforms that decomposes the parameter space into rotation, translation, scale, and skew, and an initializer based on ideas from the FSL algorithm.
 +
 +
{|
 +
|-
 +
|[[Image:Cbg_registration_algorithm_test.png|thumb|500px| Vervet data registration]]
 +
| [[Image:Cbg_registration_algorithm_test2.png|thumb|500px| Vervet data registration]]
 +
|-
 +
|}
 +
 +
== October 22, 2009 ==
 +
 +
Investigating MRML Presets.  The following can be saved as a .mrml scene and loaded into slicer to populate the parameter sets of RegisterImages.
 +
<pre>
 +
<MRML version="" userTags="">
 +
<CommandLineModule
 +
id="vtkMRMLCommandLineModuleNode1" name="Register Images Set 1"
 +
hideFromEditors="true" selectable="true" selected="false"
 +
title="Register%20Images"
 +
version="0.1.0.$Revision:%202104%20$(alpha)" resampledImage=""
 +
loadTransform="" saveTransform="" initialization="CentersOfMass"
 +
registration="PipelineAffine" metric="MattesMI" expectedOffset="10"
 +
expectedRotation="0.1" expectedScale="0.05" expectedSkew="0.01"
 +
verbosityLevel="Standard" sampleFromOverlap="false" fixedImageMask=""
 +
randomNumberSeed="0" numberOfThreads="0" minimizeMemory="false"
 +
interpolation="Linear" baselineImage=""
 +
baselineNumberOfFailedPixelsTolerance="1000"
 +
baselineIntensityTolerance="10" baselineRadiusTolerance="0"
 +
baselineDifferenceImage="" baselineResampledMovingImage=""
 +
fixedLandmarks="" movingLandmarks="" rigidMaxIterations="100"
 +
rigidSamplingRatio="0.04" affineMaxIterations="50"
 +
affineSamplingRatio="0.02" bsplineMaxIterations="20"
 +
bsplineSamplingRatio="0.1" controlPointSpacing="40" ></CommandLineModule>
 +
<CommandLineModule
 +
id="vtkMRMLCommandLineModuleNode2" name="Register Images Set 2"
 +
hideFromEditors="true" selectable="true" selected="false"
 +
title="Register%20Images"
 +
version="0.1.0.$Revision:%202104%20$(alpha)" resampledImage=""
 +
loadTransform="" saveTransform="" initialization="CentersOfMass"
 +
registration="PipelineRigid" metric="MattesMI" expectedOffset="20"
 +
expectedRotation="0.1" expectedScale="0.05" expectedSkew="0.01"
 +
verbosityLevel="Standard" sampleFromOverlap="false" fixedImageMask=""
 +
randomNumberSeed="0" numberOfThreads="0" minimizeMemory="false"
 +
interpolation="Linear" baselineImage=""
 +
baselineNumberOfFailedPixelsTolerance="1000"
 +
baselineIntensityTolerance="10" baselineRadiusTolerance="0"
 +
baselineDifferenceImage="" baselineResampledMovingImage=""
 +
fixedLandmarks="" movingLandmarks="" rigidMaxIterations="100"
 +
rigidSamplingRatio="0.03" affineMaxIterations="80"
 +
affineSamplingRatio="0.02" bsplineMaxIterations="20"
 +
bsplineSamplingRatio="0.1" controlPointSpacing="40"></CommandLineModule>
 +
</MRML>
 +
</pre>
 +
 +
== October 16 2009 ==
 +
Found some bugs in ITK similarity transform with Luis
 +
 +
== October 6, 2009 ==
 +
Preliminary version of brute force rotation initializer implemented.  TODO save in sandbox then merge to Slicer module.
 +
 +
== September 22, 2009 ==
 +
Committed ability to use a label image to act as a mask for drawing samples for image match calculation.
  
 
== September 11, 2009 ==
 
== September 11, 2009 ==
 
Merge two new modules that present a simplified view of RegisterImages into Slicer3 to show up in Modules Menu hierarchy
 
Merge two new modules that present a simplified view of RegisterImages into Slicer3 to show up in Modules Menu hierarchy
[http://www.slicer.org/slicerWiki/index.php/File:Registration-module-hierarchy-prototype.png Menu hierarchy screenshot]
+
[https://www.slicer.org/wiki/File:Registration-module-hierarchy-prototype.png Menu hierarchy screenshot]
  
 
== September 9, 2009 ==
 
== September 9, 2009 ==
Line 25: Line 154:
 
*Project describing improvements to multi-threading of ITK Metrics and initial version of RegisterImages [[ITK_Registration_Optimization]]
 
*Project describing improvements to multi-threading of ITK Metrics and initial version of RegisterImages [[ITK_Registration_Optimization]]
 
*[[Events:Registration_Summit_August_2009 | Initial Project Meeting ]]
 
*[[Events:Registration_Summit_August_2009 | Initial Project Meeting ]]
 +
 +
= Registration Documentation =
 +
Efforts re. documentation, use case collection, user perspectives, troubleshooting etc. will be consolidated here: [[Projects:RegistrationDocumentation]]

Latest revision as of 17:36, 10 July 2017

Home < Projects:RegistrationImprovement

Registration Improvements

This page will describe registration improvements made within Slicer3 to improve the usability and robustness of registration algorithms so they may be used in an interactive clinical setting.

Key Contributors

  • Kitware: Casey Goodlett with consultation from Will Schroeder and Stephen Aylward
  • BWH: Ron Kikinis, Dominik Meier, Andriy Fedorov

RegisterImages Algorithm

A user should typically one of the Pipeline methods (PipelineRigid, PipelineAffine, PipelineBspline) as these will run Initalization -> Rigid -> Affine -> Bspline to the specified level. These are run in order to convergence or maximum # of iterations. Within each pipeline step there is a two stage optimization. First the evolution optmizer is run to stochastically chose a starting location for optimization. After this the FRPR optimizer is used. Currently multi-resolution optimization is only used in the bspline level.

Improvement Ideas

  • Use multi-resolution at all stages
    • Both multi-resolution and the sequence of calls with increasing DOF could be implemented as a single recursive scheme. The caller provides an array of DOF and a matching array of resolution levels, which is processed by recursive calls with the first/last element taken from the list. A simulation Matlab program and example is here: Projects:RegistrationImprovement:RecursiveScheme
    • The GUI can list the many combination as a single list of checkboxes for increasing DOF. The full list would be 3,6,7,9,12,b . The checked boxes provide the input string for the recursive call. Media:DOFHierarchy_GUI.jpg‎
  • The prestage to affine maybe should be similarity not rigid (based on assumption that its hard to optimize rotation without scale change).
  • Learn from FSL flirt to make an extensive test of a grid of possible rotations to get a good initialization for rotations.
  • Ability to specify masks that are used to limit were samples are drawn (this should ultimately be both a label image or a user drawn box)

TODO

  • Documentation of RegisterImagesMultiRes, TransformFromFiducials
  • Update documentation of RegisterImages
  • Testing on TBI and Huntingtons data
  • Box ROIs using Slicer ROI module (70% completed)

Timeline of contributions

Jan 13, 2010

  • Mantis based tests for use case library
  • XML description of presets (thanks to Jim Miller)
  • Fixed some bugs in RegisterImagesMultiRes when dealing with images that have negative spacings.

Jan 7, 2010

Sped up compilation of command line modules by 40 minutes.

Dec 15, 2009

There is a new module "Transform from Fiducials" that computes a linear transform from two fiducials lists with corresponding points. Currently this can produce transformations which are translation only, rigid, or similarity. The intent is for this to be used as a preprocessing module for further registration. This is factored out from the RegisterImages module so that you can see the result of the fiducial based transform before using that as an initialization.

Development is continuing on RegisterImagesMultiRes to expose more parameters of the algorithm to the user and to work with more types of images.

Nov 27, 2009

I've merged several improvements into RegisterImagesMultiRes in SVN 11043

Better heuristic for downsampling images of different resolutions and spacing. The actual heuristic is implemented in DownsampleHeuristics.h. This should enable the algorithm to work on a much wider range of images.

Heuristic for computing optimizer scales so the user only has to select one global step size (in units of voxels). The dimensions of the image are then used to compute the scalings for each component of the transform.

support for saving the output transform in addition to the resampled image

November 16, 2009

Module committed to slicer. Currently only works on very specific images due to assumptions in the multi-resolution downsampling.

November 6, 2009

New registration module called MoreSearch implemented in NAMIC sandbox. A new registration module that is now in a rough draft stage for testing and further improvment. The improvements in this module are user of multi-resolution, a new set of ITK transforms that decomposes the parameter space into rotation, translation, scale, and skew, and an initializer based on ideas from the FSL algorithm.

Vervet data registration
Vervet data registration

October 22, 2009

Investigating MRML Presets. The following can be saved as a .mrml scene and loaded into slicer to populate the parameter sets of RegisterImages.

<MRML version="" userTags="">
 <CommandLineModule
 id="vtkMRMLCommandLineModuleNode1" name="Register Images Set 1"
 hideFromEditors="true" selectable="true" selected="false"
 title="Register%20Images"
 version="0.1.0.$Revision:%202104%20$(alpha)" resampledImage=""
 loadTransform="" saveTransform="" initialization="CentersOfMass"
 registration="PipelineAffine" metric="MattesMI" expectedOffset="10"
 expectedRotation="0.1" expectedScale="0.05" expectedSkew="0.01"
 verbosityLevel="Standard" sampleFromOverlap="false" fixedImageMask=""
 randomNumberSeed="0" numberOfThreads="0" minimizeMemory="false"
 interpolation="Linear" baselineImage=""
 baselineNumberOfFailedPixelsTolerance="1000"
 baselineIntensityTolerance="10" baselineRadiusTolerance="0"
 baselineDifferenceImage="" baselineResampledMovingImage=""
 fixedLandmarks="" movingLandmarks="" rigidMaxIterations="100"
 rigidSamplingRatio="0.04" affineMaxIterations="50"
 affineSamplingRatio="0.02" bsplineMaxIterations="20"
 bsplineSamplingRatio="0.1" controlPointSpacing="40" ></CommandLineModule> 
<CommandLineModule
 id="vtkMRMLCommandLineModuleNode2" name="Register Images Set 2"
 hideFromEditors="true" selectable="true" selected="false"
 title="Register%20Images"
 version="0.1.0.$Revision:%202104%20$(alpha)" resampledImage=""
 loadTransform="" saveTransform="" initialization="CentersOfMass"
 registration="PipelineRigid" metric="MattesMI" expectedOffset="20"
 expectedRotation="0.1" expectedScale="0.05" expectedSkew="0.01"
 verbosityLevel="Standard" sampleFromOverlap="false" fixedImageMask=""
 randomNumberSeed="0" numberOfThreads="0" minimizeMemory="false"
 interpolation="Linear" baselineImage=""
 baselineNumberOfFailedPixelsTolerance="1000"
 baselineIntensityTolerance="10" baselineRadiusTolerance="0"
 baselineDifferenceImage="" baselineResampledMovingImage=""
 fixedLandmarks="" movingLandmarks="" rigidMaxIterations="100"
 rigidSamplingRatio="0.03" affineMaxIterations="80"
 affineSamplingRatio="0.02" bsplineMaxIterations="20"
 bsplineSamplingRatio="0.1" controlPointSpacing="40"></CommandLineModule>
</MRML>

October 16 2009

Found some bugs in ITK similarity transform with Luis

October 6, 2009

Preliminary version of brute force rotation initializer implemented. TODO save in sandbox then merge to Slicer module.

September 22, 2009

Committed ability to use a label image to act as a mask for drawing samples for image match calculation.

September 11, 2009

Merge two new modules that present a simplified view of RegisterImages into Slicer3 to show up in Modules Menu hierarchy Menu hierarchy screenshot

September 9, 2009

Sync default parameters between GUI and command line version of RegisterImages

August 21, 2009

Initial Project Meeting

August 18, 2009

  • Link landmark initalization with fiducials framework in Slicer3
  • Link transform save and load with TransformIO in Slicer3

Links

Registration Documentation

Efforts re. documentation, use case collection, user perspectives, troubleshooting etc. will be consolidated here: Projects:RegistrationDocumentation