#################################################################################################### """ Heatmap assembly ================= After prediction, each patch from a WSI image has one prediction matrix (for example, 14x14). This script is used to put all these small matrix into a big map corresponding to a rectangle tissue region of a WSI image. How to use ---------- The following variables needed to be set: : param Folder_Prediction_Results: the location of the prediction for individual patches : type Folder_Prediction_results: str : param slide_category: the category of the slide, for example, 'tumor', 'normal', 'test' : type slide_category: str : param Folder_Heatmap: the folder to stoe the stitched heatmap : type Folder_Heatmap: str : param Stride: the skipped pixels when prediction, for example, 16, 64 : type Stride: int Note ---- The following files are necessary to perform the task: '/home/weizhe.li/li-code4hpc/pred_dim_0314/training-updated/normal/dimensions', '/home/weizhe.li/li-code4hpc/pred_dim_0314/training-updated/tumor/dimensions', '/home/weizhe.li/li-code4hpc/pred_dim_0314/testing/dimensions' These files store the dimension of the heatmap and location of the heatmap in the WSI image. """ #################################################################################################### import os import os.path as osp import pandas as pd import numpy as np import matplotlib import matplotlib.pyplot as plt import glob #import multiprocess as mlp import re #################################################################################################### def pred_collect(pred_folder): files = glob.glob(osp.join(pred_folder, '*.npy')) files.sort(key=lambda f: int(f.split('_t')[1].split('.')[0])) # create a empty list to store all the small heatmap files (160, 14, 14) list. heat_map = [] for file in files: regions = np.load(file) heat_map.extend(regions) heat_map_array = np.array(heat_map) return heat_map_array def stitch_preded_patches(dim, index, pred_folder, Folder_Heatmap, Stride): """ stitching the prediction based on each small patches to a big heatmap :param dimension_files: a list of all the dimension files for one category of slides, foe example, 'tumor' :type dimension_files: list :param pred_folder: the folder having all the patch prediction results for a single WSI image. :type pred_folder: str :param Folder_Heatmap: the folder to store the big stitched heatmap. :type Folder_Heatmap: str :param stride: the stride during prediction :type stride: int :return: no return :note: two files will saved to the Folder_Heatmap: 1. the stitched heatmap in npy format 2. the heatmap picture in png format """ num_of_pred_per_patch = int(224/Stride) # heat_map_big = np.zeros([dim[7]*num_of_pred_per_patch, dim[8]*num_of_pred_per_patch], dtype=np.float32) # generate a list of all npy files inside one folder. heat_map_array = pred_collect(pred_folder) heat_map_array_iter = iter(heat_map_array) # construct the full heat_map array no_tissue_region = np.zeros([int(224/Stride), int(224/Stride)], dtype = np.float32) # no_tissue_region = np.zeros([12, 12], dtype=np.float32) heat_map_all = [] for _, item in index.iterrows(): if item.is_tissue: patch_pred = next(heat_map_array_iter) heat_map_all.extend(patch_pred) #print(patch_pred) else: heat_map_all.extend(no_tissue_region) heat_map_all = np.array(heat_map_all) print(heat_map_all.shape) # These are critical steps to construct heatmap in a time saving manner. heat_map_reshape = heat_map_all.reshape(dim[7], dim[8], num_of_pred_per_patch, num_of_pred_per_patch) b = heat_map_reshape.transpose((0, 2, 1, 3)) # c = b.reshape(heat_map_big.shape[0], heat_map_big.shape[1]) # c = b.reshape(heat_map_big.shape[0], heat_map_big.shape[1]) c = b.reshape(dim[7]*num_of_pred_per_patch, dim[8]*num_of_pred_per_patch) np.save('%s/%s_oldmodel_test_001n' % (Folder_Heatmap, osp.basename(pred_folder)), c) matplotlib.image.imsave('%s/%s_oldmodel_test_001n.png' % (Folder_Heatmap, osp.basename(pred_folder)), c) if __name__ == "__main__": taskid = int(os.environ['SGE_TASK_ID']) # Here is the folder for prediction results.The prediction results are organized into folders. Each folder corresponds to a WSI image. # Folder_Prediction_Results = '/scratch/mikem/UserSupport/weizhe.li/runs_process_cn_True/normal_wnorm_448_400_7690666' Folder_Prediction_Results = os.environ['Folder_Prediction_Results'] Folder_dimension = os.environ['Folder_dimension'] index_path = os.environ['index_path'] dimension_files = glob.glob(osp.join(Folder_dimension, '*.npy')) dimension_files.sort() print(dimension_files) index_files = glob.glob(osp.join(index_path, '*.pkl')) index_files.sort() # Folder_Heatmap = '/scratch/weizhe.li/heat_map/HPC/test' Folder_Heatmap = os.environ['Folder_Heatmap'] Stride = 16 i = taskid - 1 dir = os.environ['dir'] pred_folder = osp.join(Folder_Prediction_Results, dir, 'preds') dimension_file = dimension_files[i] dimension = np.load(dimension_file) print(dimension[7]) index_file = index_files[i] index = np.load(index_file) print(pred_folder) stitch_preded_patches(dimension, index, pred_folder, Folder_Heatmap, Stride)