<div dir="ltr">Hi Ema<div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jan 20, 2014 at 11:17 AM, Emma Saunders <span dir="ltr"><<a href="mailto:emmasaunders123@gmail.com" target="_blank">emmasaunders123@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div><br></div><div>Can anyone clarify the method to set the learning rate for ITKBsplineSYN registration</div>
</div></blockquote><div><br></div><div><br></div><div>Looking at lines 417-424 of itkSyNImageRegistrationMethod.hxx</div><div>might be helpful.</div><div><br></div><div><a href="https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Registration/RegistrationMethodsv4/include/itkSyNImageRegistrationMethod.hxx#L417">https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Registration/RegistrationMethodsv4/include/itkSyNImageRegistrationMethod.hxx#L417</a> <br>
</div><div><br></div><div>They are:</div><div><br></div><div><div>417   RealType scale = this->m_LearningRate / maxNorm;</div><div>418 </div><div>419   typedef Image<RealType, ImageDimension> RealImageType;</div>
<div>420 </div><div>421   typedef MultiplyImageFilter<DisplacementFieldType, RealImageType, DisplacementFieldType> MultiplierType;</div><div>422   typename MultiplierType::Pointer multiplier = MultiplierType::New();</div>
<div>423   multiplier->SetInput( updateField );</div><div>424   multiplier->SetConstant( scale );</div></div><div><br></div><div>That is, in here the displacement field is normalized, to 1.0 vector length,</div><div>
and scaled to the value of the m_LearningRate.</div><div><br></div><div>So, the LearningRate value is indeed the maximum "step" length, in physical units</div><div>(e.g. millimeters), that the deformation field will have.</div>
<div><br></div><div>One way to approach the calibration is to set the Learning Rate to half the dimension</div><div>of a pixel. You can do this by using your knowledge of the pixel spacing in the image.</div><div><br></div>
<div>In this way, you would set up the registration method to move less than one pixel</div><div>at every iteration. This is a smooth way to move, but it may also result in a larger</div><div>number of iterations. That's a trade-off that you may have to evaluate in the context</div>
<div>of your application.</div><div><br></div><div>This criteria of "moving less than one pixel per iteration" is similarly applied in the</div><div>front propagation of Level Sets.</div><div><br></div><div><br>
</div><div>So, if your image has pixel spacing of 3mm, </div><div><br></div><div>then a good learning rate to start experimenting with, </div><div>could be</div><div><br></div><div>                                       3mm / 2.0  =  1.5</div>
<div><br></div><div><br></div><div>    HTH</div><div><br></div><div><br></div><div>        Luis</div><div><br></div><div><br></div></div></div></div>