Spaces:
Build error
Build error
| 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() |