import streamlit as st import tensorflow as tf import cv2 import numpy as np from patchify import patchify from huggingface_hub import from_pretrained_keras model = from_pretrained_keras('ErnestBeckham/MulticancerViT') hp = {} hp['image_size'] = 512 hp['num_channels'] = 3 hp['patch_size'] = 64 hp['num_patches'] = (hp['image_size']**2) // (hp["patch_size"]**2) hp["flat_patches_shape"] = (hp["num_patches"], hp['patch_size']*hp['patch_size']*hp["num_channels"]) hp['class_names'] = ['cervix_koc', 'cervix_dyk', 'cervix_pab', 'cervix_sfi', 'cervix_mep', 'colon_bnt', 'colon_aca', 'lung_aca', 'lung_bnt', 'lung_scc', 'oral_scc', 'oral_normal', 'kidney_tumor', 'kidney_normal', 'breast_benign', 'breast_malignant', 'lymph_fl', 'lymph_cll', 'lymph_mcl', 'brain_tumor', 'brain_glioma', 'brain_menin'] def main(): st.title("Multi-Cancer Classification") # Upload image through drag and drop uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"]) if uploaded_file is not None: # Convert the uploaded file to OpenCV format image = convert_to_opencv(uploaded_file) # Display the uploaded image st.image(image, channels="BGR", caption="Uploaded Image", use_column_width=True) # Display the image shape image_class = predict_single_image(image, model, hp) st.write(f"Image Class: {image_class}") def convert_to_opencv(uploaded_file): # Read the uploaded file using OpenCV image_bytes = uploaded_file.read() np_arr = np.frombuffer(image_bytes, np.uint8) image = cv2.imdecode(np_arr, cv2.IMREAD_COLOR) return image def detect_image_shape(image): # Get the image shape return image.shape def preprocess_image(image, hp): # Resize the image to the expected input size image = cv2.resize(image, (hp['image_size'], hp['image_size'])) # Normalize pixel values to be in the range [0, 1] image = image / 255.0 # Extract patches using the same patching mechanism as during training patch_shape = (hp['patch_size'], hp['patch_size'], hp['num_channels']) patches = patchify(image, patch_shape, hp['patch_size']) # Flatten the patches patches = np.reshape(patches, hp['flat_patches_shape']) # Convert the flattened patches into a format suitable for prediction patches = patches.astype(np.float32) return patches def predict_single_image(image, model, hp): # Preprocess the image preprocessed_image = preprocess_image(image, hp) # Convert the preprocessed image to a TensorFlow tensor if needed preprocessed_image = tf.convert_to_tensor(preprocessed_image) # Add an extra batch dimension (required for model.predict) preprocessed_image = tf.expand_dims(preprocessed_image, axis=0) # Make the prediction predictions = model.predict(preprocessed_image) np.around(predictions) y_pred_classes = np.argmax(predictions, axis=1) class_name = hp['class_names'][y_pred_classes[0]] return class_name if __name__ == "__main__": main()