[Insight-users] Segmentation fault when calling itk::KdTree::Search(queryPoint, radius, neighbors)

motes motes mort.motes at gmail.com
Sun Nov 29 08:43:03 EST 2009


Yes my machine has a intel core 2 Duo 8500 CPU.

I have also tried to use the original itk::BSplineDeformableTransform
where the only thing I have added is the call to the kdtree in the
TransformPoint function and I get the same error. This way I have
eliminated the possibility that there are some other stuff in my own
transform that causes the problem.

I am currently trying to use the itk::hash_map instead with a spatial
hashing function, but maybe I will run into the same problem here with
thread safety?





On Sun, Nov 29, 2009 at 2:27 PM, Bill Lorensen <bill.lorensen at gmail.com> wrote:
> I wonder if itk's kdtree is thread safe. Are you running this on a
> multiple processor machine? This could explain why your custom
> transform works with registration and not with the resampler...
>
> Bill
>
> On Sun, Nov 29, 2009 at 7:13 AM, motes motes <mort.motes at gmail.com> wrote:
>> Ups here is the whole thing:
>>
>> (gdb) where
>> #0  itk::Statistics::KdTree<itk::Statistics::ListSample<itk::Vector<double,
>> 3u> > >::NearestNeighborSearchLoop (this=0x1d0cf30, node=0x1d0e1f0,
>> query=@0x7f14a4298cf0,
>>    lowerBound=@0x7f14a4298ac0, upperBound=@0x7f14a4298aa0) at
>> /home/mort/local/InsightToolkit-3.14.0/Code/Numerics/Statistics/itkKdTree.h:448
>> #1  0x00000000005e4618 in
>> itk::Statistics::KdTree<itk::Statistics::ListSample<itk::Vector<double,
>> 3u> > >::NearestNeighborSearchLoop (this=0x1d0cf30, node=0x1d0e370,
>>    query=@0x7f14a4298cf0, lowerBound=@0x7f14a4298ac0,
>> upperBound=@0x7f14a4298aa0) at
>> /home/mort/local/InsightToolkit-3.14.0/Code/Numerics/Statistics/itkKdTree.txx:312
>> #2  0x00000000005e4618 in
>> itk::Statistics::KdTree<itk::Statistics::ListSample<itk::Vector<double,
>> 3u> > >::NearestNeighborSearchLoop (this=0x1d0cf30, node=0x1d0e3b0,
>>    query=@0x7f14a4298cf0, lowerBound=@0x7f14a4298ac0,
>> upperBound=@0x7f14a4298aa0) at
>> /home/mort/local/InsightToolkit-3.14.0/Code/Numerics/Statistics/itkKdTree.txx:312
>> #3  0x00000000005e4425 in
>> itk::Statistics::KdTree<itk::Statistics::ListSample<itk::Vector<double,
>> 3u> > >::NearestNeighborSearchLoop (this=0x1d0cf30, node=0x1d0e7b0,
>>    query=@0x7f14a4298cf0, lowerBound=@0x7f14a4298ac0,
>> upperBound=@0x7f14a4298aa0) at
>> /home/mort/local/InsightToolkit-3.14.0/Code/Numerics/Statistics/itkKdTree.txx:291
>> #4  0x00000000005e4425 in
>> itk::Statistics::KdTree<itk::Statistics::ListSample<itk::Vector<double,
>> 3u> > >::NearestNeighborSearchLoop (this=0x1d0cf30, node=0x1d0efb0,
>>    query=@0x7f14a4298cf0, lowerBound=@0x7f14a4298ac0,
>> upperBound=@0x7f14a4298aa0) at
>> /home/mort/local/InsightToolkit-3.14.0/Code/Numerics/Statistics/itkKdTree.txx:291
>> #5  0x00000000005e4618 in
>> itk::Statistics::KdTree<itk::Statistics::ListSample<itk::Vector<double,
>> 3u> > >::NearestNeighborSearchLoop (this=0x1d0cf30, node=0x1d0eff0,
>>    query=@0x7f14a4298cf0, lowerBound=@0x7f14a4298ac0,
>> upperBound=@0x7f14a4298aa0) at
>> /home/mort/local/InsightToolkit-3.14.0/Code/Numerics/Statistics/itkKdTree.txx:312
>> #6  0x00000000006f02eb in
>> itk::Statistics::KdTree<itk::Statistics::ListSample<itk::Vector<double,
>> 3u> > >::Search (this=0x1d0cf30, query=@0x7f14a4298cf0,
>>    numberOfNeighborsRequested=<value optimized out>,
>> result=@0x7f14a4298cd0) at
>> /home/mort/local/InsightToolkit-3.14.0/Code/Numerics/Statistics/itkKdTree.txx:291
>> #7  0x00000000006f0a5a in itk::MyDeformableTransform<double, 3u,
>> 3u>::TransformPoint (this=0x12322b0, point=<value optimized out>,
>> outputPoint=@0x7f14a4298f50,
>>    weights=<value optimized out>, indices=<value optimized out>,
>> inside=<value optimized out>)
>>    at /home/mort/local/code/registration/my_deformable_transform.cpp:693
>> #8  0x00000000005fb9d2 in itk::MyDeformableTransform<double, 3u,
>> 3u>::TransformPoint (this=0x12322b0, point=@0x7f14a4298f90)
>>    at /home/mort/local/code/registration/my_deformable_transform.cpp:778
>> #9  0x000000000067ad2f in itk::ResampleImageFilter<itk::Image<float,
>> 3u>, itk::Image<float, 3u>, double>::NonlinearThreadedGenerateData
>> (this=0x1d11030,
>>    outputRegionForThread=<value optimized out>, threadId=<value
>> optimized out>) at
>> /home/mort/local/local/InsightToolkit-3.14.0/Code/BasicFilters/itkResampleImageFilter.txx:257
>> #10 0x000000000059f85e in itk::ImageSource<itk::Image<float, 3u>
>>>::ThreaderCallback (arg=<value optimized out>)
>>    at /home/mort/local/InsightToolkit-3.14.0/Code/Common/itkImageSource.txx:292
>> #11 0x000000000074eb56 in itk::MultiThreader::SingleMethodProxy
>> (arg=0x1d191d8) at
>> /home/mort/local/InsightToolkit-3.14.0/Code/Common/itkMultiThreader.cxx:853
>> #12 0x00007f14a6f1d3ba in start_thread () from /lib/libpthread.so.0
>> #13 0x00007f14a62dbfcd in clone () from /lib/libc.so.6
>> #14 0x0000000000000000 in ?? ()
>> (gdb)
>>
>>
>> On Sun, Nov 29, 2009 at 1:03 PM, motes motes <mort.motes at gmail.com> wrote:
>>> [New Thread 0x7f14a7c5f750 (LWP 4955)]
>>> [New Thread 0x7f14a4299950 (LWP 4958)]
>>>
>>> Program received signal SIGSEGV, Segmentation fault.
>>> [Switching to Thread 0x7f14a4299950 (LWP 4958)]
>>> itk::Statistics::KdTree<itk::Statistics::ListSample<itk::Vector<double,
>>> 3u> > >::NearestNeighborSearchLoop (this=0x1d0cf30, node=0x1d0e1f0,
>>> query=@0x7f14a4298cf0,
>>>    lowerBound=@0x7f14a4298ac0, upperBound=@0x7f14a4298aa0) at
>>> /home/mort/local/InsightToolkit-3.14.0/Code/Numerics/Statistics/itkKdTree.h:448
>>> 448             if ( m_Distances[i] > farthestDistance )
>>> (gdb)
>>>
>>>
>>>
>>>
>>>
>>>
>>> On Sun, Nov 29, 2009 at 10:27 AM, Karthik Krishnan
>>> <karthik.krishnan at kitware.com> wrote:
>>>> If you get a segfault, please post the stack trace using gdb.
>>>>
>>>> On Sat, Nov 28, 2009 at 5:47 AM, motes motes <mort.motes at gmail.com> wrote:
>>>>> I use the following types to create a KdTree:
>>>>>
>>>>>  typedef Vector<TScalarType, SpaceDimension>
>>>>>          VectorType;
>>>>>  typedef itk::Statistics::ListSample<VectorType>
>>>>>              SampleType;
>>>>>  typedef itk::Statistics::KdTreeGenerator< SampleType >
>>>>>        TreeGeneratorType;
>>>>>  typedef typename TreeGeneratorType::KdTreeType
>>>>>         TreeType;
>>>>>  typedef typename TreeType::InstanceIdentifierVectorType
>>>>>       NeighborsType;
>>>>>
>>>>>
>>>>>  typename SampleType::Pointer sample  = SampleType::New();
>>>>>  typename TreeGeneratorType::Pointer treeGenerator = TreeGeneratorType::New();;
>>>>>  typename TreeType::Pointer tree;
>>>>>
>>>>>
>>>>> I create the tree with:
>>>>>
>>>>>  this->sample->SetMeasurementVectorSize(Dimension);
>>>>>  VectorType mv;
>>>>>  for (unsigned int i = 0 ; i < 1000 ; ++i ) {
>>>>>    mv[0] = (float) i;
>>>>>    mv[1] = (float) ((1000 - i) / 2 );
>>>>>    mv[2] = (float) ((1000 - i) / 2 );
>>>>>    sample->PushBack( mv );
>>>>>  }
>>>>>
>>>>>  treeGenerator->SetSample(sample);
>>>>>  treeGenerator->SetBucketSize(16);
>>>>>  treeGenerator->Update();
>>>>>  tree = treeGenerator->GetOutput();
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> From the function"TransformPoint" (in a transform I have created) I
>>>>> then call the Search method:
>>>>>
>>>>>  NeighborsType neighbors;
>>>>>    VectorType vectorPoint;
>>>>>    vectorPoint.Fill(0);
>>>>>    for (int i=0; i<NDimensions; i++) {
>>>>>      vectorPoint[i] = point[i];
>>>>>    }
>>>>>  tree->Search(vectorPoint, 10.0, neighbors);
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> But when I run the application I get a segmentation fault. I have
>>>>> tried to run the application with Valgrind but I get no error:
>>>>>
>>>>> valgrind --leak-check=yes --track-origins=yes ./MyApp
>>>>> INFO:: Computing registered image
>>>>> ==8389==
>>>>> ==8389== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 8 from 1)
>>>>> ==8389== malloc/free: in use at exit: 0 bytes in 0 blocks.
>>>>> ==8389== malloc/free: 13,153,309 allocs, 13,153,309 frees,
>>>>> 8,529,290,300 bytes allocated.
>>>>> ==8389== For counts of detected errors, rerun with: -v
>>>>> ==8389== All heap blocks were freed -- no leaks are possible.
>>>>>
>>>>>
>>>>>
>>>>> I am pretty sure that the problem is the dynamic array 'neighbors'. If
>>>>> I call the version of Search where the number of neighbors are
>>>>> specified I don't get any segmentation fault:
>>>>>
>>>>>
>>>>>  NeighborsType neighbors;
>>>>>    VectorType vectorPoint;
>>>>>    vectorPoint.Fill(0);
>>>>>    for (int i=0; i<NDimensions; i++) {
>>>>>      vectorPoint[i] = point[i];
>>>>>    }
>>>>>  unsigned int numberOfNeighbors = 3;
>>>>>  tree->Search( vectorPoint, numberOfNeighbors, neighbors ) ;
>>>>>
>>>>> But since I need the version where the radius is specified the above
>>>>> is not an option.
>>>>>
>>>>>
>>>>>
>>>>> Another thing. The error only occurs when I run a resampling Filter.
>>>>> If I run the transform through a registration process it works fine.
>>>>> The resampling Filter is created like this:
>>>>>
>>>>> typedef itk::ResampleImageFilter< FixedImageType, FixedImageType >
>>>>>                           ResampleFilterType;
>>>>> typedef itk::LinearInterpolateImageFunction< FixedImageType, double >
>>>>>                           LinearInterpolatorType;
>>>>>
>>>>>  LinearInterpolatorType::Pointer linearInterpolator =
>>>>> LinearInterpolatorType::New();
>>>>>  ResampleFilterType::Pointer resampler = ResampleFilterType::New();
>>>>>  resampler->SetInput(imageM);
>>>>>  resampler->SetTransform(adaptiveTransform);
>>>>>  resampler->SetInterpolator(linearInterpolator);
>>>>>  resampler->SetOutputOrigin(imageF->GetOrigin());
>>>>>  resampler->SetOutputSpacing(imageF->GetSpacing());
>>>>>  resampler->SetSize(imageF->GetLargestPossibleRegion().GetSize());
>>>>>  resampler->SetDefaultPixelValue(0);
>>>>>
>>>>>
>>>>>  try {
>>>>>
>>>>>    resampler->Update();
>>>>>
>>>>>  }
>>>>>
>>>>>  catch( itk::ExceptionObject & err ) {
>>>>>
>>>>>    std::cerr << "ExceptionObject caught !" << std::endl;
>>>>>
>>>>>    std::cerr << err << std::endl;
>>>>>
>>>>>  }
>>>>>
>>>>>
>>>>> Any ideas are most welcome!
>>>>> _____________________________________
>>>>> Powered by www.kitware.com
>>>>>
>>>>> Visit other Kitware open-source projects at
>>>>> http://www.kitware.com/opensource/opensource.html
>>>>>
>>>>> Kitware offers ITK Training Courses, for more information visit:
>>>>> http://www.kitware.com/products/protraining.html
>>>>>
>>>>> Please keep messages on-topic and check the ITK FAQ at:
>>>>> http://www.itk.org/Wiki/ITK_FAQ
>>>>>
>>>>> Follow this link to subscribe/unsubscribe:
>>>>> http://www.itk.org/mailman/listinfo/insight-users
>>>>>
>>>>
>>>
>> _____________________________________
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Kitware offers ITK Training Courses, for more information visit:
>> http://www.kitware.com/products/protraining.html
>>
>> Please keep messages on-topic and check the ITK FAQ at:
>> http://www.itk.org/Wiki/ITK_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.itk.org/mailman/listinfo/insight-users
>>
>


More information about the Insight-users mailing list