<div dir="ltr"><div class="gmail_quote"><br><div lang="EN-US"><div class="gmail-m_-1027592213124125661WordSection1"><p class="MsoNormal">Hi, <u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">I was comparing v3 and v4 registration performance on a set of 3D images. In few cases, I noticed that v4 registration is diverging while v3 converges to a reasonable result without any problem. <br> I wonder if you have ever noticed a problem with v4 optimizer that could cause similar issues.</p><p class="MsoNormal"><u></u><u></u><br></p><p class="MsoNormal">I copied my code for v3 and v4 registration below. I tried to keep the registration configuration very similar in both versions. In v3 I set the NumberOfSpatialSamples to 380000 which is about 10% of voxels. I also tried with full sampling but the behavior stays the same.</p><p class="MsoNormal"><u></u><u></u><br></p><p class="MsoNormal">In the attached csv file you can see the metric value at each iteration of the optimizer for both v3 and v4 version. It is clear that v3 converges smoothly, but v4 makes the initial metric value worse after too many iterations.<u></u><u></u></p><p class="MsoNormal"><u></u> </p><p class="MsoNormal">Thanks a lot in advance.<br>Regards, <br>Sepide</p><p class="MsoNormal"><u><br></u></p><p class="MsoNormal">auto interpolator = itk::<wbr>LinearInterpolateImageFunction<wbr><ImageType, double>::New();<u></u><u></u></p><p class="MsoNormal">auto transform = itk::AffineTransform<double>::<wbr>New();<u></u><u></u></p><p class="MsoNormal">transform->SetIdentity();<u></u><u></u></p><p class="MsoNormal">itk::Array<double> scales; <u></u> <u></u></p><p class="MsoNormal">scales.SetSize(12);<u></u><u></u></p><p class="MsoNormal">scales.Fill(1.0);<u></u><u></u></p><p class="MsoNormal">scales[9] =  0.001; //translation parameters scales<u></u><u></u></p><p class="MsoNormal">scales[10] =  0.001;<u></u><u></u></p><p class="MsoNormal">scales[11] =  0.001;<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">// Registration V3 ----------------------- :<u></u><u></u></p><p class="MsoNormal">    auto metric = itk::<wbr>MattesMutualInformationImageTo<wbr>ImageMetric<ImageType, ImageType>::New();<u></u><u></u></p><p class="MsoNormal">    auto optimizer = itk::<wbr>RegularStepGradientDescentOpti<wbr>mizer::New();<u></u><u></u></p><p class="MsoNormal">    auto registration = itk::ImageRegistrationMethod<<wbr>ImageType, ImageType>::New();<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">    int NumberOfSpatialSamples = 380000;<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">    metric-><wbr>SetNumberOfSpatialSamples(<wbr>NumberOfSpatialSamples);<u></u><u></u></p><p class="MsoNormal">    optimizer->SetScales(scales);<u></u><u></u></p><p class="MsoNormal">    registration->SetMetric(<wbr>metric);<u></u><u></u></p><p class="MsoNormal">    registration->SetOptimizer(<wbr>optimizer);<u></u><u></u></p><p class="MsoNormal">    registration->SetInterpolator(<wbr>interpolator);<u></u><u></u></p><p class="MsoNormal">    registration->SetTransform(<wbr>transform);<u></u><u></u></p><p class="MsoNormal">    registration->SetFixedImage(<wbr>fixedImage);<u></u><u></u></p><p class="MsoNormal">    registration->SetMovingImage(<wbr>movingImage);<u></u><u></u></p><p class="MsoNormal">    registration-><wbr>SetFixedImageRegion(<wbr>fixedImage->GetBufferedRegion(<wbr>));<u></u><u></u></p><p class="MsoNormal">    registration-><wbr>SetInitialTransformParameters(<wbr>transform->GetParameters());<u></u><u></u></p><p class="MsoNormal">    registration->Update();<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">// Registration V4 ----------------------- :    <u></u><u></u></p><p class="MsoNormal">    auto metric = itk::<wbr>MattesMutualInformationImageTo<wbr>ImageMetricv4<ImageType, ImageType>::New();<u></u><u></u></p><p class="MsoNormal">    auto optimizer = itk::<wbr>RegularStepGradientDescentOpti<wbr>mizerv4::New();<u></u><u></u></p><p class="MsoNormal">    auto registration = itk::<wbr>ImageRegistrationMethodv4<<wbr>ImageType, ImageType>::New();<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">    optimizer->SetScales(scales);<u></u><u></u></p><p class="MsoNormal">    optimizer-><wbr>SetDoEstimateScales(false);<u></u><u></u></p><p class="MsoNormal">    optimizer-><wbr>SetDoEstimateLearningRateAtEac<wbr>hIteration(false);<u></u><u></u></p><p class="MsoNormal">    optimizer-><wbr>SetDoEstimateLearningRateOnce(<wbr>false);<u></u><u></u></p><p class="MsoNormal">    optimizer->SetMetric(metric);<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">    registration-><wbr>SetNumberOfLevels(1);<u></u><u></u></p><p class="MsoNormal">    registration-><wbr>SetSmoothingSigmasPerLevel(0);<u></u><u></u></p><p class="MsoNormal">    registration-><wbr>SetShrinkFactorsPerLevel(1);<u></u><u></u></p><p class="MsoNormal">    registration-><wbr>SetMetricSamplingPercentagePer<wbr>Level(0.1);<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">    registration->SetMetric(<wbr>metric);<u></u><u></u></p><p class="MsoNormal">    registration->SetOptimizer(<wbr>optimizer);<u></u><u></u></p><p class="MsoNormal">    registration->SetFixedImage(<wbr>fixedImage);<u></u><u></u></p><p class="MsoNormal">    registration->SetMovingImage(<wbr>movingImage);<u></u><u></u></p><p class="MsoNormal">    registration-><wbr>SetMetricSamplingStrategy(<wbr>RegistrationType::REGULAR);<u></u><u></u></p><p class="MsoNormal">    registration-><wbr>SetInitialTransform(transform)<wbr>;<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">    registration->Update();<u></u><u></u></p><p class="MsoNormal"><span style="font-size:12pt"><u></u> </span></p></div></div></div><br></div>