File size: 3,705 Bytes
57b4d6e
1d782a2
9643386
 
57b4d6e
313728a
 
 
93e8de0
57b4d6e
313728a
 
9643386
313728a
9643386
313728a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9643386
313728a
 
9643386
313728a
 
 
 
 
 
 
57b4d6e
9643386
 
 
 
313728a
 
 
 
 
 
 
 
9643386
 
57b4d6e
7660b5c
313728a
57b4d6e
313728a
 
 
 
 
 
 
 
57b4d6e
313728a
57b4d6e
313728a
9643386
7660b5c
313728a
 
57b4d6e
313728a
 
7660b5c
 
 
57b4d6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7660b5c
57b4d6e
9643386
57b4d6e
7660b5c
57b4d6e
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import gradio as gr
import joblib
import numpy as np
import pandas as pd
import cv2
from skimage.color import rgb2hsv
from skimage.measure import shannon_entropy
from scipy.ndimage import generic_filter

# Extract features from the image (same as your previous code)
def extract_features(image_path):
    image = cv2.imread(image_path)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    
    # Extract RGB means
    meanr = np.mean(image[:, :, 0])  # Red channel
    meang = np.mean(image[:, :, 1])  # Green channel
    meanb = np.mean(image[:, :, 2])  # Blue channel
    
    # Convert to HSI and compute HHR
    hsv_image = rgb2hsv(image)
    hue = hsv_image[:, :, 0]
    high_hue_pixels = np.sum(hue > 0.95)
    total_pixels = hue.size
    HHR = high_hue_pixels / total_pixels
    
    # Convert to Grayscale
    gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
    
    # Compute Entropy
    Ent = shannon_entropy(gray_image)
    
    # Compute Brightness
    B = np.mean(gray_image)
    
    # Sliding window for gray-level features
    def g1_filter(window):
        return window[4] - np.min(window)

    def g2_filter(window):
        return np.max(window) - window[4]

    def g3_filter(window):
        return window[4] - np.mean(window)

    def g4_filter(window):
        return np.std(window)

    def g5_filter(window):
        return window[4]

    # Apply filters with 3x3 window
    g1 = generic_filter(gray_image, g1_filter, size=3).mean()
    g2 = generic_filter(gray_image, g2_filter, size=3).mean()
    g3 = generic_filter(gray_image, g3_filter, size=3).mean()
    g4 = generic_filter(gray_image, g4_filter, size=3).mean()
    g5 = generic_filter(gray_image, g5_filter, size=3).mean()

    # Return features
    return {
        "meanr": meanr,
        "meang": meang,
        "meanb": meanb,
        "HHR": HHR,
        "Ent": Ent,
        "B": B,
        "g1": g1,
        "g2": g2,
        "g3": g3,
        "g4": g4,
        "g5": g5,
    }

# Function to make predictions
def predict_hemoglobin(age, gender, image):
    # Extract features from the image
    features = extract_features(image)  # Use the file path directly
    
    # Add age and gender to the features
    features['age'] = age
    features['gender'] = 1 if gender.lower() == 'male' else 0
    
    # Convert features to DataFrame
    features_df = pd.DataFrame([features])
    
    # Load the pre-trained models
    svr_model = joblib.load('svr_model.pkl')  # SVR model
    scaler = joblib.load('scaler.pkl')        # MinMaxScaler
    label_encoder = joblib.load('label_encoder.pkl')  # LabelEncoder

    # Apply MinMaxScaler transformation
    features_df_scaled = scaler.transform(features_df)
    
    # Make the prediction
    hemoglobin = svr_model.predict(features_df_scaled)[0]
    
    return f"Predicted Hemoglobin Value: {hemoglobin:.2f}"

# Gradio Interface
def gradio_interface():
    with gr.Blocks() as demo:
        gr.Markdown("## Hemoglobin Prediction from Image Features")
        
        with gr.Row():
            age = gr.Number(label="Age", value=25)
            gender = gr.Dropdown(choices=["Male", "Female"], label="Gender", value="Male")
        
        image_input = gr.Image(type="filepath", label="Upload Image (Path to Image)", interactive=True)
        
        output = gr.Textbox(label="Predicted Hemoglobin Value")
        
        # Prediction button
        predict_btn = gr.Button("Predict Hemoglobin")
        
        predict_btn.click(fn=predict_hemoglobin, inputs=[age, gender, image_input], outputs=output)
    
    return demo

# Launch the app
if __name__ == "__main__":
    gradio_interface().launch(share=True)  # Set `share=True` to create a public link