ankit agrawal
ankit agrawal

Reputation: 311

Analysis of 3d image data as 2d

I have a tif image of size around ~10 Gb. I need to perform object classification or pixel classification in this image. The dimension of image data has zyx form. My voxel size in x=0.6, y=0.6 and z=1.2. Z is the depth of the object. My RAM can not take whole image.

If I do classification of pixels in each Z plane separately and then merge to get the final shape and volume of object.

Would I loose any information and my final shape or volume of object will be wrong?

Upvotes: 1

Views: 168

Answers (3)

Ouetis_Khan
Ouetis_Khan

Reputation: 41

@ankit agrawal you probably have found the answer but my advice would be definitely not to say you need more memory. I have had a similar problem and if anyone else comes across them the options below will help.

Options

  1. The answer about splitting into just z planes is correct. You could lose information in the z plane. The idea isn't a bad one but you could take Regions of Interest (ROIs) /split your image into chunks. So that they could be more manageable but say split the x/2, y/2 and z/2. Then you get a bunch of chunks that be used in memory. Then stack the data back up later

  2. use the library [Dask] (https://dask.org/) , it creates all this for you. It's designed for parallelism and can be scaled on a single computer or a cluster. Using the dask.array part lets you create lots of chunked numpy arrays. Even better, go use dask-image (there should be a link to this in dask). It's a wrapper of dask.array and many scipy ndimage functions. Lastly when the file is split appropriately the computation can be faster because of parallelism. Not always but I have easily worked with 20GB data sets on a laptop with 16GB. The files were 8bit so when many libraries and function upfloat blowing your memory up. This allows you keep a handle on it all. If you stick to the core functions it will work fine. Gets harder when you work with mapped blocks.

If you still have this issue.

Upvotes: 1

sunapi386
sunapi386

Reputation: 1357

I think breaking the image any (x/y/z) plane kind of defeats the point of the voxel concept because the representation of a three-dimensional object is flattened and you lose the spatial relational data.

I think a couple of options are:

  1. Use a distributed computing cluster, like Hadoop.
  2. Look into storing that image in a geospatial database like GeoMesa, so it may be queried efficiently, then you can just hold in memory what you need to train locally.
  3. 10GB isn't so large, so perhaps upgrade your memory capacity?

Upvotes: 0

mrk
mrk

Reputation: 10366

The issue with doing a classification in each z-plane individually is that you might not be able to classify objects with that sort of restricted information.

You can easily think of that the same way for a 2D face detection problem where you would try to detect the face in each row individually - that is probably not going to be very robust and you will loose valuable spatial information. In the end you'll probably end up with no detections to merge.

Solution proposal:

My advice would be to increase the size of your voxels until it can be processed by your processing unit, saying decrease the resolution of your data and do a classification with a low confidence threshold. Then come back and do another classification on the volumes with detections in them, this time aim for a higher confidence threshold. This can be done iteratively as need be.

Upvotes: 0

Related Questions