[ITK-users] why can the ImageSeriesWriter not stream?

Grothausmann, Roman Dr. grothausmann.roman at mh-hannover.de
Sat Apr 25 15:17:08 EDT 2015


On 25/04/15 20:14, Bradley Lowekamp wrote:
> The MetaIO, had some pre-existing Pasting/Streaming interfaces and behaviors
> before the StreamingImageIOBase was implemented. It is still one of the most
> heavily tested IOs for streaming and should be trusted.

As the MetaIO is a "one of the most heavily tested IOs" I'm still wondering that 
nobody ever seems to have had a problem with writing MetaImage > 4GB compressed 
(as I reported here: https://issues.itk.org/jira/browse/ITK-3321)
Is that somehow connected to the limitation that streaming and compressing do 
not go together and that the MetaIO is independent of StreamingImageIOBase?
I also found a bug report and fix of Yours concerning the file size of 
MetaImages, however related to MacOS: http://itk.org/Bug/view.php?id=9320 so I 
guess these two are not related.

> On Apr 25, 2015, at 1:46 PM, Grothausmann, Roman Dr.
> <grothausmann.roman at mh-hannover.de> wrote:
>
>> Dear Brad, dear mailing list members,
>>
>>
>> While the ImageSeriesReader is capable of streaming it seems the
>> ImageSeriesWriter (although suggested:
>> http://www.kitware.com/media/html/IOStreamingInITK.html) cannot (my simple
>> try does not work:
>> https://github.com/romangrothausmann/ITK-CLIs/commit/f21c624057b3010d864d527988d1c67a151c1e94).
>>
>>
Is that just not implemented yet or intentionally avoided?
>> I was able to create a streaming version by using
>> Modules/Filtering/ImageCompose/test/itkJoinSeriesImageFilterStreamingTest.cxx
>> as an example:
>> https://github.com/romangrothausmann/ITK-CLIs/commit/e588c6635c60e4bcb5b946cf0cb985727197df9c
>>
>>
Is that the way to go?
>>
>> Is there a reason why the MetaImageIO
>> (http://www.itk.org/Doxygen47/html/classitk_1_1MetaImageIO.html) although
>> it supports streaming does not inherit StreamingImageIOBase as other
>> streamable ImageIO like MRC?
>>
>> Thanks for any hints. Roman
>>
>> On 20/04/15 20:09, Bradley Lowekamp wrote:
>>> Roman,
>>>
>>> On Apr 20, 2015, at 4:30 AM, Grothausmann, Roman Dr.
>>> <grothausmann.roman at mh-hannover.de> wrote:
>>>
>>>> Many thanks for Your answers and for also fixing the progress
>>>> reporting. Just tested and it works like a charm. It's a really great
>>>> contribution especially for those having to work with very big images.
>>>> I'll give it a try to use Your itkImageSinc to implement a "chunk
>>>> writer" taking StreamingStatisticsImage as an example and
>>>> ImageRegionSplitterMultidimensional to create the chunks.
>>>
>>> If you are implementing a writer derived from StreamingSinc, you should
>>> implement StreamedGenerateData, not ThreadedStreamedGenerate data as you
>>> don't want threading.
>>>
>>>>
>>>> If I set the NumberOfStreamDivisions to the number of slices in the 3D
>>>> Stack Input, is it guaranteed that each slice will be processed on its
>>>> own for the default ImageRegionSplitterSlowDimension? Or would I have
>>>> to use an approach as in itkJoinSeriesImageFilterStreamingTest.cxx
>>>> employing itkExtractImageFilter for each slice?
>>>
>>> The StreamedGenerateData method would get invoked for each slice with
>>> that slice being the specified region. However, the specified region
>>> provided to StreamedGenerateData may be smaller than the buffered region
>>> of the image. It may be best and most general to use the
>>> ExtractImageFilter to make sure the buffer is as expected.
>>>
>>>
>>>>
>>>> In the docs of ImageSeriesWriter it says: "Usually, the output image
>>>> type will have fewer dimensions than the input image type." Is there a
>>>> way to use the ImageSeriesWriter to save a series of hypercubes as
>>>> ImageRegionSplitterMultidimensional would yield internally?
>>>
>>> I don't think it has this feature.
>>>
>>>>
>>>> Thanks for any help or hints. Roman
>>>>
>>>> On 17/04/15 20:13, Bradley Lowekamp wrote:
>>>>> Hello,
>>>>>
>>>>> Glad to hear it worked for you.
>>>>>
>>>>> I have just fixed the progress reporting [1].
>>>>>
>>>>> The StreamingImageFilter overloads the UpdateData method [2], by
>>>>> passing the standard ImageToImage/ImageSource methods such and
>>>>> GenerateData, ThreadedGenerateData etc. It's actually not really
>>>>> designed to be derived from, and it used mostly to drive the
>>>>> streaming of a pipeline. It can be seen as slicing up the output
>>>>> image in to pieces, and requesting those pieces from the pipeline,
>>>>> the assembling them into the output image.
>>>>>
>>>>> The resulting behavior of the ImageSinc, with the
>>>>> StreamingProcessObject goes something like this:
>>>>>
>>>>>
>>>>> BeforeStreamedGenerateData()
>>>>>
>>>>> For each requested streamed chunk: For each thread process part of
>>>>> streamed chunk: ThreadedStreamedGenerateData()
>>>>>
>>>>> AfterStreamedGenerateData()
>>>>>
>>>>> So the input image is getting sliced up twice the first for streaming
>>>>> and the second for multi-threading.
>>>>>
>>>>> The StreamingImageFitler could be rewritten onto this framework to
>>>>> perhaps provide a generalized base class.
>>>>>
>>>>> For the StreamingStatisticsImage filter, the statistics are
>>>>> accumulated for each thread multiple times ( for each streamed chunk
>>>>> ), then the totals from the threads are reduced to the results.
>>>>>
>>>>> These classes certainly need more documentation before further
>>>>> integration into ITK.
>>>>>
>>>>> Brad
>>>>>
>>>>> [1]
>>>>> https://github.com/blowekamp/itkStreamingSinc/commit/d8415cf137d69a0e81b6dd46145d8cb7df2825c3
>>>>>
>>>>>
>>>>
>>>>>
>>
>>>>>
[2] 
https://github.com/InsightSoftwareConsortium/ITK/blob/8f7c404aff99f5ae3dfedce6e480701f0304864c/Modules/Core/Common/include/itkStreamingImageFilter.hxx#L118-Lundefined
>>>>>
>>>>> On Apr 17, 2015, at 12:12 PM, Grothausmann, Roman Dr.
>>>>> <grothausmann.roman at mh-hannover.de> wrote:
>>>>>
>>>>>> Dear Brad, dear Richard,
>>>>>>
>>>>>>
>>>>>> Many thanks for Your replies. So, if I understand You correctly,
>>>>>> the problem is that the current framework (with
>>>>>> StreamingImageFilter) will run AfterThreadedGenerateData for each
>>>>>> chunk and not just when the whole image has been processed. So one
>>>>>> would need to combine StatisticsImageFilter and
>>>>>> StreamingImageFilter into one filter, i.e. basically that the part
>>>>>> of AfterThreadedGenerateData is executed by StreamingImageFilter.
>>>>>> If I understand the code of itkStreamingSinc correctly, this is
>>>>>> what it does? itkStreamingSinc provides a base class to combine
>>>>>> multi-threaded filters with a StreamingImageFilter to make them
>>>>>> streamable. This comes with the trade-off that the resulting filter
>>>>>> will not provide an output, which is no problem if it is not
>>>>>> needed. So, e.g. itkStreamingStatisticsImageFilter cannot be
>>>>>> connected to itkPipelineMonitorImageFilter as it would need an
>>>>>> output of itkStreamingStatisticsImageFilter?
>>>>>>
>>>>>> Many thanks Brad for implementing
>>>>>> itkStreamingStatisticsImageFilter. I just tested it and it works
>>>>>> perfectly
>>>>>> (https://github.com/romangrothausmann/ITK-CLIs/commit/38bcad35bf004feaf2189bdaaffcf398fbca1f60).
>>>>>>
>>>>>>
>>>>
>>>>>>
>>
>>>>>>
Though, I do not understand the changes You made in: 
https://github.com/blowekamp/itkStreamingSinc/commit/b4ae9b61dc08388fbf1b3bfd9e5cf570dd40a0c6
>>>>>> Is the accumulation that still resides in
>>>>>> AfterStreamedGenerateData not used at all?
>>>>>> (https://github.com/blowekamp/itkStreamingSinc/commit/dae948bea0966a2c3924351bf9c15bfcef318ac6#diff-ad64d497b8f9aadd5da97c5e1c793dc9R210)
>>>>>>
>>>>>>
>>>>
>>>>>>
>>
>>>>>>
Just as a side note: The progress reported by itkStreamingStatisticsImageFilter 
jumps to 100% for each chunk.
>>>>>>
>>>>>> All in all Your itkStreamingSinc and the implemented
>>>>>> streaming-filters are really a great contribution to ITK and I
>>>>>> fully recommend incorporating it into ITK.
>>>>>>
>>>>>> Many thanks again Roman
>>>>>>
>>>>>>
>>>>>> On 17/04/15 15:47, Bradley Lowekamp wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> I was able to easy update a the StatisticsImageFilter to use my
>>>>>>> streaming base class for reduction algorithms [1]. It runs
>>>>>>> basically the same expect that you can set the number of stream
>>>>>>> divisions[2], there is the potential for setting the way the
>>>>>>> input image is split via the RegionSplitter in a base class [3].
>>>>>>>
>>>>>>> You should be able to just clone the repository into you
>>>>>>> ITK/Modules/External directory, then enable it in the CMake
>>>>>>> configuration to use.
>>>>>>>
>>>>>>> Please let me know if it works for you.
>>>>>>>
>>>>>>> This should help :) Brad > [1]
>>>>>>> https://github.com/blowekamp/itkStreamingSinc/blob/master/include/itkStreamingStatisticsImageFilter.h
>>>>>>>
>>>>>>>
>>>>
>>>>>>>
>>
>>>>>>>
[2] 
https://github.com/blowekamp/itkStreamingSinc/blob/master/test/itkStreamingStatisticsImageFilterTest2.cxx#L61
>>>>>>> [3]
>>>>>>> https://github.com/blowekamp/itkStreamingSinc/blob/master/include/itkImageSinc.h#L99
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>
>>>>>>>
>>
>>>>>>>
On Apr 17, 2015, at 7:14 AM, Bradley Lowekamp <blowekamp at mail.nih.gov>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Hello fellow mailing list member,
>>>>>>>>
>>>>>>>> Currently in ITK there are two base classes for streaming
>>>>>>>> images in ITK. The
>>>>>> ImageToImageFilter provide the framework of streaming one input
>>>>>> region to one output region. The other is the StreamingImageFilter
>>>>>> which provides the framework to stream multiple image regions and
>>>>>> merge them together into a single output image. This
>>>>>> StatisticsImageFilter needs a framework which consumes multiple
>>>>>> input image regions and reduces the data produced. I happen to have
>>>>>> implemented such a framework here [1]. It currently has the
>>>>>> LabelStatisticsImageFilter implemented in a streaming fashion.
>>>>>>>>
>>>>>>>> Let me give it a try and see how quickly I can get the
>>>>>>>> StatisticsImageFilter
>>>>>> in this framework. Help writing tests would be appreciated.
>>>>>>>>
>>>>>>>> Thanks, Brad
>>>>>>>>
>>>>>>>> [1] https://github.com/blowekamp/itkStreamingSinc
>>>>>>>>
>>>>>>>> On Apr 17, 2015, at 5:08 AM, Dr. Roman Grothausmann
>>>>>>>> <grothausmann.roman at mh-hannover.de> wrote:
>>>>>>>>
>>>>>>>>> Dear mailing list members,
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> I'm wondering why the itkStatisticsImageFilter cannot
>>>>>>>>> stream? Looking into itkStatisticsImageFilter.hxx it requests
>>>>>>>>> the whole input in GenerateInputRequestedRegion and
>>>>>>>>> EnlargeOutputRequestedRegion but in ThreadedGenerateData
>>>>>>>>> only iterates over the outputRegionForThread. Where in the
>>>>>>>>> code is the whole input image needed as one single block?
>>>>>>>>>
>>>>>>>>> Thanks for any hints Roman
>>>>>>>>>
>>>>>>>>> -- Dr. Roman Grothausmann
>>>>>>>>>
>>>>>>>>> Tomographie und Digitale Bildverarbeitung Tomography and
>>>>>>>>> Digital Image Analysis
>>>>>>>>>
>>>>>>>>> Institut für Funktionelle und Angewandte Anatomie, OE 4120
>>>>>>>>> Medizinische Hochschule Hannover Carl-Neuberg-Str. 1 D-30625
>>>>>>>>> Hannover
>>>>>>>>>
>>>>>>>>> Tel. +49 511 532-2900 _____________________________________
>>>>>>>>> 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.php
>>>>>>>>>
>>>>>>>>> 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://public.kitware.com/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.php
>>>>>>>>
>>>>>>>> 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://public.kitware.com/mailman/listinfo/insight-users
>>>>>>>
>>>>>>
>>>>>> -- Dr. Roman Grothausmann
>>>>>>
>>>>>> Tomographie und Digitale Bildverarbeitung Tomography and Digital
>>>>>> Image Analysis
>>>>>>
>>>>>> Institut für Funktionelle und Angewandte Anatomie, OE 4120
>>>>>> Medizinische Hochschule Hannover Carl-Neuberg-Str. 1 D-30625
>>>>>> Hannover
>>>>>>
>>>>>> Tel. +49 511 532-2900
>>>>>
>>>>
>>>> -- Dr. Roman Grothausmann
>>>>
>>>> Tomographie und Digitale Bildverarbeitung Tomography and Digital Image
>>>> Analysis
>>>>
>>>> Institut für Funktionelle und Angewandte Anatomie, OE 4120
>>>> Medizinische Hochschule Hannover Carl-Neuberg-Str. 1 D-30625 Hannover
>>>>
>>>> Tel. +49 511 532-2900
>>>
>>
>> -- Dr. Roman Grothausmann
>>
>> Tomographie und Digitale Bildverarbeitung Tomography and Digital Image
>> Analysis
>>
>> Institut für Funktionelle und Angewandte Anatomie, OE 4120 Medizinische
>> Hochschule Hannover Carl-Neuberg-Str. 1 D-30625 Hannover
>>
>> Tel. +49 511 532-2900
>

-- 
Dr. Roman Grothausmann

Tomographie und Digitale Bildverarbeitung
Tomography and Digital Image Analysis

Institut für Funktionelle und Angewandte Anatomie, OE 4120
Medizinische Hochschule Hannover
Carl-Neuberg-Str. 1
D-30625 Hannover

Tel. +49 511 532-2900


More information about the Insight-users mailing list