import numpy as np import gradio as gr from huggingface_hub import from_pretrained_keras def read_nifti_file(filepath): """Read and load volume""" # Read file scan = nib.load(filepath) # Get raw data scan = scan.get_fdata() return scan def normalize(volume): """Normalize the volume""" min = -1000 max = 400 volume[volume < min] = min volume[volume > max] = max volume = (volume - min) / (max - min) volume = volume.astype("float32") return volume def resize_volume(img): """Resize across z-axis""" # Set the desired depth desired_depth = 64 desired_width = 128 desired_height = 128 # Get current depth current_depth = img.shape[-1] current_width = img.shape[0] current_height = img.shape[1] # Compute depth factor depth = current_depth / desired_depth width = current_width / desired_width height = current_height / desired_height depth_factor = 1 / depth width_factor = 1 / width height_factor = 1 / height # Rotate img = ndimage.rotate(img, 90, reshape=False) # Resize across z-axis img = ndimage.zoom(img, (width_factor, height_factor, depth_factor), order=1) return img def process_scan(path): """Read and resize volume""" # Read scan volume = read_nifti_file(path) # Normalize volume = normalize(volume) # Resize width, height and depth volume = resize_volume(volume) return volume def infer(filename): vol = process_scan(filename.name) vol = np.expand_dims(vol, axis=0) prediction = model.predict(vol)[0] scores = [1 - prediction[0], prediction[0]] class_names = ["normal", "abnormal"] result = [] for score, name in zip(scores, class_names): result = result + [f"This model is {(100 * score):.2f} percent confident that CT scan is {name}"] return result model = from_pretrained_keras('jalFaizy/3D_CNN') filepath = gr.inputs.File() text = gr.outputs.Textbox() iface = gr.Interface( infer, filepath, text, title='3D CNN for CT scans', examples=['example_1_normal.nii.gz'] ) iface.launch()