[Insight-users] Parameter scales for registration (second try)

Bradley Lowekamp blowekamp at mail.nih.gov
Tue May 7 08:58:50 EDT 2013


Nick,

What we are observing is an algorithmic bug in the RegularStepGradientOptimzer. The ITKv4 optimizers have quite a convoluted way to advance the parameters, and likely don't contain this bug.


I think the figure Joel put together does a good job of illustrating the issue:

http://i.imgur.com/DE6xqQ5.pnggithu


It just I think the math here:
https://github.com/Kitware/ITK/blob/master/Modules/Numerics/Optimizers/src/itkRegularStepGradientDescentOptimizer.cxx#L44

newPosition[j] = currentPosition[j] + transformedGradient[j] * factor;

should be:

newPosition[j] = currentPosition[j] + transformedGradient[j] * factor / scales[j];

Brad


On May 7, 2013, at 8:07 AM, Nick Tustison <ntustison at gmail.com> wrote:

> Not quite.  See below for a relevant block of code.  
> The optimizer can take an optional scales estimator.
> 
> 
>    typedef itk::RegistrationParameterScalesFromPhysicalShift<MetricType> ScalesEstimatorType;
>    typename ScalesEstimatorType::Pointer scalesEstimator = ScalesEstimatorType::New();
>    scalesEstimator->SetMetric( singleMetric );
>    scalesEstimator->SetTransformForward( true );
> 
>    typedef itk::ConjugateGradientLineSearchOptimizerv4 ConjugateGradientDescentOptimizerType;
>    typename ConjugateGradientDescentOptimizerType::Pointer optimizer = ConjugateGradientDescentOptimizerType::New();
>    optimizer->SetLowerLimit( 0 );
>    optimizer->SetUpperLimit( 2 );
>    optimizer->SetEpsilon( 0.2 );
>    //    optimizer->SetMaximumLineSearchIterations( 20 );
>    optimizer->SetLearningRate( learningRate );
>    optimizer->SetMaximumStepSizeInPhysicalUnits( learningRate );
>    optimizer->SetNumberOfIterations( currentStageIterations[0] );
>    optimizer->SetScalesEstimator( scalesEstimator );
>    optimizer->SetMinimumConvergenceValue( convergenceThreshold );
>    optimizer->SetConvergenceWindowSize( convergenceWindowSize );
>    optimizer->SetDoEstimateLearningRateAtEachIteration( this->m_DoEstimateLearningRateAtEachIteration );
>    optimizer->SetDoEstimateLearningRateOnce( !this->m_DoEstimateLearningRateAtEachIteration );
> 
> 
> 
> 
> 
> 
> On May 7, 2013, at 8:01 AM, Joël Schaerer <joel.schaerer at gmail.com> wrote:
> 
>> Hi Nick,
>> 
>> I did indeed have a look at these new classes (not a very thorough one, I must confess). However if I understand correctly they allow estimating the parameter scales, but don't change the way the scales are used by the optimizer?
>> 
>> joel
>> 
>> On 07/05/2013 13:52, Nick Tustison wrote:
>>> Hi Brad,
>>> 
>>> Have you seen the work we did with the class
>>> 
>>> http://www.itk.org/Doxygen/html/classitk_1_1RegistrationParameterScalesEstimator.html
>>> 
>>> and it's derived classes for the v4 framework?  They describe
>>> a couple different approaches to scaling the gradient for use
>>> with the v4 optimizers.
>>> 
>>> Nick
>>> 
>>> 
>>> On May 7, 2013, at 6:59 AM, Bradley Lowekamp <blowekamp at mail.nih.gov> wrote:
>>> 
>>>> Hello Joel,
>>>> 
>>>> I have encountered the same issue. I ended up creating my own "ScaledRegularStepGradientDescentOptimizer" derived from the an ITK one. Please find it attached. Please note, I don't think I have migrated this code to ITKv4.... but I not certain.
>>>> 
>>>> I reported this issue to the ITKv4 registration team, but I am not sure what happened to it.
>>>> 
>>>> I also tried to make the change in ITK a while ago, and a large number of the registration tests failed... not sure if the results were better or worse, they were just different.
>>>> 
>>>> Brad
>>>> 
>>>> <itkScaledRegularStepGradientDescentOptimizer.h>
>>>> 
>>>> On Apr 25, 2013, at 11:10 AM, Joël Schaerer <joel.schaerer at gmail.com> wrote:
>>>> 
>>>> 
>> 
> 



More information about the Insight-users mailing list