[ITK] Bspline registration with Mutual Information v4 : memory concern
Timothee Evain
tevain at telecom-paristech.fr
Mon Sep 5 12:27:20 EDT 2016
Hello everyone,
I'm trying a Bspline registration based on the Mutual Information metric (v4) and I'm facing a memory problem.
When running the registration, the memory usage skyrockets in a second until freezing the PC by lack of memory.
I don't know why : this doesn't happen when I'm switching to another metric (e.g. Correlation), the images aren't that big (~400k voxels) and a previous rigid registration phase behaved correctly.
Here is my code snippet, what am I doing wrong ? (Image overlap had been ensured)
typedef itk::Image<float,3> ImageTypef;
itk::ImageRegistrationMethodv4<ImageTypef,ImageTypef>::Pointer WarpHelper=
itk::ImageRegistrationMethodv4<ImageTypef,ImageTypef>::New();
itk::MattesMutualInformationImageToImageMetricv4<ImageTypef,ImageTypef>::Pointer MIMetrics=
itk::MattesMutualInformationImageToImageMetricv4<ImageTypef,ImageTypef>::New();
itk::BSplineTransform<double,3,3>::Pointer BSplineTransform=
itk::BSplineTransform<double,3,3>::New();
itk::LBFGSOptimizerv4::Pointer Optimizer=
itk::LBFGSOptimizerv4::New();
MIMetrics->SetNumberOfHistogramBins(50);
MIMetrics->SetUseMovingImageGradientFilter(false);
MIMetrics->SetUseFixedImageGradientFilter(false);
MIMetrics->SetUseFixedSampledPointSet(false);
MIMetrics->SetVirtualDomainFromImage(TestIm);
WarpHelper->SetFixedImage(TestIm);
WarpHelper->SetMetricSamplingPercentage(0.002);
WarpHelper->SetMovingImage(MovIm);
WarpHelper->SetMetric(MIMetrics);
//WarpHelper->SetMetricSamplingStrategy(WarpHelper->RANDOM);
WarpHelper->InPlaceOn();
WarpHelper->SetInitialTransform(BSplineTransform);
WarpHelper->SetOptimizer(Optimizer);
itk::Array<double> ShrinkFactorPerLevel(1);
ShrinkFactorPerLevel[0]=1;
itk::Array<double> SmoothSigmaPerLevel(1);
SmoothSigmaPerLevel[0]=0;
WarpHelper->SetNumberOfLevels(1);
WarpHelper->SetSmoothingSigmasPerLevel(SmoothSigmaPerLevel);
WarpHelper->SetShrinkFactorsPerLevel(ShrinkFactorPerLevel);
/* ----- Initialize the Bspline Transform ----- */
BSplineTransform->SetTransformDomainOrigin(TestIm->GetOrigin());
BSplineTransform->SetTransformDomainDirection(TestIm->GetDirection());
itk::Vector<double,3> PhysicalDim;
for (int dim = 0; dim < 3; dim++)
{
PhysicalDim=(TestIm->GetSpacing()[dim])*float((TestIm->GetLargestPossibleRegion().GetSize()[dim])-1);
}
BSplineTransform->SetTransformDomainPhysicalDimensions(PhysicalDim);
itk::Size<3> meshSize;
meshSize.Fill(10-3);// NbGridNodesEachDim-SplineOrder
BSplineTransform->SetTransformDomainMeshSize(meshSize);
BSplineTransform->SetIdentity();
/* ----- Optimizer setup ----- */
itk::Array<double> ScaleBspline(BSplineTransform->GetNumberOfParameters());
ScaleBspline.fill(1);
Optimizer->SetLineSearchAccuracy(0.9);
Optimizer->SetDefaultStepLength(1.5);
Optimizer->TraceOn();
Optimizer->SetGradientConvergenceTolerance(1e-3);
Optimizer->SetMaximumNumberOfFunctionEvaluations(20);
Optimizer->SetDoEstimateScales(false);
Optimizer->SetScales(ScaleBspline);
try
{
WarpHelper->Update();
}
catch (itk::ExceptionObject &err)
{
std::cerr<<err;
return 0;
}
Thanks,
Tim
More information about the Community
mailing list