Source code for miblab.dlseg

import os
from tqdm import tqdm

try:
    from totalsegmentator import map_to_binary
    from totalsegmentator.python_api import totalsegmentator
    totalsegmentor_installed = True
except ImportError:
    totalsegmentor_installed = False

try:
    import vreg
    vreg_installed = True
except ImportError:
    vreg_installed = False

# from totalsegmentator.config import setup_nnunet
# setup_nnunet()


TMPPATH = os.getcwd()


def _totseg(vol, cutoff=None, task='total', roi_subset=None, **kwargs):


    print('Saving source as nifti..')
    nifti_file = os.path.join(TMPPATH, 'source.nii.gz')
    vreg.write_nifti(vol, nifti_file)

    print('Segmenting organs..')
    totalsegmentator(nifti_file, TMPPATH, task=task, roi_subset=roi_subset, **kwargs)
    os.remove(nifti_file)

    if roi_subset is None:
        roi_set = list(map_to_binary.class_map[task].values())
    else:
        roi_set = roi_subset

    mask = {}
    for roi in tqdm(roi_set, desc='Reading results..'):
        roifile = os.path.join(TMPPATH, roi + '.nii.gz')
        v = vreg.read_nifti(roifile)
        if cutoff is not None:
            values = v.values
            values[values > cutoff] = 1
            values[values <= cutoff] = 0
            v.set_values(values)
        mask[roi] = v
        os.remove(roifile) 

    return mask


[docs] def totseg(vol, cutoff=None, **kwargs): """Run totalsegmentator on one or more volumes. Source: `totalsegmentator <https://github.com/wasserth/TotalSegmentator>`_. Args: vol (vreg.Volume3D or list): Either a single volume, or a list of volumes to be segmented. cutoff (float, optional): Pixels with a probability higher than cutoff will be included in the mask. If cutoff is not provided, probabilities will be returned directly. Defaults to None. kwargs: Any keyword arguments accepted by the `totalsegmentor python API <https://github.com/wasserth/TotalSegmentator/tree/master?tab=readme-ov-file#totalsegmentator>`_. Returns: dict: dictionary with keys the mask names (ROI labels) and values the corresponding vreg.Volume3D objects. Example: Use a machine with a cpu to run the task 'total_mr' on a single volume saved as a nifti file: >>> import miblab >>> import vreg >>> vol = vreg.read_nifti('path/to/volume.nii.gz') >>> mask = miblab.totseg(vol, cutoff=0.01, task='total_mr', device='cpu') >>> print(mask['liver'].values) [0 1 1 ... 0 0 0] """ if not vreg_installed: raise ImportError( 'vreg is not installed. Please install it with "pip install vreg".' 'To install all dlseg options at once, install miblab as pip install miblab[dlseg].' ) if not totalsegmentor_installed: raise ImportError( 'totalsegmentator is not installed. Please install it with "pip install totalsegmentator".' 'To install all dlseg options at once, install miblab as pip install miblab[dlseg].' ) if not isinstance(vol, list): return _totseg(vol, cutoff, **kwargs) total = {} for v in tqdm(vol, desc='Segmenting volumes..'): mask = _totseg(v, **kwargs) for roi in mask: if roi in total: values = total[roi].values + mask[roi].values total[roi].set_values(values) else: total[roi] = mask[roi] for roi, v in tqdm(total.items(), desc='Combining results..'): values = v.values/len(vol) if cutoff is not None: values[values > cutoff] = 1 values[values <= cutoff] = 0 v.set_values(values) total[roi] = v return total