#!/usr/bin/env python import os import sys sys.path.append("/mnt/93E8-0534/AIDAN/HDBET/") from HD_BET.run import run_hd_bet from HD_BET.utils import maybe_mkdir_p, subfiles import HD_BET def hd_bet(input_file_or_dir,output_file_or_dir,mode,device,tta,pp=1,save_mask=0,overwrite_existing=1): if output_file_or_dir is None: output_file_or_dir = os.path.join(os.path.dirname(input_file_or_dir), os.path.basename(input_file_or_dir).split(".")[0] + "_bet") params_file = os.path.join(HD_BET.__path__[0], "model_final.py") config_file = os.path.join(HD_BET.__path__[0], "config.py") assert os.path.abspath(input_file_or_dir) != os.path.abspath(output_file_or_dir), "output must be different from input" if device == 'cpu': pass else: device = int(device) if os.path.isdir(input_file_or_dir): maybe_mkdir_p(output_file_or_dir) input_files = subfiles(input_file_or_dir, suffix='_0000.nii.gz', join=False) if len(input_files) == 0: raise RuntimeError("input is a folder but no nifti files (.nii.gz) were found in here") output_files = [os.path.join(output_file_or_dir, i) for i in input_files] input_files = [os.path.join(input_file_or_dir, i) for i in input_files] else: if not output_file_or_dir.endswith('.nii.gz'): output_file_or_dir += '.nii.gz' assert os.path.abspath(input_file_or_dir) != os.path.abspath(output_file_or_dir), "output must be different from input" output_files = [output_file_or_dir] input_files = [input_file_or_dir] if tta == 0: tta = False elif tta == 1: tta = True else: raise ValueError("Unknown value for tta: %s. Expected: 0 or 1" % str(tta)) if overwrite_existing == 0: overwrite_existing = False elif overwrite_existing == 1: overwrite_existing = True else: raise ValueError("Unknown value for overwrite_existing: %s. Expected: 0 or 1" % str(overwrite_existing)) if pp == 0: pp = False elif pp == 1: pp = True else: raise ValueError("Unknown value for pp: %s. Expected: 0 or 1" % str(pp)) if save_mask == 0: save_mask = False elif save_mask == 1: save_mask = True else: raise ValueError("Unknown value for pp: %s. Expected: 0 or 1" % str(pp)) run_hd_bet(input_files, output_files, mode, config_file, device, pp, tta, save_mask, overwrite_existing) if __name__ == "__main__": print("\n########################") print("If you are using hd-bet, please cite the following paper:") print("Isensee F, Schell M, Tursunova I, Brugnara G, Bonekamp D, Neuberger U, Wick A, Schlemmer HP, Heiland S, Wick W," "Bendszus M, Maier-Hein KH, Kickingereder P. Automated brain extraction of multi-sequence MRI using artificial" "neural networks. arXiv preprint arXiv:1901.11341, 2019.") print("########################\n") import argparse parser = argparse.ArgumentParser() parser.add_argument('-i', '--input', help='input. Can be either a single file name or an input folder. If file: must be ' 'nifti (.nii.gz) and can only be 3D. No support for 4d images, use fslsplit to ' 'split 4d sequences into 3d images. If folder: all files ending with .nii.gz ' 'within that folder will be brain extracted.', required=True, type=str) parser.add_argument('-o', '--output', help='output. Can be either a filename or a folder. If it does not exist, the folder' ' will be created', required=False, type=str) parser.add_argument('-mode', type=str, default='accurate', help='can be either \'fast\' or \'accurate\'. Fast will ' 'use only one set of parameters whereas accurate will ' 'use the five sets of parameters that resulted from ' 'our cross-validation as an ensemble. Default: ' 'accurate', required=False) parser.add_argument('-device', default='0', type=str, help='used to set on which device the prediction will run. ' 'Must be either int or str. Use int for GPU id or ' '\'cpu\' to run on CPU. When using CPU you should ' 'consider disabling tta. Default for -device is: 0', required=False) parser.add_argument('-tta', default=1, required=False, type=int, help='whether to use test time data augmentation ' '(mirroring). 1= True, 0=False. Disable this ' 'if you are using CPU to speed things up! ' 'Default: 1') parser.add_argument('-pp', default=1, type=int, required=False, help='set to 0 to disabe postprocessing (remove all' ' but the largest connected component in ' 'the prediction. Default: 1') parser.add_argument('-s', '--save_mask', default=1, type=int, required=False, help='if set to 0 the segmentation ' 'mask will not be ' 'saved') parser.add_argument('--overwrite_existing', default=1, type=int, required=False, help="set this to 0 if you don't " "want to overwrite existing " "predictions") args = parser.parse_args() hd_bet(args.input,args.output,args.mode,args.device,args.tta,args.pp,args.save_mask,args.overwrite_existing)