Skip to content

Commit

Permalink
Merge pull request #24 from neuronflow/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
IsraMekki0 authored Jan 31, 2023
2 parents 95929ec + ef406dc commit 579fad8
Show file tree
Hide file tree
Showing 25 changed files with 2,409 additions and 3 deletions.
30 changes: 30 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: release

on:
release:
types: [created]
workflow_dispatch:

jobs:
publish:
name: Publish to test PyPI
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install dependencies
run: |
pip install build
pip install twine
- name: Build package
run: python -m build
- name: Upload to PyPI
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
run: |
twine upload dist/*.whl
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Copyright (c) 2019 Florian Kofler (florian.kofler[at]tum.de) & Christoph Berger (c.berger[at]tum.de)
Copyright (c) 2019 Florian Kofler (florian.kofler[at]tum.de), Christoph Berger (c.berger[at]tum.de), Isra Mekki (isra.mekki[at]helmholtz-muenchen.de) & Mahyar Valizadeh (mahyar.valizadeh[at]helmholtz-muenchen.de)

GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Expand Down
1 change: 1 addition & 0 deletions brats_toolkit/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

214 changes: 214 additions & 0 deletions brats_toolkit/cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
# -*- coding: utf-8 -*-
# Author: Christoph Berger
# Script for evaluation and bulk segmentation of Brain Tumor Scans
# using the MICCAI BRATS algorithmic repository
#
# Please refer to README.md and LICENSE.md for further documentation
# This software is not certified for clinical use.

import sys
import subprocess
import pprint
import argparse

from . import segmentor, fusionator, preprocessor

def list_dockers():
seg = segmentor.Segmentor()
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(seg.config)

def list_docker_ids():
seg = segmentor.Segmentor()
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(seg.config.keys())

def list_docker_gpu():
seg = segmentor.Segmentor()
print('all these images support GPU computations:')
for id in seg.config.keys():
if seg.config[id]['runtime'] == 'nvidia':
print(id)

def list_docker_cpu():
seg = segmentor.Segmentor()
print('all these images support CPU computations:')
for id in seg.config.keys():
if seg.config[id]['runtime'] == 'runc':
print(id)

def fusion():
parser = argparse.ArgumentParser(description='Runs the Docker orchestra to fuse segmentations. All inputs have to have equal shape and label values')
parser.add_argument('-i','--input', required=True,
help = 'Input directory containing all .nii.gz files to be fused')
parser.add_argument('-m','--method', required=True,
help = 'Method for fusion: mav for majority voting, simple for SIMPLE')
parser.add_argument('-o', '--output',
help = 'Filename for the output in format filename.nii.gz')
parser.add_argument('-v', '--verbose',action='store_true',
help = 'Verbose mode outputs log info to the command line.')
try:
args = parser.parse_args()
except SystemExit as e:
if e.code == 2:
parser.print_help()
sys.exit(e.code)
try:
# runs the segmentation with all the settings wished for by the user
fus = fusionator.Fusionator(verbose=args.verbose)
fus.dirFuse(args.input, method=args.method, outputPath=args.output)
except subprocess.CalledProcessError as e:
# Ignoring errors happening in the Docker Process, otherwise we'd e.g. get error messages on exiting the Docker via CTRL+D.
pass
except Exception as e:
print('ERROR DETAIL: ', e)

def segmentation():
parser = argparse.ArgumentParser(description='Runs the Docker orchestra to segment and fuse segmentations based on the' \
'BraTS algorithmic repository' \
'Please keep in mind that some models require Nvidia-Docker to run as' \
' they need a supported GPU.')
parser.add_argument('-l', '--list',
help = 'List all models available for segmentation.',
action = 'store_true')
parser.add_argument('-ll', '--longlist',
help = 'List all models available for segmentation with details.',
action = 'store_true')
parser.add_argument('-lc', '--cpulist',
help = 'List all models supporting cpus.',
action = 'store_true')
parser.add_argument('-lg', '--gpulist',
help = 'List all models supporting gpus.',
action = 'store_true')
parser.add_argument('-t1',required=True,
help = 'Path to the t1 modality.')
parser.add_argument('-t1c',required=True,
help = 'Path to the t1c modality.')
parser.add_argument('-t2',required=True,
help = 'Path to the t2 modality.')
parser.add_argument('-fla',required=True,
help = 'Path to the fla modality.')
parser.add_argument('-d', '--docker', required=True,
help = 'Container ID or method used for fusion. (mav, simple, all). Run brats-orchestra --list to display all options.')
parser.add_argument('-o', '--output',required=True,
help = 'Path to the desired output file.')
parser.add_argument('-v', '--verbose',action='store_true',
help = 'Verbose mode outputs log info to the command line.')
parser.add_argument('-c', '--config',
help = 'Add a path to a custom config file for dockers here.')
parser.add_argument('-g', '--gpu', action='store_true',
help = 'Pass this flag if your Docker version already supports the --gpus flag.')
parser.add_argument('-gi', '--gpuid',
help = 'Specify the GPU bus ID to be used.')
try:
if '-l' in sys.argv[1:] or '--list' in sys.argv[1:]:
list_docker_ids()
sys.exit(0)
elif '-ll' in sys.argv[1:] or '--longlist' in sys.argv[1:]:
list_dockers()
sys.exit(0)
elif '-lg' in sys.argv[1:] or '--gpulist' in sys.argv[1:]:
list_docker_gpu()
sys.exit(0)
elif '-lc' in sys.argv[1:] or '--cpulist' in sys.argv[1:]:
list_docker_cpu()
sys.exit(0)
else:
args = parser.parse_args()
except SystemExit as e:
if e.code == 2:
parser.print_help()
sys.exit(e.code)
try:
# runs the segmentation with all the settings wished for by the user
seg = segmentor.Segmentor(config=args.config, verbose=args.verbose, newdocker=args.gpu, gpu=str(args.gpuid))
seg.segment(t1=args.t1, t1c=args.t1c, t2=args.t2, fla=args.fla, cid=args.docker, outputPath=args.output)
except subprocess.CalledProcessError as e:
# Ignoring errors happening in the Docker Process, otherwise we'd e.g. get error messages on exiting the Docker via CTRL+D.
pass
except Exception as e:
print('ERROR DETAIL: ', e)

def batchpreprocess():
parser = argparse.ArgumentParser(description='Runs the preprocessing for MRI scans on a folder of images.')
parser.add_argument('-i', '--input', required=True, help='The input directory with 4 modalities in unprocessed Nifti format.')
parser.add_argument('-o', '--output',required=True,
help = 'Path to the desired output directory.')
parser.add_argument('-s', '--skipupdate',action='store_true',
help = 'If passed, the backend will not be updated.')
parser.add_argument('-c', '--confirm', action='store_true',
help = 'If passed, the container will ask for confirmation')
parser.add_argument('-g', '--gpu', action='store_true',
help = 'Pass this flag if you want to use GPU computations.')
parser.add_argument('-gi', '--gpuid',
help = 'Specify the GPU bus ID to be used.')
try:
args = parser.parse_args()
except SystemExit as e:
if e.code == 2:
parser.print_help()
sys.exit(e.code)
try:
# runs the preprocessing with all the settings wished for by the user
pre = preprocessor.Preprocessor()
if args.gpu:
mode = "gpu"
else:
mode = "cpu"
if args.gpuid:
gpuid = str(args.gpuid)
else:
gpuid = '0'
pre.batch_preprocess(exam_import_folder=args.input, exam_export_folder=args.output, mode=mode, confirm=args.confirm, skipUpdate=args.skipupdate, gpuid=gpuid)
except subprocess.CalledProcessError as e:
# Ignoring errors happening in the Docker Process, otherwise we'd e.g. get error messages on exiting the Docker via CTRL+D.
pass
except Exception as e:
print('ERROR DETAIL: ', e)

def singlepreprocess():
parser = argparse.ArgumentParser(description='Runs the preprocessing for MRI scans on a single set of images.')
parser.add_argument('-t1',required=True,
help = 'Path to the t1 modality.')
parser.add_argument('-t1c',required=True,
help = 'Path to the t1c modality.')
parser.add_argument('-t2',required=True,
help = 'Path to the t2 modality.')
parser.add_argument('-fla',required=True,
help = 'Path to the fla modality.')
parser.add_argument('-o', '--output',required=True,
help = 'Path to the desired output directory.')
parser.add_argument('-s', '--skipupdate',action='store_true',
help = 'If passed, the backend will not be updated.')
parser.add_argument('-c', '--confirm', action='store_true',
help = 'If passed, the container will ask for confirmation')
parser.add_argument('-g', '--gpu', action='store_true',
help = 'Pass this flag if you want to use GPU computations.')
parser.add_argument('-gi', '--gpuid',
help = 'Specify the GPU bus ID to be used.')
try:
args = parser.parse_args()
except SystemExit as e:
if e.code == 2:
parser.print_help()
sys.exit(e.code)
try:
# runs the preprocessing with all the settings wished for by the user
pre = preprocessor.Preprocessor()
if args.gpu:
mode = "gpu"
else:
mode = "cpu"
if args.gpuid:
gpuid = str(args.gpuid)
else:
gpuid = '0'
pre.single_preprocess(t1File=args.t1, t1cFile=args.t1c, t2File=args.t2, flaFile=args.fla, outputFolder=args.output, mode=mode, confirm=args.confirm, skipUpdate=args.skipupdate, gpuid=gpuid)
except subprocess.CalledProcessError as e:
# Ignoring errors happening in the Docker Process, otherwise we'd e.g. get error messages on exiting the Docker via CTRL+D.
pass
except Exception as e:
print('ERROR DETAIL: ', e)

if __name__ == '__main__':
segmentation()
29 changes: 29 additions & 0 deletions brats_toolkit/config/cpu_dockers.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"econib":{
"name":"econib",
"author":"Michal Marcinkiewicz",
"fileformat":"gz-b17",
"runtime":"runc",
"id":"econib/brats-2018",
"command":" ",
"mountpoint":"/data"
},
"lfb_rwth":{
"name":"lfb_rwth",
"author":"Leon Weninger",
"fileformat":"gz-b17-t1",
"runtime":"runc",
"id":"leonweninger/brats18_segmentation",
"command":" ",
"mountpoint":"/data"
},
"gbmnet":{
"name":"gbmnet",
"author":"Nicholas Nuechterlein",
"fileformat":"gz-b17-t1",
"runtime":"runc",
"id":"nknuecht/gbmnet18",
"command":"python evaluate.py",
"mountpoint":"/data"
}
}
Loading

0 comments on commit 579fad8

Please sign in to comment.