# Install required packages #!pip install gradio tensorflow opencv-python scikit-learn import gradio as gr import tensorflow as tf import numpy as np import cv2 from tensorflow.keras.applications import ResNet50 from tensorflow.keras.applications.resnet50 import preprocess_input from tensorflow.keras.preprocessing.image import img_to_array from sklearn.preprocessing import StandardScaler import pandas as pd class SurgicalAssistSystem: def __init__(self): # Initialize the image processing model (ResNet50 pretrained) self.image_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) # Initialize scaler for vital signs self.scaler = StandardScaler() # Define normal ranges for vital signs self.vital_ranges = { 'heart_rate': (60, 100), 'blood_pressure_systolic': (90, 140), 'blood_pressure_diastolic': (60, 90), 'oxygen_saturation': (95, 100), 'temperature': (36.5, 37.5) } def preprocess_image(self, image): # Resize image to expected dimensions image = cv2.resize(image, (224, 224)) image = img_to_array(image) image = np.expand_dims(image, axis=0) image = preprocess_input(image) return image def analyze_image(self, image): # Preprocess and analyze the image processed_image = self.preprocess_image(image) features = self.image_model.predict(processed_image) # Simplified analysis - detecting potential anomalies feature_mean = np.mean(features) if feature_mean > 0.5: return "Potential anomaly detected in the surgical field" else: return "No immediate concerns in the surgical field" def analyze_vitals(self, vitals_dict): alerts = [] for vital, value in vitals_dict.items(): if vital in self.vital_ranges: min_val, max_val = self.vital_ranges[vital] if value < min_val: alerts.append(f"Warning: {vital} is below normal range") elif value > max_val: alerts.append(f"Warning: {vital} is above normal range") if not alerts: return "All vital signs are within normal ranges" return "\n".join(alerts) def generate_recommendations(self, image_analysis, vitals_analysis): recommendations = [] if "anomaly" in image_analysis.lower(): recommendations.append("- Recommend detailed inspection of highlighted area") recommendations.append("- Consider additional imaging") if "warning" in vitals_analysis.lower(): recommendations.append("- Monitor vital signs closely") recommendations.append("- Consider adjusting procedure parameters") if not recommendations: recommendations.append("- Proceed with standard protocol") recommendations.append("- Continue routine monitoring") return "\n".join(recommendations) # Initialize the system system = SurgicalAssistSystem() def process_surgical_data(image, heart_rate, blood_pressure_systolic, blood_pressure_diastolic, oxygen_saturation, temperature): # Convert image to numpy array if it's not already if isinstance(image, str): return "Please provide a valid image" # Create vitals dictionary vitals = { 'heart_rate': heart_rate, 'blood_pressure_systolic': blood_pressure_systolic, 'blood_pressure_diastolic': blood_pressure_diastolic, 'oxygen_saturation': oxygen_saturation, 'temperature': temperature } # Analyze image and vitals image_analysis = system.analyze_image(image) vitals_analysis = system.analyze_vitals(vitals) recommendations = system.generate_recommendations(image_analysis, vitals_analysis) return (f"Image Analysis:\n{image_analysis}\n\n" f"Vitals Analysis:\n{vitals_analysis}\n\n" f"Recommendations:\n{recommendations}") # Create Gradio interface iface = gr.Interface( fn=process_surgical_data, inputs=[ gr.Image(label="Surgical Field Image"), gr.Number(label="Heart Rate (bpm)"), gr.Number(label="Blood Pressure - Systolic (mmHg)"), gr.Number(label="Blood Pressure - Diastolic (mmHg)"), gr.Number(label="Oxygen Saturation (%)"), gr.Number(label="Temperature (°C)") ], outputs=gr.Textbox(label="Analysis Results"), title="Surgical Assistance System", description="Upload an image of the surgical field and enter vital signs for analysis and recommendations." ) # Launch the interface iface.launch(share=True)