File size: 2,115 Bytes
a803ff8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dea3fb9
 
a803ff8
 
 
 
 
 
 
 
b7ed914
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import gradio as gr
import tensorflow as tf
import numpy as np
from PIL import Image

# Make sure to decorate the custom metric class with @register_keras_serializable
@tf.keras.utils.register_keras_serializable()
class F1Score(tf.keras.metrics.Metric):
    def __init__(self, name='f1_score', **kwargs):
        super().__init__(name=name, **kwargs)
        self.precision = tf.keras.metrics.Precision()
        self.recall = tf.keras.metrics.Recall()

    def update_state(self, y_true, y_pred, sample_weight=None):
        y_pred = tf.round(y_pred)
        self.precision.update_state(y_true, y_pred, sample_weight)
        self.recall.update_state(y_true, y_pred, sample_weight)

    def result(self):
        p = self.precision.result()
        r = self.recall.result()
        return 2 * ((p * r) / (p + r + tf.keras.backend.epsilon()))

    def reset_states(self):
        self.precision.reset_states()
        self.recall.reset_states()

# Load your TensorFlow model
model_path = './ACC0.9322_valACC0.9148_loss0.3592_Epoch83.keras'
model = tf.keras.models.load_model(model_path, custom_objects={'F1Score': F1Score})

def predict(image):
    # Preprocess the image to match the input shape of the model
    img = Image.fromarray(image.astype('uint8'), 'RGB')
    img = img.resize((224, 224))  # Update the size if different
    img_array = np.array(img)
    img_array = img_array / 255.0  # Normalize if your model expects normalization
    img_array = img_array[np.newaxis, ...]  # Model expects a batch dimension

    # Make prediction
    prediction = model.predict(img_array)
    pred_class = 'Pneumonia' if prediction[0][0] > 0.5 else 'Normal'  # Update based on your model output
    return {pred_class: float(prediction[0][0])}

iface = gr.Interface(fn=predict,
                     inputs=gr.components.Image(image_mode='RGB', label="Upload X-ray Image"),
                     outputs=gr.components.Label(num_top_classes=2),
                     title="Pneumonia Detection",
                     description="Upload an X-ray image to detect pneumonia.")

if __name__ == "__main__":
    iface.launch()