def segment_3d(model_fname, contrast_type, im): """Perform segmentation with 3D convolutions.""" from spinalcordtoolbox.deepseg_sc.cnn_models_3d import load_trained_model dct_patch_3d = { 't2': { 'size': (48, 48, 48), 'mean': 871.309, 'std': 557.916 }, 't2_ax': { 'size': (48, 48, 48), 'mean': 835.592, 'std': 528.386 }, 't2s': { 'size': (48, 48, 48), 'mean': 1011.31, 'std': 678.985 } } # load 3d model seg_model = load_trained_model(model_fname) out_data = np.zeros(im.data.shape) # segment the spinal cord z_patch_size = dct_patch_3d[contrast_type]['size'][2] z_step_keep = list(range(0, im.data.shape[2], z_patch_size)) for zz in z_step_keep: if zz == z_step_keep[ -1]: # deal with instances where the im.data.shape[2] % patch_size_z != 0 patch_im = np.zeros(dct_patch_3d[contrast_type]['size']) z_patch_extracted = im.data.shape[2] - zz patch_im[:, :, :z_patch_extracted] = im.data[:, :, zz:] else: z_patch_extracted = z_patch_size patch_im = im.data[:, :, zz:z_patch_size + zz] if np.any( patch_im ): # Check if the patch is (not) empty, which could occur after a brain detection. patch_norm = _normalize_data(patch_im, dct_patch_3d[contrast_type]['mean'], dct_patch_3d[contrast_type]['std']) patch_pred_proba = seg_model.predict(np.expand_dims( np.expand_dims(patch_norm, 0), 0), batch_size=BATCH_SIZE) pred_seg_th = (patch_pred_proba > 0.1).astype(int)[0, 0, :, :, :] if zz == z_step_keep[-1]: out_data[:, :, zz:] = pred_seg_th[:, :, :z_patch_extracted] else: out_data[:, :, zz:z_patch_size + zz] = pred_seg_th out = msct_image.zeros_like(im, dtype=np.uint8) out.data = out_data return out.copy()
def segment_3d(model_fname, contrast_type, im): """Perform segmentation with 3D convolutions.""" from spinalcordtoolbox.deepseg_sc.cnn_models_3d import load_trained_model dct_patch_3d = {'t2': {'size': (48, 48, 48), 'mean': 871.309, 'std': 557.916}, 't2_ax': {'size': (48, 48, 48), 'mean': 835.592, 'std': 528.386}, 't2s': {'size': (48, 48, 48), 'mean': 1011.31, 'std': 678.985}} # load 3d model seg_model = load_trained_model(model_fname) out_data = np.zeros(im.data.shape) # segment the spinal cord z_patch_size = dct_patch_3d[contrast_type]['size'][2] z_step_keep = list(range(0, im.data.shape[2], z_patch_size)) for zz in z_step_keep: if zz == z_step_keep[-1]: # deal with instances where the im.data.shape[2] % patch_size_z != 0 patch_im = np.zeros(dct_patch_3d[contrast_type]['size']) z_patch_extracted = im.data.shape[2] - zz patch_im[:, :, :z_patch_extracted] = im.data[:, :, zz:] else: z_patch_extracted = z_patch_size patch_im = im.data[:, :, zz:z_patch_size + zz] if np.any(patch_im): # Check if the patch is (not) empty, which could occur after a brain detection. patch_norm = _normalize_data(patch_im, dct_patch_3d[contrast_type]['mean'], dct_patch_3d[contrast_type]['std']) patch_pred_proba = seg_model.predict(np.expand_dims(np.expand_dims(patch_norm, 0), 0), batch_size=BATCH_SIZE) pred_seg_th = (patch_pred_proba > 0.1).astype(int)[0, 0, :, :, :] if zz == z_step_keep[-1]: out_data[:, :, zz:] = pred_seg_th[:, :, :z_patch_extracted] else: out_data[:, :, zz:z_patch_size + zz] = pred_seg_th out = msct_image.zeros_like(im, dtype=np.uint8) out.data = out_data return out.copy()