def project_resolved_objects_to_segmentation(meta_folder, ds_name, mc_seg_filepath, mc_seg_key, new_nodes_filepath, save_path, results_name): ds = load_dataset(meta_folder, ds_name) seg_id = 0 mc_segmentation = vigra.readHDF5(mc_seg_filepath, mc_seg_key) # Load resolving result with open(new_nodes_filepath) as f: resolved_objs = pickle.load(f) rag = ds.rag(seg_id) mc_labeling = nrag.gridRagAccumulateLabels(rag, mc_segmentation) new_label_offset = np.max(mc_labeling) + 1 for obj in resolved_objs: resolved_nodes = resolved_objs[obj] for node_id in resolved_nodes: mc_labeling[node_id] = new_label_offset + resolved_nodes[node_id] new_label_offset += np.max(np.array(resolved_nodes.values())) + 1 mc_segmentation = nrag.projectScalarNodeDataToPixels( rag, mc_labeling, ExperimentSettings().n_threads) # Write the result vigra.writeHDF5(mc_segmentation, save_path, results_name, compression='gzip')
def project_new_result(ds_name, meta_folder, new_nodes_filepath, save_path, results_name): ds = load_dataset(meta_folder, ds_name) seg_id = 0 # Load resolving result with open(new_nodes_filepath) as f: new_node_labels = pickle.load(f) # project the result back to the volume mc_seg = ds.project_mc_result(seg_id, new_node_labels) # Write the result vigra.writeHDF5(mc_seg, save_path, results_name, compression='gzip')
def find_false_merges(ds_test_name, ds_train_names, meta_folder, test_seg_path, test_seg_key, train_segs_paths, train_segs_keys): ds_train = [ load_dataset(meta_folder, name) for name in ds_train_names if name != ds_test_name ] ds_test = load_dataset(meta_folder, ds_test_name) # Path folders test_paths_cache_folder = os.path.join(meta_folder, ds_test_name, 'path_data') train_paths_cache_folder = os.path.join(meta_folder, 'train_path_data') # logger.info('Starting compute_false_merges...') _, false_merge_probs, _ = compute_false_merges( ds_train, ds_test, train_segs_paths, train_segs_keys, test_seg_path, test_seg_key, test_paths_cache_folder, train_paths_cache_folder) with open( os.path.join(test_paths_cache_folder, 'false_paths_predictions.pkl'), 'w') as f: pickle.dump(false_merge_probs, f)
def run_lifted_mc(meta_folder, train_folder, ds_train_names, ds_test_name, save_path, results_name, pre_save_path=None): assert os.path.exists(os.path.split( save_path)[0]), "Please choose an existing folder to save your results" merge_segments = True compute_mc = True if os.path.isfile(save_path): # Nothing to do compute_mc = False merge_segments = False else: # Final result needs to be computed if pre_save_path is not None: if os.path.isfile(pre_save_path): compute_mc = False if compute_mc: seg_id = 0 feature_list = ['raw', 'prob', 'reg'] feature_list_lifted = ['cluster', 'reg'] gamma = 2. ds_train = [ load_dataset(train_folder, name) for name in ds_train_names if name != ds_test_name ] ds_test = load_dataset(meta_folder, ds_test_name) mc_nodes, _, _, _ = lifted_multicut_workflow(ds_train, ds_test, seg_id, seg_id, feature_list, feature_list_lifted, gamma=gamma) segmentation = ds_test.project_mc_result(seg_id, mc_nodes) # Save in case sth in the following function goes wrong if pre_save_path is not None: vigra.writeHDF5(segmentation, pre_save_path, results_name, compression='gzip') if merge_segments: if not compute_mc: assert pre_save_path is not None, 'Investigate code, this must not happen!' segmentation = vigra.readHDF5(pre_save_path, results_name) # # Relabel with connected components # segmentation = vigra.analysis.labelVolume(segmentation.astype('uint32')) # Merge small segments segmentation = merge_small_segments(segmentation.astype('uint32'), 100) # Store the final result vigra.writeHDF5(segmentation, save_path, results_name, compression='gzip')
def resolve_false_merges(ds_name, ds_names, meta_folder, rf_cache_folder, new_nodes_filepath, pre_seg_filepath, pre_seg_key, min_prob_thresh, max_prob_thresh, exclude_objs_with_larger_thresh, global_resolve=True): # Path folders paths_cache_folder = os.path.join(meta_folder, ds_name, 'path_data') # TODO Change here weight_filepath = os.path.join( meta_folder, ds_name, 'probs_to_energies_0_z_16.0_0.5_rawprobreg.h5') lifted_filepath = os.path.join(meta_folder, ds_name, 'lifted_probs_to_energies_0_3_0.5_2.0.h5') ds_train = [ load_dataset(meta_folder, name) for name in ds_names if name != ds_name ] rf_cache_name = 'rf_merges_%s' % '_'.join([ds.ds_name for ds in ds_train]) ds = load_dataset(meta_folder, ds_name) seg_id = 0 path_data_filepath = os.path.join(paths_cache_folder, 'paths_ds_{}.h5'.format(ds_name)) # with open(os.path.join(paths_cache_folder, 'paths_ds_{}.pkl'.format(ds_name))) as f: # path_data = pickle.load(f) paths = vigra.readHDF5(path_data_filepath, 'all_paths') if paths.size: paths = np.array([path.reshape((len(path) / 3, 3)) for path in paths]) paths_to_objs = vigra.readHDF5(path_data_filepath, 'paths_to_objs') with open(os.path.join(paths_cache_folder, 'false_paths_predictions.pkl')) as f: false_merge_probs = pickle.load(f) # Find objects where probability >= min_prob_thresh and <= max_prob_thresh objs_with_prob_greater_thresh = np.unique( np.array(paths_to_objs)[np.logical_and( false_merge_probs >= min_prob_thresh, false_merge_probs <= max_prob_thresh)]) if exclude_objs_with_larger_thresh: objs_to_exclude = np.unique( np.array(paths_to_objs)[false_merge_probs > max_prob_thresh]) objs_with_prob_greater_thresh = np.setdiff1d( objs_with_prob_greater_thresh, objs_to_exclude) # Extract all paths for each of the found objects false_paths = {} for obj in objs_with_prob_greater_thresh: # print paths_to_objs == obj false_paths[obj] = np.array(paths)[paths_to_objs == obj] rf_filepath = os.path.join(rf_cache_folder, rf_cache_name) # with open(rf_filepath) as f: # path_rf = pickle.load(f) path_rf = RandomForest.load_from_file(rf_filepath, 'rf', ExperimentSettings().n_threads) mc_segmentation = vigra.readHDF5(pre_seg_filepath, pre_seg_key) mc_weights_all = vigra.readHDF5(weight_filepath, "data") lifted_weights_all = vigra.readHDF5(lifted_filepath, "data") if global_resolve: new_node_labels = resolve_merges_with_lifted_edges_global( ds, seg_id, false_paths, path_rf, mc_segmentation, mc_weights_all, paths_cache_folder=paths_cache_folder, lifted_weights_all=lifted_weights_all) else: new_node_labels = resolve_merges_with_lifted_edges( ds, ds_train, seg_id, false_paths, path_rf, mc_segmentation, mc_weights_all, paths_cache_folder=paths_cache_folder, lifted_weights_all=lifted_weights_all) with open(new_nodes_filepath, 'w') as f: pickle.dump(new_node_labels, f)