import gradio as gr import tensorflow as tf from PIL import Image import numpy as np import tensorflow as tf import keras.backend as K # Define focal loss def focal_loss(gamma=2., alpha=0.25): def focal_loss_fixed(y_true, y_pred): y_pred = tf.clip_by_value(y_pred, K.epsilon(), 1. - K.epsilon()) cross_entropy = -y_true * tf.math.log(y_pred) weight = alpha * y_true * tf.math.pow((1 - y_pred), gamma) loss = weight * cross_entropy return tf.reduce_sum(loss, axis=-1) return focal_loss_fixed # Load models vgg16_model = tf.keras.models.load_model( "vgg16_best_model.keras" ) xception_model = tf.keras.models.load_model( 'xception_best.keras', custom_objects={'focal_loss_fixed': focal_loss()} ) def predict_fire(image): img = Image.fromarray(image).convert("RGB") # Preprocess for vgg16_model (128x128 input size) vgg16_img = img.resize((128, 128)) vgg16_img_array = np.array(vgg16_img) / 255.0 vgg16_img_array = np.expand_dims(vgg16_img_array, axis=0) # Fire detection using vgg16_model fire_pred = vgg16_model.predict(vgg16_img_array) fire_status = "Fire Detected" if fire_pred[0][0] > 0.5 else "No Fire Detected" # If fire is detected, preprocess for xception_model (224x224 input size) if fire_status == "Fire Detected": xception_img = img.resize((224, 224)) xception_img_array = np.array(xception_img) / 255.0 xception_img_array = np.expand_dims(xception_img_array, axis=0) # Severity prediction using xception_model severity_pred = xception_model.predict(xception_img_array) severity_level = np.argmax(severity_pred[0]) severity = ["Mild", "Moderate", "Severe"][severity_level] # Static rule-based recommendations with detailed instructions if severity == "Mild": recommendation = ( "Fire detected is mild and manageable. " "For the Fire Department: Ensure continuous monitoring of the fire. " "Deploy fire trucks and extinguishing equipment if necessary to prevent escalation. " "For the Public: Stay alert and stay indoors. Evacuate only if advised by authorities. " "Ensure clear access routes for emergency services. " "Keep fire safety equipment such as fire extinguishers readily available." ) elif severity == "Moderate": recommendation = ( "Fire detected is moderate and poses a significant risk. " "For the Fire Department: Immediate response is needed. " "Deploy sufficient fire trucks, helicopters (if possible), and personnel to contain the fire. " "Establish firebreaks and coordinate with neighboring departments. " "For the Public: Evacuate the area promptly as the fire might spread. " "Follow evacuation routes and do not return to the area until authorities deem it safe. " "Be cautious of smoke inhalation, and wear protective masks if available." ) else: # Severe recommendation = ( "Severe fire detected with rapid spread potential. Immediate action is critical. " "For the Fire Department: Prioritize evacuation operations. " "Deploy all available resources, including specialized teams and air support. " "Set up perimeters around the affected area and prevent access. " "Coordinate with national agencies for additional resources and backup. " "For the Public: Evacuate immediately. Leave all belongings behind and proceed to designated safe zones. " "Avoid smoke exposure and keep away from fire zones. Follow all official instructions and do not attempt to return to the area until clearance is given by emergency services. " "Remain in contact with local authorities for further updates." ) else: severity = "N/A" recommendation = ( "No fire detected. However, always be cautious of any unusual smoke or smells in your environment. " "Ensure that fire alarms are functioning, and regularly check fire extinguishers. " "Stay prepared by familiarizing yourself with fire evacuation routes and emergency contact numbers." ) return fire_status, severity, recommendation # Gradio interface interface = gr.Interface( fn=predict_fire, inputs=gr.Image(type="numpy", label="Upload Image"), outputs=[ gr.Textbox(label="Fire Status"), gr.Textbox(label="Severity Level"), gr.Textbox(label="Recommendation") ], title="Fire Prediction and Severity Classification", description="Upload an image to predict fire and its severity level (Mild, Moderate, Severe), and get recommendations.", ) if __name__ == "__main__": interface.launch()