def run_inference(model, sess, batch_size, input_dir_path, output_dir_path, num_parallel_calls=1, prob_thres=0.5, eps=64, min_samples=1, isWeightedAvg=False): input_file_paths = [str(f) for f in Path(input_dir_path).glob('*.png')] input_files = np.asarray(input_file_paths, dtype=np.str) input_file_dataset = tf.data.Dataset.from_tensor_slices(input_files) img_dataset = input_file_dataset.map(lambda file: get_image_tf(file), num_parallel_calls=1) img_dataset = img_dataset\ .map(lambda img: normalize(img, "resnet_custom"))\ .batch(batch_size=batch_size) img_iterator = img_dataset.make_one_shot_iterator() next_batch = img_iterator.get_next() prob_result = np.empty((0, 1)) while True: try: img_batch = sess.run(next_batch) pred_np = model.predict(img_batch, batch_size) prob_result = np.concatenate((prob_result, pred_np), axis=0) except tf.errors.OutOfRangeError: print("prediction result size: {}".format(prob_result.shape)) break assert prob_result.shape[0] == input_files.shape[0] mitosis_probs = prob_result[prob_result > prob_thres] input_files = input_files.reshape(-1, 1) mitosis_patch_files = input_files[prob_result > prob_thres] inference_result = [] for i in range(mitosis_patch_files.size): row, col = get_location_from_file_name(mitosis_patch_files[i]) prob = mitosis_probs[i] inference_result.append((row, col, prob)) if len(inference_result) > 0: clustered_pred_locations = dbscan_clustering( inference_result, eps=eps, min_samples=min_samples, isWeightedAvg=isWeightedAvg) tuple_2_csv(inference_result, os.path.join(output_dir_path, 'mitosis_locations.csv')) tuple_2_csv( clustered_pred_locations, os.path.join(output_dir_path, 'clustered_mitosis_locations.csv')) else: print("Do not have mitosis in {}".format(input_dir_path))
def run_mitosis_classification(model, sess, batch_size, input_dir_path, output_dir_path, augmentation_number, mitosis_tile_size=64, num_parallel_calls=1, prefetch=32, prob_thres=0.5, eps=64, min_samples=1, isWeightedAvg=False): input_file_paths = [str(f) for f in Path(input_dir_path).glob('*.png')] input_files = np.asarray(input_file_paths, dtype=np.str) input_file_dataset = tf.data.Dataset.from_tensor_slices(input_files) img_dataset = input_file_dataset.map(lambda file: get_image_tf(file), num_parallel_calls=1) if augmentation_number == 1: img_dataset = img_dataset\ .map(lambda img: normalize(img, "resnet_custom"), num_parallel_calls=num_parallel_calls)\ .batch(batch_size)\ .prefetch(prefetch) # Make sure all the files in the dataset are feeded into inference float_steps = len(input_file_paths) / batch_size int_steps = len(input_file_paths) // batch_size steps = math.ceil(float_steps) if float_steps > int_steps else int_steps else: img_dataset = img_dataset \ .map(lambda img: create_augmented_batch(img, augmentation_number, mitosis_tile_size), num_parallel_calls=num_parallel_calls) \ .map(lambda img: normalize(img, "resnet_custom"), num_parallel_calls=num_parallel_calls) \ .prefetch(prefetch) steps = len(input_file_paths) img_iterator = img_dataset.make_one_shot_iterator() next_batch = img_iterator.get_next() while True: try: pred_np = model.predict(next_batch, steps=steps) print("Prediction result shape: ", pred_np.shape) except tf.errors.OutOfRangeError: print("Please check the steps parameter. steps = {}, " "batch_size = {}, input_tile_size = {}, " "augmentation_number = {}" .format(steps, batch_size, input_files.shape, augmentation_number)) break prob_result = \ np.average(pred_np.reshape(-1, augmentation_number), axis=1) print("Finish the inference on {} with {} input tiles" .format(input_dir_path, prob_result.shape)) assert prob_result.shape[0] == input_files.shape[0] mitosis_probs = prob_result[prob_result > prob_thres] input_files = input_files.reshape(-1, 1) mitosis_patch_files = input_files[prob_result > prob_thres] inference_result = [] for i in range(mitosis_patch_files.size): row, col = get_location_from_file_name(mitosis_patch_files[i]) prob = mitosis_probs[i] inference_result.append((row, col, prob)) if len(inference_result) > 0: clustered_pred_locations = dbscan_clustering( inference_result, eps=eps, min_samples=min_samples, isWeightedAvg=isWeightedAvg) tuple_2_csv( inference_result, os.path.join(output_dir_path, 'mitosis_locations.csv')) tuple_2_csv( clustered_pred_locations, os.path.join(output_dir_path, 'clustered_mitosis_locations.csv')) else: print("Do not have mitosis in {}".format(input_dir_path))