Deep-MI / FastSurfer

PyTorch implementation of FastSurferCNN
Apache License 2.0
456 stars 119 forks source link

FastSurfer QuickSeg doesn't work with OASIS `.img` files #516

Closed FahimFBA closed 5 months ago

FahimFBA commented 5 months ago

Description

I have used FastSurfer to preprocess ADNI dataset, and it worked great. However, it can't handle .img files from OASIS. I used .gzip to zip them, but it is failing. ....

Unable to find image 'deepmi/fastsurfer:latest' locally
latest: Pulling from deepmi/fastsurfer
cbe3537751ce: Pull complete
6049abce14a6: Pull complete
db1385fdf8a6: Pull complete
ca6d8c5a8402: Pull complete
d99c6e1c6cc9: Pull complete
14d454bf4c4c: Pull complete
5fa3213290c1: Pull complete
cc98e5207bed: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:a8ee7df7a6b79beb7ca5ac5a01ab0f396b55e26b5fe4c8749244a6ce091b8f2f
Status: Downloaded newer image for deepmi/fastsurfer:latest
Version: 2.2.0+9f37d02
Mon Apr 29 18:12:27 UTC 2024

python-s /fastsurfer/FastSurferCNN/run_prediction.py --t1 /data/001_1.img.gz --asegdkt_segfile /output/001_1.img/mri/aparc.DKTatlas+aseg.deep.mgz --conformed_name /output/001_1.img/mri/orig.mgz --brainmask_name /output/001_1.img/mri/mask.mgz --aseg_name /output/001_1.img/mri/aseg.auto_noCCseg.mgz --sid 001_1.img --seg_log /output/001_1.img/scripts/deep-seg.log --vox_size min --batch_size 1 --viewagg_device auto --device auto
[INFO: run_prediction.py:  546]: Checking or downloading default checkpoints ...
[INFO: common.py:  111]: Using device: cuda
[INFO: common.py:  111]: Using viewagg_device: cuda
[INFO: run_prediction.py:  234]: Running view aggregation on cuda
[INFO: inference.py:  200]: Loading checkpoint /fastsurfer/checkpoints/aparc_vinn_coronal_v2.0.0.pkl
[INFO: inference.py:  200]: Loading checkpoint /fastsurfer/checkpoints/aparc_vinn_sagittal_v2.0.0.pkl
[INFO: inference.py:  200]: Loading checkpoint /fastsurfer/checkpoints/aparc_vinn_axial_v2.0.0.pkl
[INFO: common.py:  820]: Single subject with absolute file path for input.
[INFO: common.py:  833]: No subjects directory specified, but the parent directory of the output file /output/001_1.img/mri/aparc.DKTatlas+aseg.deep.mgz is 'mri', so we are assuming this is the 'mri' folder in the subject directory.
[INFO: common.py:  875]: Analyzing single subject /data/001_1.img.gz
[INFO: common.py:  970]: Output will be stored in Subjects Directory: /output
Traceback (most recent call last):
  File "/fastsurfer/FastSurferCNN/run_prediction.py", line 561, in <module>
    for subject, (orig_img, data_array) in iter_subjects:
  File "/fastsurfer/FastSurferCNN/run_prediction.py", line 462, in pipeline_conform_and_save_orig
    yield subject, self.conform_and_save_orig(subject)
  File "/fastsurfer/FastSurferCNN/run_prediction.py", line 309, in conform_and_save_orig
    orig, orig_data = du.load_image(subject.orig_name, "orig image")
  File "/fastsurfer/FastSurferCNN/data_loader/data_utils.py", line 155, in load_image
    img = nib.load(file, **kwargs)
  File "/venv/lib/python3.10/site-packages/nibabel/loadsave.py", line 117, in load
    raise ImageFileError(f'Cannot work out file type of "{filename}"')
nibabel.filebasedimages.ImageFileError: Cannot work out file type of "/data/001_1.img.gz"
ERROR: FastSurfer asegdkt segmentation failed.
[sudo] password for fahim:
Version: 2.2.0+9f37d02
Mon Apr 29 18:12:36 UTC 2024

python-s /fastsurfer/FastSurferCNN/run_prediction.py --t1 /data/001_2.img.gz --asegdkt_segfile /output/001_2.img/mri/aparc.DKTatlas+aseg.deep.mgz --conformed_name /output/001_2.img/mri/orig.mgz --brainmask_name /output/001_2.img/mri/mask.mgz --aseg_name /output/001_2.img/mri/aseg.auto_noCCseg.mgz --sid 001_2.img --seg_log /output/001_2.img/scripts/deep-seg.log --vox_size min --batch_size 1 --viewagg_device auto --device auto
[INFO: run_prediction.py:  546]: Checking or downloading default checkpoints ...
[INFO: common.py:  111]: Using device: cuda
[INFO: common.py:  111]: Using viewagg_device: cuda
[INFO: run_prediction.py:  234]: Running view aggregation on cuda
[INFO: inference.py:  200]: Loading checkpoint /fastsurfer/checkpoints/aparc_vinn_coronal_v2.0.0.pkl
[INFO: inference.py:  200]: Loading checkpoint /fastsurfer/checkpoints/aparc_vinn_sagittal_v2.0.0.pkl
[INFO: inference.py:  200]: Loading checkpoint /fastsurfer/checkpoints/aparc_vinn_axial_v2.0.0.pkl
[INFO: common.py:  820]: Single subject with absolute file path for input.
[INFO: common.py:  833]: No subjects directory specified, but the parent directory of the output file /output/001_2.img/mri/aparc.DKTatlas+aseg.deep.mgz is 'mri', so we are assuming this is the 'mri' folder in the subject directory.
[INFO: common.py:  875]: Analyzing single subject /data/001_2.img.gz
[INFO: common.py:  970]: Output will be stored in Subjects Directory: /output
Traceback (most recent call last):
  File "/fastsurfer/FastSurferCNN/run_prediction.py", line 561, in <module>
    for subject, (orig_img, data_array) in iter_subjects:
  File "/fastsurfer/FastSurferCNN/run_prediction.py", line 462, in pipeline_conform_and_save_orig
    yield subject, self.conform_and_save_orig(subject)
  File "/fastsurfer/FastSurferCNN/run_prediction.py", line 309, in conform_and_save_orig
    orig, orig_data = du.load_image(subject.orig_name, "orig image")
  File "/fastsurfer/FastSurferCNN/data_loader/data_utils.py", line 155, in load_image
    img = nib.load(file, **kwargs)
  File "/venv/lib/python3.10/site-packages/nibabel/loadsave.py", line 117, in load
    raise ImageFileError(f'Cannot work out file type of "{filename}"')
nibabel.filebasedimages.ImageFileError: Cannot work out file type of "/data/001_2.img.gz"
ERROR: FastSurfer asegdkt segmentation failed.
Version: 2.2.0+9f37d02
Mon Apr 29 18:12:41 UTC 2024

python-s /fastsurfer/FastSurferCNN/run_prediction.py --t1 /data/001_3.img.gz --asegdkt_segfile /output/001_3.img/mri/aparc.DKTatlas+aseg.deep.mgz --conformed_name /output/001_3.img/mri/orig.mgz --brainmask_name /output/001_3.img/mri/mask.mgz --aseg_name /output/001_3.img/mri/aseg.auto_noCCseg.mgz --sid 001_3.img --seg_log /output/001_3.img/scripts/deep-seg.log --vox_size min --batch_size 1 --viewagg_device auto --device auto
[INFO: run_prediction.py:  546]: Checking or downloading default checkpoints ...
[INFO: common.py:  111]: Using device: cuda
[INFO: common.py:  111]: Using viewagg_device: cuda
[INFO: run_prediction.py:  234]: Running view aggregation on cuda
[INFO: inference.py:  200]: Loading checkpoint /fastsurfer/checkpoints/aparc_vinn_coronal_v2.0.0.pkl
[INFO: inference.py:  200]: Loading checkpoint /fastsurfer/checkpoints/aparc_vinn_sagittal_v2.0.0.pkl
[INFO: inference.py:  200]: Loading checkpoint /fastsurfer/checkpoints/aparc_vinn_axial_v2.0.0.pkl
[INFO: common.py:  820]: Single subject with absolute file path for input.
[INFO: common.py:  833]: No subjects directory specified, but the parent directory of the output file /output/001_3.img/mri/aparc.DKTatlas+aseg.deep.mgz is 'mri', so we are assuming this is the 'mri' folder in the subject directory.
[INFO: common.py:  875]: Analyzing single subject /data/001_3.img.gz
[INFO: common.py:  970]: Output will be stored in Subjects Directory: /output
Traceback (most recent call last):
  File "/fastsurfer/FastSurferCNN/run_prediction.py", line 561, in <module>
    for subject, (orig_img, data_array) in iter_subjects:
  File "/fastsurfer/FastSurferCNN/run_prediction.py", line 462, in pipeline_conform_and_save_orig
    yield subject, self.conform_and_save_orig(subject)
  File "/fastsurfer/FastSurferCNN/run_prediction.py", line 309, in conform_and_save_orig
    orig, orig_data = du.load_image(subject.orig_name, "orig image")
  File "/fastsurfer/FastSurferCNN/data_loader/data_utils.py", line 155, in load_image
    img = nib.load(file, **kwargs)
  File "/venv/lib/python3.10/site-packages/nibabel/loadsave.py", line 117, in load
    raise ImageFileError(f'Cannot work out file type of "{filename}"')
nibabel.filebasedimages.ImageFileError: Cannot work out file type of "/data/001_3.img.gz"
ERROR: FastSurfer asegdkt segmentation failed.
Version: 2.2.0+9f37d02
Mon Apr 29 18:12:47 UTC 2024

python-s /fastsurfer/FastSurferCNN/run_prediction.py --t1 /data/001_4.img.gz --asegdkt_segfile /output/001_4.img/mri/aparc.DKTatlas+aseg.deep.mgz --conformed_name /output/001_4.img/mri/orig.mgz --brainmask_name /output/001_4.img/mri/mask.mgz --aseg_name /output/001_4.img/mri/aseg.auto_noCCseg.mgz --sid 001_4.img --seg_log /output/001_4.img/scripts/deep-seg.log --vox_size min --batch_size 1 --viewagg_device auto --device auto
[INFO: run_prediction.py:  546]: Checking or downloading default checkpoints ...
[INFO: common.py:  111]: Using device: cuda
[INFO: common.py:  111]: Using viewagg_device: cuda
[INFO: run_prediction.py:  234]: Running view aggregation on cuda
[INFO: inference.py:  200]: Loading checkpoint /fastsurfer/checkpoints/aparc_vinn_coronal_v2.0.0.pkl
[INFO: inference.py:  200]: Loading checkpoint /fastsurfer/checkpoints/aparc_vinn_sagittal_v2.0.0.pkl
[INFO: inference.py:  200]: Loading checkpoint /fastsurfer/checkpoints/aparc_vinn_axial_v2.0.0.pkl
[INFO: common.py:  820]: Single subject with absolute file path for input.
[INFO: common.py:  833]: No subjects directory specified, but the parent directory of the output file /output/001_4.img/mri/aparc.DKTatlas+aseg.deep.mgz is 'mri', so we are assuming this is the 'mri' folder in the subject directory.
[INFO: common.py:  875]: Analyzing single subject /data/001_4.img.gz
[INFO: common.py:  970]: Output will be stored in Subjects Directory: /output
Traceback (most recent call last):
  File "/fastsurfer/FastSurferCNN/run_prediction.py", line 561, in <module>
    for subject, (orig_img, data_array) in iter_subjects:
  File "/fastsurfer/FastSurferCNN/run_prediction.py", line 462, in pipeline_conform_and_save_orig
    yield subject, self.conform_and_save_orig(subject)
  File "/fastsurfer/FastSurferCNN/run_prediction.py", line 309, in conform_and_save_orig
    orig, orig_data = du.load_image(subject.orig_name, "orig image")
  File "/fastsurfer/FastSurferCNN/data_loader/data_utils.py", line 155, in load_image
    img = nib.load(file, **kwargs)
  File "/venv/lib/python3.10/site-packages/nibabel/loadsave.py", line 117, in load
    raise ImageFileError(f'Cannot work out file type of "{filename}"')
nibabel.filebasedimages.ImageFileError: Cannot work out file type of "/data/001_4.img.gz"
ERROR: FastSurfer asegdkt segmentation failed.
Version: 2.2.0+9f37d02
Mon Apr 29 18:12:52 UTC 2024

python-s /fastsurfer/FastSurferCNN/run_prediction.py --t1 /data/002_1.img.gz --asegdkt_segfile /output/002_1.img/mri/aparc.DKTatlas+aseg.deep.mgz --conformed_name /output/002_1.img/mri/orig.mgz --brainmask_name /output/002_1.img/mri/mask.mgz --aseg_name /output/002_1.img/mri/aseg.auto_noCCseg.mgz --sid 002_1.img --seg_log /output/002_1.img/scripts/deep-seg.log --vox_size min --batch_size 1 --viewagg_device auto --device auto
[INFO: run_prediction.py:  546]: Checking or downloading default checkpoints ...
[INFO: common.py:  111]: Using device: cuda
[INFO: common.py:  111]: Using viewagg_device: cuda
[INFO: run_prediction.py:  234]: Running view aggregation on cuda
[INFO: inference.py:  200]: Loading checkpoint /fastsurfer/checkpoints/aparc_vinn_coronal_v2.0.0.pkl
[INFO: inference.py:  200]: Loading checkpoint /fastsurfer/checkpoints/aparc_vinn_sagittal_v2.0.0.pkl
[INFO: inference.py:  200]: Loading checkpoint /fastsurfer/checkpoints/aparc_vinn_axial_v2.0.0.pkl
[INFO: common.py:  820]: Single subject with absolute file path for input.
[INFO: common.py:  833]: No subjects directory specified, but the parent directory of the output file /output/002_1.img/mri/aparc.DKTatlas+aseg.deep.mgz is 'mri', so we are assuming this is the 'mri' folder in the subject directory.
[INFO: common.py:  875]: Analyzing single subject /data/002_1.img.gz
[INFO: common.py:  970]: Output will be stored in Subjects Directory: /output
Traceback (most recent call last):
  File "/fastsurfer/FastSurferCNN/run_prediction.py", line 561, in <module>
    for subject, (orig_img, data_array) in iter_subjects:
  File "/fastsurfer/FastSurferCNN/run_prediction.py", line 462, in pipeline_conform_and_save_orig
    yield subject, self.conform_and_save_orig(subject)
  File "/fastsurfer/FastSurferCNN/run_prediction.py", line 309, in conform_and_save_orig
    orig, orig_data = du.load_image(subject.orig_name, "orig image")
  File "/fastsurfer/FastSurferCNN/data_loader/data_utils.py", line 155, in load_image
    img = nib.load(file, **kwargs)
  File "/venv/lib/python3.10/site-packages/nibabel/loadsave.py", line 117, in load
    raise ImageFileError(f'Cannot work out file type of "{filename}"')
nibabel.filebasedimages.ImageFileError: Cannot work out file type of "/data/002_1.img.gz"
ERROR: FastSurfer asegdkt segmentation failed.
Version: 2.2.0+9f37d02

Screenshots

...

Environment

Execution

I used my script:

#!/bin/bash

INPUT_DIR="/mnt/c/Users/fahim/FastSurfer_Process/my_mri_data"
OUTPUT_DIR="/mnt/c/Users/fahim/FastSurfer_Process/my_fastsurfer_analysis"
LICENSE_DIR="/mnt/c/Users/fahim/FastSurfer_Process/my_fs_license_dir"

# Ensure output directory exists
mkdir -p "$OUTPUT_DIR"

# Iterate over each .nii.gz file in the input directory
for file in "$INPUT_DIR"/*.img.gz; do
    if [[ -f "$file" ]]; then
        filename=$(basename -- "$file")
        filename_no_extension="${filename%.*}"

        sudo docker run --gpus all \
               -v "$INPUT_DIR":/data \
               -v "$OUTPUT_DIR":/output \
               -v "$LICENSE_DIR":/fs_license \
               --rm --user $(id -u):$(id -g) deepmi/fastsurfer:latest \
               --fs_license /fs_license/license.txt \
               --t1 "/data/$filename" \
               --sid "$filename_no_extension" \
               --sd /output --seg_only \
               --parallel
    else
        echo "File $file not found or is not a regular file."
    fi
done

image

m-reuter commented 5 months ago

You would first need to convert the .img file to a nifti or mgz file. One way to do this is using mri_convert (from FreeSurfer, it is also part of our container, so you could change the --entrypoint or run interactively with bash). mri_convert input.img output.mgz

FahimFBA commented 5 months ago

You would first need to convert the .img file to a nifti or mgz file. One way to do this is using mri_convert (from FreeSurfer, it is also part of our container, so you could change the --entrypoint or run interactively with bash). mri_convert input.img output.mgz

Thank you. It is kind of awkward as it didn't work earlier.

I found the issue that caused the error earlier. You must need to have the corresponding .hdr (Header) file to convert them using FreeSurfer. Earlier, I reorganized the dataset, and in the process, I deleted the header files without having any idea of their importance. Therefore, FreeSurfer, FSL, nibabel, simpleitk also failed to convert them.

If you have the corresponding .hdr files, then FreeSurfer can convert them into .mgz or .nii perfectly.

image

However, I managed to batch-process them nicely using Brainder.. Then I can easily incorporate them into FastSurfer.

I am also closing this issue keeping the comments as others might find them useful.

dkuegler commented 5 months ago

Technically, Fastsurfer should be able to use any file format that is compatible with nibabel. We just always use mgz and nifty, so our official support is only for those two.