|
| 1 | +import os |
| 2 | +import argparse |
| 3 | +import sys |
| 4 | + |
| 5 | +sys.path.append('..') |
| 6 | + |
| 7 | +from segmentationschool.segmentation_school import run_it |
| 8 | + |
| 9 | + |
| 10 | +def str2bool(v): |
| 11 | + if isinstance(v, bool): |
| 12 | + return v |
| 13 | + if v.lower() in ('yes', 'true', 't', 'y', '1'): |
| 14 | + return True |
| 15 | + elif v.lower() in ('no', 'false', 'f', 'n', '0'): |
| 16 | + return False |
| 17 | + else: |
| 18 | + raise argparse.ArgumentTypeError('Boolean value expected.') |
| 19 | + |
| 20 | + |
| 21 | +if __name__ == '__main__': |
| 22 | + parser = argparse.ArgumentParser() |
| 23 | + |
| 24 | + ##### Main params (MANDITORY) ############################################## |
| 25 | + # School subject |
| 26 | + parser.add_argument('--girderApiUrl', dest='girderApiUrl', default=' ' ,type=str, |
| 27 | + help='girderApiUrl') |
| 28 | + parser.add_argument('--girderToken', dest='girderToken', default=' ' ,type=str, |
| 29 | + help='girderToken') |
| 30 | + parser.add_argument('--files', dest='files', default=' ' ,type=str, |
| 31 | + help='files') |
| 32 | + # option |
| 33 | + parser.add_argument('--option', dest='option', default=' ' ,type=str, |
| 34 | + help='option for [new, train, predict, validate]') |
| 35 | + parser.add_argument('--transfer', dest='transfer', default=' ' ,type=str, |
| 36 | + help='name of project for transfer learning [pulls the newest model]') |
| 37 | + parser.add_argument('--one_network', dest='one_network', default=True ,type=bool, |
| 38 | + help='use only high resolution network for training/prediction/validation') |
| 39 | + parser.add_argument('--target', dest='target', default=None,type=str, |
| 40 | + help='directory with xml transformation targets') |
| 41 | + parser.add_argument('--cortextarget', dest='cortextarget', default=None,type=str, |
| 42 | + help='directory with cortex annotations for splicing') |
| 43 | + parser.add_argument('--output', dest='output', default=None,type=str, |
| 44 | + help='directory to save output transformed XMLs') |
| 45 | + parser.add_argument('--wsis', dest='wsis', default=None,type=str, |
| 46 | + help='directory of WSIs for reference feature extraction') |
| 47 | + parser.add_argument('--groupBy', dest='groupBy', default=None,type=str, |
| 48 | + help='Name for histomicsUI converted annotation group') |
| 49 | + parser.add_argument('--patientData', dest='patientData', default=None,type=str, |
| 50 | + help='Location of excel file containing clinical data on patients') |
| 51 | + parser.add_argument('--labelColumns', dest='labelColumns', default=None,type=str, |
| 52 | + help='Column in excel file to use as label') |
| 53 | + parser.add_argument('--labelModality', dest='labelModality', default=None,type=str, |
| 54 | + help='Column in excel file to use as label') |
| 55 | + parser.add_argument('--IDColumn', dest='IDColumn', default='Label_slides',type=str, |
| 56 | + help='Excel column with file name links') |
| 57 | + parser.add_argument('--plotFill', dest='plotFill', default=True,type=str2bool, |
| 58 | + help='Excel column with file name links') |
| 59 | + parser.add_argument('--scatterFeatures', dest='scatterFeatures', default='5,6',type=str, |
| 60 | + help='Excel column with file name links') |
| 61 | + parser.add_argument('--anchor', dest='anchor', default='Age',type=str, |
| 62 | + help='Biometric link data for scatterplot') |
| 63 | + parser.add_argument('--exceloutfile', dest='exceloutfile', default=None,type=str, |
| 64 | + help='Name of output excel file for feature aggregation') |
| 65 | + |
| 66 | + |
| 67 | +# args.huelabel,args.rowlabel,args.binRows |
| 68 | + parser.add_argument('--SummaryOption', dest='SummaryOption', default=None,type=str, |
| 69 | + help='What type of feature summary to generate, options:\n'+ |
| 70 | + 'BLDensity,ULDensity,UDensity,BDensity,standardScatter,anchorScatter') |
| 71 | + |
| 72 | + # automatically generated |
| 73 | + parser.add_argument('--base_dir', dest='base_dir', default=os.getcwd(),type=str, |
| 74 | + help='base directory of code folder') |
| 75 | + |
| 76 | + parser.add_argument('--code_dir', dest='code_dir', default=os.getcwd(),type=str, |
| 77 | + help='base directory of code folder') |
| 78 | + |
| 79 | + |
| 80 | + ##### Args for training / prediction #################################################### |
| 81 | + parser.add_argument('--gpu_num', dest='gpu_num', default=2 ,type=int, |
| 82 | + help='number of GPUs avalable') |
| 83 | + parser.add_argument('--gpu', dest='gpu', default=0 ,type=int, |
| 84 | + help='GPU to use for prediction') |
| 85 | + parser.add_argument('--iteration', dest='iteration', default='none' ,type=str, |
| 86 | + help='Which iteration to use for prediction') |
| 87 | + parser.add_argument('--prune_HR', dest='prune_HR', default=0.0 ,type=float, |
| 88 | + help='percent of high rez data to be randomly removed [0-1]-->[none-all]') |
| 89 | + parser.add_argument('--prune_LR', dest='prune_LR', default=0.0 ,type=float, |
| 90 | + help='percent of low rez data to be randomly removed [0-1]-->[none-all]') |
| 91 | + parser.add_argument('--classNum', dest='classNum', default=0 ,type=int, |
| 92 | + help='number of classes present in the training data plus one (one class is specified for background)') |
| 93 | + parser.add_argument('--classNum_HR', dest='classNum_HR', default=0 ,type=int, |
| 94 | + help='number of classes present in the High res training data [USE ONLY IF DIFFERENT FROM LOW RES]') |
| 95 | + parser.add_argument('--modelfile', dest='modelfile', default=None ,type=str, |
| 96 | + help='the desired model file to use for training or prediction') |
| 97 | + |
| 98 | + ### Params for cutting wsi ### |
| 99 | + #White level cutoff |
| 100 | + parser.add_argument('--white_percent', dest='white_percent', default=0.01 ,type=float, |
| 101 | + help='white level checkpoint for chopping') |
| 102 | + parser.add_argument('--chop_thumbnail_resolution', dest='chop_thumbnail_resolution', default=16,type=int, |
| 103 | + help='downsample mask to find usable regions') |
| 104 | + #Low resolution parameters |
| 105 | + parser.add_argument('--overlap_percentLR', dest='overlap_percentLR', default=0.5 ,type=float, |
| 106 | + help='overlap percentage of low resolution blocks [0-1]') |
| 107 | + parser.add_argument('--boxSizeLR', dest='boxSizeLR', default=450 ,type=int, |
| 108 | + help='size of low resolution blocks') |
| 109 | + parser.add_argument('--downsampleRateLR', dest='downsampleRateLR', default=16 ,type=int, |
| 110 | + help='reduce image resolution to 1/downsample rate') |
| 111 | + #High resolution parameters |
| 112 | + parser.add_argument('--overlap_percentHR', dest='overlap_percentHR', default=0 ,type=float, |
| 113 | + help='overlap percentage of high resolution blocks [0-1]') |
| 114 | + parser.add_argument('--boxSize', dest='boxSize', default=2048 ,type=int, |
| 115 | + help='size of high resolution blocks') |
| 116 | + parser.add_argument('--downsampleRateHR', dest='downsampleRateHR', default=1 ,type=int, |
| 117 | + help='reduce image resolution to 1/downsample rate') |
| 118 | + parser.add_argument('--training_max_size', dest='training_max_size', default=512 ,type=int, |
| 119 | + help='padded region for low resolution region extraction') |
| 120 | + parser.add_argument('--Mag20X', dest='Mag20X', default=False,type=str2bool, |
| 121 | + help='Perform prediction for 20X (true) slides rather than 40X (false)') |
| 122 | + |
| 123 | + ### Params for augmenting data ### |
| 124 | + #High resolution |
| 125 | + parser.add_argument('--aug_HR', dest='aug_HR', default=3 ,type=int, |
| 126 | + help='augment high resolution set this many magnitudes') |
| 127 | + #Low resolution |
| 128 | + parser.add_argument('--aug_LR', dest='aug_LR', default=15 ,type=int, |
| 129 | + help='augment low resolution set this many magnitudes') |
| 130 | + #Color space transforms |
| 131 | + parser.add_argument('--hbound', dest='hbound', default=0.01 ,type=float, |
| 132 | + help='Gaussian variance defining bounds on Hue shift for HSV color augmentation') |
| 133 | + parser.add_argument('--lbound', dest='lbound', default=0.025 ,type=float, |
| 134 | + help='Gaussian variance defining bounds on L* gamma shift for color augmentation [alters brightness/darkness of image]') |
| 135 | + |
| 136 | + ### Params for training networks ### |
| 137 | + #Low resolution hyperparameters |
| 138 | + parser.add_argument('--CNNbatch_sizeLR', dest='CNNbatch_sizeLR', default=2 ,type=int, |
| 139 | + help='Size of batches for training low resolution CNN') |
| 140 | + #High resolution hyperparameters |
| 141 | + parser.add_argument('--CNNbatch_sizeHR', dest='CNNbatch_sizeHR', default=2 ,type=int, |
| 142 | + help='Size of batches for training high resolution CNN') |
| 143 | + #Hyperparameters |
| 144 | + parser.add_argument('--epoch_LR', dest='epoch_LR', default=1 ,type=int, |
| 145 | + help='training epochs for low resolution network') |
| 146 | + parser.add_argument('--epoch_HR', dest='epoch_HR', default=1 ,type=int, |
| 147 | + help='training epochs for high resolution network') |
| 148 | + parser.add_argument('--saveIntervals', dest='saveIntervals', default=10 ,type=int, |
| 149 | + help='how many checkpoints get saved durring training') |
| 150 | + parser.add_argument('--learning_rate_HR', dest='learning_rate_HR', default=2.5e-4, |
| 151 | + type=float, help='High rez learning rate') |
| 152 | + parser.add_argument('--learning_rate_LR', dest='learning_rate_LR', default=2.5e-4, |
| 153 | + type=float, help='Low rez learning rate') |
| 154 | + parser.add_argument('--chop_data', dest='chop_data', default='false', |
| 155 | + type=str, help='chop and augment new data before training') |
| 156 | + parser.add_argument('--crop_detectron_trainset', dest='crop_detectron_trainset', default=False,type=str2bool, |
| 157 | + help='chop dot based images to this max size') |
| 158 | + parser.add_argument('--predict_data', dest='predict_data', default=True,type=str2bool, |
| 159 | + help='chop dot based images to this max size') |
| 160 | + parser.add_argument('--roi_thresh', dest='roi_thresh', default=0.01,type=float, |
| 161 | + help='chop dot based images to this max size') |
| 162 | + |
| 163 | + ### Params for saving results ### |
| 164 | + parser.add_argument('--outDir', dest='outDir', default='Predictions' ,type=str, |
| 165 | + help='output directory') |
| 166 | + parser.add_argument('--save_outputs', dest='save_outputs', default=False ,type=bool, |
| 167 | + help='save outputs from chopping etc. [final image masks]') |
| 168 | + parser.add_argument('--imBoxExt', dest='imBoxExt', default='.jpeg' ,type=str, |
| 169 | + help='ext of saved image blocks') |
| 170 | + parser.add_argument('--finalImgExt', dest='finalImgExt', default='.jpeg' ,type=str, |
| 171 | + help='ext of final saved images') |
| 172 | + parser.add_argument('--wsi_ext', dest='wsi_ext', default='.svs,.scn,.ndpi' ,type=str, |
| 173 | + help='file ext of wsi images') |
| 174 | + parser.add_argument('--bg_intensity', dest='bg_intensity', default=.5 ,type=float, |
| 175 | + help='if displaying output classifications [save_outputs = True] background color [0-1]') |
| 176 | + parser.add_argument('--approximation_downsample', dest='approx_downsample', default=1 ,type=float, |
| 177 | + help='Amount to downsample high resolution prediction boundaries for smoothing') |
| 178 | + |
| 179 | + |
| 180 | + ### Params for optimizing wsi mask cleanup ### |
| 181 | + parser.add_argument('--min_size', dest='min_size', default=[30,30,30,30,30,30] ,type=int, |
| 182 | + help='min size region to be considered after prepass [in pixels]') |
| 183 | + parser.add_argument('--bordercrop', dest='bordercrop', default=300 ,type=int, |
| 184 | + help='min size region to be considered after prepass [in pixels]') |
| 185 | + parser.add_argument('--LR_region_pad', dest='LR_region_pad', default=50 ,type=int, |
| 186 | + help='padded region for low resolution region extraction') |
| 187 | + parser.add_argument('--show_interstitium', dest='show_interstitium', default=True ,type=str2bool, |
| 188 | + help='padded region for low resolution region extraction') |
| 189 | + |
| 190 | + |
| 191 | + args = parser.parse_args() |
| 192 | + run_it(args) |
0 commit comments