Source code for dipy.workflows.nn
import logging
import numpy as np
from dipy.io.image import load_nifti, save_nifti
from dipy.nn.evac import EVACPlus
from dipy.workflows.workflow import Workflow
[docs]
class EVACPlusFlow(Workflow):
[docs]
@classmethod
def get_short_name(cls):
return "evacplus"
[docs]
def run(
self,
input_files,
save_masked=False,
out_dir="",
out_mask="brain_mask.nii.gz",
out_masked="dwi_masked.nii.gz",
):
"""Extract brain using EVAC+.
See :footcite:p:`Park2024` for further details about EVAC+.
Parameters
----------
input_files : string
Path to the input volumes. This path may contain wildcards to
process multiple inputs at once.
save_masked : bool, optional
Save mask.
out_dir : string, optional
Output directory. (default current directory)
out_mask : string, optional
Name of the mask volume to be saved.
out_masked : string, optional
Name of the masked volume to be saved.
References
----------
.. footbibliography::
"""
io_it = self.get_io_iterator()
empty_flag = True
for fpath, mask_out_path, masked_out_path in io_it:
logging.info(f"Applying evac+ brain extraction on {fpath}")
data, affine, img, voxsize = load_nifti(
fpath, return_img=True, return_voxsize=True
)
evac = EVACPlus()
mask_volume = evac.predict(data, affine, voxsize=voxsize)
masked_volume = mask_volume * data
save_nifti(mask_out_path, mask_volume.astype(np.float64), affine)
logging.info(f"Mask saved as {mask_out_path}")
if save_masked:
save_nifti(masked_out_path, masked_volume, affine, hdr=img.header)
logging.info(f"Masked volume saved as {masked_out_path}")
empty_flag = False
if empty_flag:
raise ValueError(
"All output paths exists."
" If you want to overwrite "
"please use the --force option."
)
return io_it