def test_trainin_kidney_from_pklz(self): sample_data_path = lisa.dataset.join_sdp("kidney_training/") test_data = lisa.dataset.join_sdp("kidney_training/liver-orig001.mhd.pklz") label = "left kidney" organ_model.train_organ_model_from_dir( "left_kidney.ol.p", reference_dir=sample_data_path, orig_pattern="*orig*.pklz", ref_pattern="*orig*.pklz", label=label, segmentation_key=True ) ol = organ_localizator.OrganLocalizator() ol.load("left_kidney.ol.p") dr = io3d.DataReader() data3d, metadata = dr.Get3DData(test_data) out = ol.predict(data3d, metadata['voxelsize_mm']) seg = (metadata["segmentation"] == metadata['slab'][label]).astype(np.int8) err = np.sum(np.abs(seg-out)) import sed3 sed3.show_slices(out-seg, out-seg, slice_step=20) # self.assertEqual(True, False) # less then 10% error expected self.assertGreater(np.prod(seg.shape)*0.1, err)
def test_import(): # io3d.read() data3d_orig = io3d.read_dataset("3Dircadb1", "data3d", 1, orientation_axcodes="SPL") bp = bpo.BodyPosition(data3d_orig['data3d'], data3d_orig['voxelsize_mm']) sed3.show_slices(np.asarray(data3d_orig['data3d'][0:-1]), slice_step=10, axis=0) sdf = bp.dist_to_lungs() assert np.max(sdf) > 0 assert np.min(sdf) < 0 im_volume_px = np.prod(data3d_orig['data3d'].shape) sed3.show_slices(np.asarray(data3d_orig['data3d'][0:-1]), np.asarray(sdf[0:-1] > 0), slice_step=10, axis=0) organ_volume_px = np.sum(sdf >= 0) logger.debug(im_volume_px) logger.debug(organ_volume_px) assert organ_volume_px > (im_volume_px * 0.03)
def test_trainin_kidney_from_pklz(self): sample_data_path = lisa.dataset.join_sdp("kidney_training/") test_data = lisa.dataset.join_sdp( "kidney_training/liver-orig001.mhd.pklz") label = "left kidney" organ_model.train_organ_model_from_dir("left_kidney.ol.p", reference_dir=sample_data_path, orig_pattern="*orig*.pklz", ref_pattern="*orig*.pklz", label=label, segmentation_key=True) ol = organ_localizator.OrganLocalizator() ol.load("left_kidney.ol.p") dr = io3d.DataReader() data3d, metadata = dr.Get3DData(test_data) out = ol.predict(data3d, metadata['voxelsize_mm']) seg = (metadata["segmentation"] == metadata['slab'][label]).astype( np.int8) err = np.sum(np.abs(seg - out)) import sed3 sed3.show_slices(out - seg, out - seg, slice_step=20) # self.assertEqual(True, False) # less then 10% error expected self.assertGreater(np.prod(seg.shape) * 0.1, err)
def visualize(seg, data3d_orig): """Show segmentation on original data using sed3 visualizer. Args: seg: data after segmentation data3d_orig: orig data """ sed3.show_slices(data3d_orig["data3d"], seg, slice_step=10, axis=0) plt.show()
def test_first_slice_offset(self): import sed3 img, seeds, segmentation = self.create_data() sed3.show_slices(img, seeds=seeds, contour=segmentation, slice_step=5, first_slice_offset_to_see_seed_with_label=1, show=False)
def print_it_all_front(self, ss, data3dr_tmp, seg, pattern): """ Vykresli jednotlive rezy v danem smeru (axis) do sed3.show_slices() vstupuji: - obrazek pro danou instanci Bona (surovy obrazek), ktery zpracovavame - obrazek seg - vysledek segmentace, tedy vystup metody get_ribs(lungs, ...)) - dalsi parametry jako jsou krok po rezech, osa, atd.""" fig = plt.figure(figsize=(25, 25)) sed3.show_slices( data3dr_tmp, # vychozi obrazek seg.astype(np.int8), slice_step=10, axis=1, flipV=True, flipH=False)
def print_it_all_front(self, ss, data3dr_tmp, seg, pattern): """ Vykresli jednotlive rezy v danem smeru (axis) do sed3.show_slices() vstupuji: - obrazek pro danou instanci Bona (surovy obrazek), ktery zpracovavame - obrazek seg - vysledek segmentace, tedy vystup metody get_ribs(lungs, ...)) - dalsi parametry jako jsou krok po rezech, osa, atd.""" import sed3 fig = plt.figure(figsize = (25,25)) sed3.show_slices( data3dr_tmp, # vychozi obrazek seg.astype(np.int8), slice_step=10, axis=1, flipV=True, flipH=False )
def test_first_slice_offset_interactive(self): """ set offset to see seed with defined label :return: """ import sed3 img, seeds, segmentation = self.create_data() seeds[6:9, 10, 1:5] = 3 seeds[7:9, 11, 8:14] = 4 ed = sed3.show_slices(img, seeds=seeds, contour=segmentation, slice_step=5, first_slice_offset_to_see_seed_with_label=1)
def test_intensity_training(self): # TODO use ircad sliver_reference_dir = op.expanduser("~/data/medical/orig/sliver07/training/") # Train import imtools.trainer3d import imtools.datasets ol = imtools.trainer3d.Trainer3D() # ol.feature_function = localization_fv for one in imtools.datasets.sliver_reader("*[0].mhd", read_seg=True): numeric_label, vs_mm, oname, orig_data, rname, ref_data = one ol.add_train_data(orig_data, ref_data, voxelsize_mm=vs_mm) ol.fit() # Testing one = list(imtools.datasets.sliver_reader("*018.mhd", read_seg=True))[0] numeric_label, vs_mm, oname, orig_data, rname, ref_data = one fit = ol.predict(orig_data, voxelsize_mm=vs_mm) # visualization plt.figure(figsize=(15,10)) sed3.show_slices(orig_data, fit, slice_step=20, axis=1, flipV=True)
def model_score_from_sliver_data( # output_file="~/lisa_data/liver_intensity.Model.p", sliver_reference_dir='~/data/medical/orig/sliver07/training/', orig_pattern="*orig*[1-9].mhd", ref_pattern="*seg*[1-9].mhd", modelparams={}, likelihood_ratio=0.5, savefig=False, savefig_fn_prefix='../graphics/bn-symmetry-', show=False, label='', ): """ :param label: text label added to all records in output table :param sliver_reference_dir: :param orig_pattern: :param ref_pattern: :param modelparams: :param likelihood_ratio: float number between 0 and 1, scalar or list. Set the segmentation threshodl :param savefig: :param savefig_fn_prefix: :param show: show images :return: """ import pandas as pd from imcut import pycut import sed3 import matplotlib.pyplot as plt import volumetry_evaluation sliver_reference_dir = op.expanduser(sliver_reference_dir) orig_fnames = glob.glob(sliver_reference_dir + orig_pattern) ref_fnames = glob.glob(sliver_reference_dir + ref_pattern) orig_fnames.sort() ref_fnames.sort() evaluation_all = [] for oname, rname in zip(orig_fnames, ref_fnames): print(oname) data3d_orig, metadata = io3d.datareader.read(oname, dataplus_format=False) vs_mm1 = metadata['voxelsize_mm'] data3d_seg, metadata = io3d.datareader.read(rname, dataplus_format=False) vs_mm = metadata['voxelsize_mm'] mdl = pycut.Model(modelparams=modelparams) # m0 = mdl.mdl[2] # len(m0.means_) vs_mmr = [1.5, 1.5, 1.5] data3dr = io3d.misc.resize_to_mm(data3d_orig, vs_mm1, vs_mmr) lik1 = mdl.likelihood_from_image(data3dr, vs_mmr, 0) lik2 = mdl.likelihood_from_image(data3dr, vs_mmr, 1) if np.isscalar(likelihood_ratio): likelihood_ratio = [likelihood_ratio] for likelihood_ratio_i in likelihood_ratio: if (likelihood_ratio_i <= 0) or (likelihood_ratio_i >= 1.0): logger.error("likelihood ratio should be between 0 and 1") seg = ((likelihood_ratio_i * lik1) > ((1.0 - likelihood_ratio_i) * lik2)).astype(np.uint8) # seg = (lik1).astype(np.uint8) seg_orig = io3d.misc.resize_to_shape(seg, data3d_orig.shape) # seg_orig = io3d.misc.resize_to_shape(seg, data3d_orig.shape) if show: plt.figure(figsize=(15, 15)) sed3.show_slices(data3d_orig, seg_orig, show=False, slice_step=20) # likres = io3d.misc.resize_to_shape(lik1, data3d_orig.shape) # sed3.show_slices(likres , seg_orig, show=False, slice_step=20) import re numeric_label = re.search(".*g(\d+)", oname).group(1) # plt.figure(figsize = (5,5)) if savefig: plt.axis('off') # plt.imshow(symmetry_img) filename = savefig_fn_prefix + numeric_label + '-lr-' + str( likelihood_ratio_i) + ".png" # if np.isscalar(likelihood_ratio): # filename = filename + ''+str plt.savefig(filename, bbox_inches='tight') evaluation = volumetry_evaluation.compare_volumes_sliver( seg_orig, data3d_seg, vs_mm) evaluation['likelihood_ratio'] = likelihood_ratio_i evaluation['numeric_label'] = numeric_label evaluation['label'] = label evaluation_all.append(evaluation) # print evaluation ev = pd.DataFrame(evaluation_all) return ev
def test( imshape=256, # sdf_type='diaphragm_axial', # sdf_type='coronal', # sdf_type='sagittal', sdf_type='surface', # sdf_type='bones', # sdf_type='fatless', # sdf_type='liver', # sdf_type='spleen', # sdf_type='lungs', filename_prefix='final_', test_ids=[20, 40], ): """Evaluates a U-net NN with test data loaded from a .h5 file. Args: imshape (int, optional): Shape of dataset's images. Defaults to 256. sdf_type (str, optional): Type of sdf method we train. Can be: sagittal, coronal, surface, liver, spleen, lungs, bones, fatless or diaphragm_axial. filename_prefix (str, optional): Option to add a prefix to create new files when testing. Defaults to ''. test_ids (list, optional): Test data scans' indexes in the dataset. Defaults to [20, 40]. """ model = load_model(f"{filename_prefix}sdf_unet_{sdf_type}.h5") # import visualkeras # visualkeras.graph_view(model, to_file='output.png') for i in range(len(test_ids)): X_test = [] Y_test = [] #Loading test data with h5py.File(f'sdf_{sdf_type}{imshape}.h5', 'r') as h5f: logger.info('Loading...') X_test.extend(np.asarray(h5f[f'scan_{i}'])) Y_test.extend(np.asarray(h5f[f'label_{i}'])) logger.info(F'Scan {test_ids[i]} loaded') # Reshaping X_test = np.asarray(X_test).reshape( np.asarray(X_test).shape[0], 256, 256, 1) Y_test = np.asarray(Y_test).reshape( np.asarray(Y_test).shape[0], 256, 256, 1) # Predictions predictions = model.predict(X_test) # Visualization X_test = np.asarray(X_test).reshape( np.asarray(X_test).shape[0], 256, 256) predictions = np.asarray(predictions).reshape( np.asarray(predictions).shape[0], 256, 256) Y_test = np.asarray(Y_test).reshape( np.asarray(Y_test).shape[0], 256, 256) plt.plot(Y_test[20]) plt.contour(Y_test[20] > 0) plt.colorbar() plt.show() plt.imshow(predictions[20]) plt.contour(predictions[20] > 0) plt.show() sed3.show_slices(np.asarray(X_test[0:-1]), np.asarray(Y_test[0:-1]), slice_step=10, axis=0) sed3.show_slices(np.asarray(X_test[0:-1]), np.asarray(predictions[0:-1]), slice_step=10, axis=0)
organ_label = "rightkidney" show = False # %% dtstr = datetime.datetime.now().strftime("%Y%m%d_%H%M") rdir = f"report_{experiment_label}_{dtstr}" report = exsu.Report(outputdir=rdir, show=show, additional_spreadsheet_fn="data.xlsx") reporti = 0 # %% datap1 = io3d.datasets.read_dataset("3Dircadb1", "data3d", 1) # datap1 = io3d.datasets.read_dataset("sliver07", "data3d", 1) data3d = datap1["data3d"] sed3.show_slices(data3d, shape=[2, 3], show=show) report.savefig(f"{reporti:03d}.png") reporti += 1 # %% datap_mask = io3d.datasets.read_dataset("3Dircadb1", organ_label, 1) data3d_mask = datap_mask["data3d"] sed3.show_slices(data3d_mask, shape=[2, 3], show=show) report.savefig(f"{reporti:03d}.png") reporti += 1 # plt.figure() # %% md ## windowing
def model_score_from_sliver_data( # output_file="~/lisa_data/liver_intensity.Model.p", sliver_reference_dir='~/data/medical/orig/sliver07/training/', orig_pattern="*orig*[1-9].mhd", ref_pattern="*seg*[1-9].mhd", modelparams={}, likelihood_ratio=0.5, savefig=False, savefig_fn_prefix='../graphics/bn-symmetry-', show=False, label='', ): """ :param label: text label added to all records in output table :param sliver_reference_dir: :param orig_pattern: :param ref_pattern: :param modelparams: :param likelihood_ratio: float number between 0 and 1, scalar or list. Set the segmentation threshodl :param savefig: :param savefig_fn_prefix: :param show: show images :return: """ import pandas as pd from imcut import pycut import sed3 import matplotlib.pyplot as plt import volumetry_evaluation sliver_reference_dir = op.expanduser(sliver_reference_dir) orig_fnames = glob.glob(sliver_reference_dir + orig_pattern) ref_fnames = glob.glob(sliver_reference_dir + ref_pattern) orig_fnames.sort() ref_fnames.sort() evaluation_all = [] for oname, rname in zip(orig_fnames, ref_fnames): print(oname) data3d_orig, metadata = io3d.datareader.read(oname, dataplus_format=False) vs_mm1 = metadata['voxelsize_mm'] data3d_seg, metadata = io3d.datareader.read(rname, dataplus_format=False) vs_mm = metadata['voxelsize_mm'] mdl = pycut.Model(modelparams=modelparams) # m0 = mdl.mdl[2] # len(m0.means_) vs_mmr = [1.5, 1.5, 1.5] data3dr = io3d.misc.resize_to_mm(data3d_orig, vs_mm1, vs_mmr) lik1 = mdl.likelihood_from_image(data3dr, vs_mmr, 0) lik2 = mdl.likelihood_from_image(data3dr, vs_mmr, 1) if np.isscalar(likelihood_ratio): likelihood_ratio = [likelihood_ratio] for likelihood_ratio_i in likelihood_ratio: if (likelihood_ratio_i <= 0) or (likelihood_ratio_i >= 1.0): logger.error("likelihood ratio should be between 0 and 1") seg = ((likelihood_ratio_i * lik1) > ((1.0 - likelihood_ratio_i) * lik2)).astype(np.uint8) # seg = (lik1).astype(np.uint8) seg_orig = io3d.misc.resize_to_shape(seg, data3d_orig.shape) # seg_orig = io3d.misc.resize_to_shape(seg, data3d_orig.shape) if show: plt.figure(figsize = (15,15)) sed3.show_slices(data3d_orig , seg_orig, show=False, slice_step=20) # likres = io3d.misc.resize_to_shape(lik1, data3d_orig.shape) # sed3.show_slices(likres , seg_orig, show=False, slice_step=20) import re numeric_label = re.search(".*g(\d+)", oname).group(1) # plt.figure(figsize = (5,5)) if savefig: plt.axis('off') # plt.imshow(symmetry_img) filename = savefig_fn_prefix + numeric_label + '-lr-' + str(likelihood_ratio_i) + ".png" # if np.isscalar(likelihood_ratio): # filename = filename + ''+str plt.savefig(filename, bbox_inches='tight') evaluation = volumetry_evaluation.compare_volumes_sliver(seg_orig, data3d_seg, vs_mm) evaluation['likelihood_ratio'] = likelihood_ratio_i evaluation['numeric_label'] = numeric_label evaluation['label'] = label evaluation_all.append(evaluation) # print evaluation ev = pd.DataFrame(evaluation_all) return ev
def compare( imshape=256, # sdf_type='coronal', # sdf_type='sagittal', # sdf_type='surface', # sdf_type='bones', # sdf_type='fatless', sdf_type='liver', # sdf_type='spleen', # sdf_type='lungs', dataset = "3Dircadb1", scannum = 20, ): """Compare bodyposition and bodynavigation. Args: imshape (int, optional): Shape of dataset's images. Defaults to 256. sdf_type (str, optional): Type of sdf method. Can be: sagittal, coronal, surface, liver, spleen, lungs, bones, fatless or diaphragm_axial. dataset (string): "3Dircadb1" or "sliver07" scannum (int): Number of the scan this loads """ import bodynavigation from bodynavigation.organ_detection import OrganDetection import bodyposition pth = Path(__file__).parent.parent outputdir = pth / "experiments/" commonsheet = outputdir / "experiments.xlsx" report = exsu.report.Report(outputdir=outputdir, additional_spreadsheet_fn=commonsheet, check_version_of=["numpy", "scipy"]) organ_detection_on = False if sdf_type == "liver" or sdf_type == "spleen" or sdf_type == "lungs" or sdf_type == "fatless" or sdf_type == "bones": organ_detection_on = True data3d_orig = io3d.read_dataset(dataset, "data3d", scannum, orientation_axcodes='SPL') voxelsize = data3d_orig["voxelsize_mm"] # BODYNAVIGATION start_time = time.time() if not organ_detection_on: ss = bodynavigation.body_navigation.BodyNavigation(data3d_orig["data3d"], data3d_orig["voxelsize_mm"]) sdf_bodynavigation = eval(f"ss.dist_to_{sdf_type}()") else: od = OrganDetection(data3d_orig["data3d"], voxelsize) if sdf_type == "liver": st = "Liver" if sdf_type == "spleen": st = "Spleen" if sdf_type == "lungs": st = "Lungs" if sdf_type == "fatless": st = "FatlessBody" if sdf_type == "bones": st = "Bones" sdf_bodynavigation = eval(f"od.get{st}()") time_bodynavigation = time.time() - start_time sed3.show_slices(np.asarray(data3d_orig["data3d"][0:-1]), np.asarray(sdf_bodynavigation[0:-1]), axis=0) # BODYPOSITION start_time = time.time() bpo = bodyposition.BodyPosition(data3d_orig["data3d"], data3d_orig['voxelsize_mm']) sdf_bodyposition = eval(f"bpo.dist_to_{sdf_type}()") time_bodyposition = time.time() - start_time sed3.show_slices(np.asarray(data3d_orig["data3d"][0:-1]), np.asarray(sdf_bodyposition[0:-1]), axis=0) # EVALUATION AND REPORT SAVING evaluation = compare_volumes(sdf_bodynavigation, sdf_bodyposition, voxelsize_mm=voxelsize) # logger.info(evaluation) report.add_cols_to_actual_row({ "sdf type": sdf_type, "dataset": dataset, "scannum": scannum, "datetime": time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time())), "time_bodynavigation": time_bodynavigation, "time_bodyposition": time_bodyposition, }) report.add_cols_to_actual_row(evaluation) report.finish_actual_row() report.dump() logger.info(f"Report finished - scan {scannum} (from {dataset}), {sdf_type} segmentation - BN {round(time_bodynavigation)} s, BP {round(time_bodyposition)} s")
def main(): #logger = logging.getLogger(__name__) logger = logging.getLogger() logger.setLevel(logging.WARNING) ch = logging.StreamHandler() logger.addHandler(ch) #logger.debug('input params') # input parser parser = argparse.ArgumentParser(description= 'Segmentation of bones, lungs and heart.') parser.add_argument('-i','--datadir', default=None, help='path to data dir') parser.add_argument('-o','--output', default=None, help='output file') parser.add_argument('-d', '--debug', action='store_true', help='run in debug mode') parser.add_argument('-ss', '--segspine', action='store_true', help='run spine segmentaiton') parser.add_argument('-sb', '--segbody', action='store_true', help='run body segmentaiton') parser.add_argument('-exd', '--exampledata', action='store_true', help='run unittest') parser.add_argument('-so', '--show_output', action='store_true', help='Show output data in viewer') args = parser.parse_args() if args.debug: logger.setLevel(logging.DEBUG) if args.exampledata: args.dcmdir = '../sample_data/liver-orig001.raw' # if dcmdir == None: #else: #dcm_read_from_dir('/home/mjirik/data/medical/data_orig/46328096/') #data3d, metadata = dcmr.dcm_read_from_dir(args.dcmdir) import io3d data3d , metadata = io3d.datareader.read(args.datadir) bn = BodyNavigation(data3d = data3d, voxelsize_mm = metadata['voxelsize_mm'], ) seg = np.zeros(data3d.shape, dtype=np.int8) #sseg.orientation() if args.segspine: seg += bn.get_spine() if args.segspine: seg += bn.get_body() #print ("Data size: " + str(data3d.nbytes) + ', shape: ' + str(data3d.shape) ) #igc = pycut.ImageGraphCut(data3d, zoom = 0.5) #igc.interactivity() #igc.make_gc() #igc.show_segmentation() # volume #volume_mm3 = np.sum(oseg.segmentation > 0) * np.prod(oseg.voxelsize_mm) #pyed = sed3.sed3(oseg.data3d, contour = oseg.segmentation) #pyed.show() if args.show_output: import sed3 sed3.show_slices(data3d, contour=seg) #savestring = raw_input ('Save output data? (y/n): ') #sn = int(snstring) if args.output is not None: # savestring in ['Y','y']: md = { 'voxelsize_mm': metadata['voxelsize_mm'], 'segmentation': seg, } io3d.write(data3d, args.output, metadata=md)
def test_show_slices(self): import sed3 img, seeds, segmentation = self.create_data() sed3.show_slices(img, seeds=seeds, contour=segmentation, show=False)
import numpy as np import io3d import sed3 import bodyposition as bpo print(bpo.__file__) data3d_orig = io3d.read_dataset("3Dircadb1", "data3d", 1) bp = bpo.BodyPosition(data3d_orig['data3d'], data3d_orig['voxelsize_mm']) sdf_surface = bp.dist_to_surface() sed3.show_slices(np.asarray(data3d_orig['data3d'][0:-1]), np.asarray(sdf_surface[0:-1]), slice_step=10, axis=0)
def make_image_processing(data, voxelsize_mm, seeds=None, sigma_mm=1, min_threshold=None, max_threshold=None, closeNum=0, openNum=0, min_threshold_auto_method="", fill_holes=True, get_priority_objects=True, nObj=1, debug=False): if (sys.version_info[0] < 3): import copy data_copy = copy.copy(data) else: data_copy = data.copy() if sigma_mm > 0: sigmaNew = thresholding_functions.calculateSigma( voxelsize_mm, sigma_mm) data_copy = thresholding_functions.gaussFilter(data_copy, sigmaNew) del (sigmaNew) if debug: import sed3 # ed = sed3.sed3qt(data_copy) sed3.show_slices(data_copy, shape=[6, 9]) # ed.show() if min_threshold is None: min_threshold = prepare_threshold_from_seeds( data=data_copy, seeds=seeds, min_threshold_auto_method=min_threshold_auto_method) data_thr = thresholding_functions.thresholding( data_copy, min_threshold, max_threshold, use_min_threshold=True, use_max_threshold=max_threshold is not None) if debug: logger.debug("np min median max input data " + str(np.min(data_copy)) + " " + str(np.median(data_copy)) + " " + str(np.max(data_copy)) + " ") if debug: logger.debug("np unique sum binar " + str(np.unique(data_thr)) + " " + str(np.sum(data_thr)) + " ") data_thr = thresholding_functions.binaryClosingOpening( data_thr, closeNum, openNum, True) # Fill holes if fill_holes: data_thr = thresholding_functions.fillHoles(data_thr) # use a wall for label 2 if type(seeds) is np.ndarray: data_thr[seeds == 2] = 0 # Zjisteni nejvetsich objektu. if get_priority_objects: if seeds is not None: selected_seeds = seeds == 1 else: selected_seeds = seeds data_thr = thresholding_functions.get_priority_objects( data_thr, nObj, selected_seeds) if debug: logger.debug("np unique sum binar hist end " + str(np.unique(data_thr)) + " " + str(np.sum(data_thr)) + " " # + str(np.histogram(data_thr, bins="auto")) + " " ) return data_thr, min_threshold