sunil18p31a0101 commited on
Commit
9a36a53
·
verified ·
1 Parent(s): a97f423

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -45
app.py CHANGED
@@ -9,106 +9,89 @@ import cv2
9
  from PIL import Image
10
  from sklearn.preprocessing import LabelEncoder
11
 
12
- # Initialize LabelEncoder for gender encoding
 
 
 
 
 
 
 
13
  gender_encoder = LabelEncoder()
14
- gender_encoder.fit(['Female', 'Male']) # Ensuring correct label mapping
15
 
16
- # Function to extract features from the image
17
  def extract_features(image):
18
- # Convert PIL image to NumPy array
19
  image = np.array(image)
20
 
21
- # Extract RGB means
22
- meanr = np.mean(image[:, :, 0])
23
- meang = np.mean(image[:, :, 1])
24
- meanb = np.mean(image[:, :, 2])
25
 
26
- # Convert to HSI and compute HHR
27
  hsv_image = rgb2hsv(image)
28
  hue = hsv_image[:, :, 0]
29
  high_hue_pixels = np.sum(hue > 0.95)
30
  total_pixels = hue.size
31
  HHR = high_hue_pixels / total_pixels
32
 
33
- # Convert to Grayscale
34
  gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
35
 
36
- # Compute Entropy
37
  Ent = shannon_entropy(gray_image)
38
-
39
- # Compute Brightness
40
  B = np.mean(gray_image)
41
 
42
- # Define sliding window filters
43
  def g1_filter(window): return window[4] - np.min(window)
44
  def g2_filter(window): return np.max(window) - window[4]
45
  def g3_filter(window): return window[4] - np.mean(window)
46
  def g4_filter(window): return np.std(window)
47
  def g5_filter(window): return window[4]
48
 
49
- # Apply filters with 3x3 window
50
  g1 = generic_filter(gray_image, g1_filter, size=3).mean()
51
  g2 = generic_filter(gray_image, g2_filter, size=3).mean()
52
  g3 = generic_filter(gray_image, g3_filter, size=3).mean()
53
  g4 = generic_filter(gray_image, g4_filter, size=3).mean()
54
  g5 = generic_filter(gray_image, g5_filter, size=3).mean()
55
 
56
- # Return extracted features
57
  return {
58
  "meanr": meanr, "meang": meang, "meanb": meanb,
59
  "HHR": HHR, "Ent": Ent, "B": B, "g1": g1,
60
  "g2": g2, "g3": g3, "g4": g4, "g5": g5,
61
  }
62
 
63
- # Function to predict hemoglobin value
64
  def predict_hemoglobin(age, gender, image):
65
  try:
66
- # Validate image input
67
  if image is None:
68
  return "Error: No image uploaded. Please upload an image."
69
 
70
  if not isinstance(image, Image.Image):
71
  return "Error: Invalid image format. Please upload a valid image file."
72
 
73
- # Validate gender input
74
- if gender not in ["Male", "Female"]:
75
- return "Error: Invalid gender selected."
76
-
77
- print(f"Received Gender: {gender}") # Debugging line
78
-
79
- # Extract features from the image
80
  features = extract_features(image)
81
-
82
- # Encode gender as a numerical value
83
- features['Gender'] = gender_encoder.transform([gender])[0]
84
- features['Age'] = age
 
 
85
 
86
  # Convert to DataFrame
87
  features_df = pd.DataFrame([features])
88
 
89
- # Load trained model and scaler
90
- model = joblib.load('lgbm_model.pkl') # Replace with actual path
91
- scaler = joblib.load('minmax_scaler.pkl') # Replace with actual path
92
-
93
- # Ensure features match expected columns
94
- expected_columns = ['meanr', 'meang', 'meanb', 'HHR', 'Ent', 'B', 'g1', 'g2', 'g3', 'g4', 'g5', 'Age', 'Gender']
95
- for col in expected_columns:
96
- if col not in features_df:
97
- features_df[col] = 0 # Assign default value if missing
98
-
99
- features_df = features_df[expected_columns] # Ensure correct column order
100
 
101
  # Apply scaling
102
- features_df_scaled = scaler.transform(features_df)
103
 
104
  # Predict hemoglobin
105
- hemoglobin = model.predict(features_df_scaled)[0]
106
 
107
  return f"Predicted Hemoglobin Value: {hemoglobin:.2f}"
108
 
109
  except Exception as e:
110
- print(f"An error occurred during prediction: {e}")
111
- return "An error occurred during prediction. Please try again."
112
 
113
  # Gradio interface
114
  with gr.Blocks() as anemia_detection_app:
@@ -116,7 +99,7 @@ with gr.Blocks() as anemia_detection_app:
116
 
117
  with gr.Row():
118
  age_input = gr.Number(label="Age", value=25)
119
- gender_input = gr.Radio(label="Gender", choices=["Male", "Female"], value="Male", type="value") # ✅ FIXED
120
 
121
  image_input = gr.Image(label="Upload Retinal Image", type="pil")
122
  output_text = gr.Textbox(label="Predicted Hemoglobin Value")
 
9
  from PIL import Image
10
  from sklearn.preprocessing import LabelEncoder
11
 
12
+ # Load trained model and scaler
13
+ model = joblib.load('lgbm_model.pkl') # Replace with actual path
14
+ scaler = joblib.load('minmax_scaler.pkl') # Replace with actual path
15
+
16
+ # Get expected feature names from the model
17
+ expected_features = model.feature_name_ # Extracts trained feature names
18
+
19
+ # Initialize LabelEncoder for gender encoding (if used in training)
20
  gender_encoder = LabelEncoder()
21
+ gender_encoder.fit(['Female', 'Male']) # Ensure correct mapping
22
 
23
+ # Function to extract features
24
  def extract_features(image):
 
25
  image = np.array(image)
26
 
27
+ meanr = np.mean(image[:, :, 0])
28
+ meang = np.mean(image[:, :, 1])
29
+ meanb = np.mean(image[:, :, 2])
 
30
 
 
31
  hsv_image = rgb2hsv(image)
32
  hue = hsv_image[:, :, 0]
33
  high_hue_pixels = np.sum(hue > 0.95)
34
  total_pixels = hue.size
35
  HHR = high_hue_pixels / total_pixels
36
 
 
37
  gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
38
 
 
39
  Ent = shannon_entropy(gray_image)
 
 
40
  B = np.mean(gray_image)
41
 
 
42
  def g1_filter(window): return window[4] - np.min(window)
43
  def g2_filter(window): return np.max(window) - window[4]
44
  def g3_filter(window): return window[4] - np.mean(window)
45
  def g4_filter(window): return np.std(window)
46
  def g5_filter(window): return window[4]
47
 
 
48
  g1 = generic_filter(gray_image, g1_filter, size=3).mean()
49
  g2 = generic_filter(gray_image, g2_filter, size=3).mean()
50
  g3 = generic_filter(gray_image, g3_filter, size=3).mean()
51
  g4 = generic_filter(gray_image, g4_filter, size=3).mean()
52
  g5 = generic_filter(gray_image, g5_filter, size=3).mean()
53
 
 
54
  return {
55
  "meanr": meanr, "meang": meang, "meanb": meanb,
56
  "HHR": HHR, "Ent": Ent, "B": B, "g1": g1,
57
  "g2": g2, "g3": g3, "g4": g4, "g5": g5,
58
  }
59
 
60
+ # Prediction function
61
  def predict_hemoglobin(age, gender, image):
62
  try:
 
63
  if image is None:
64
  return "Error: No image uploaded. Please upload an image."
65
 
66
  if not isinstance(image, Image.Image):
67
  return "Error: Invalid image format. Please upload a valid image file."
68
 
69
+ # Extract features
 
 
 
 
 
 
70
  features = extract_features(image)
71
+
72
+ # Encode gender only if the model was trained with it
73
+ if "Gender" in expected_features:
74
+ features["Gender"] = gender_encoder.transform([gender])[0]
75
+
76
+ features["Age"] = age
77
 
78
  # Convert to DataFrame
79
  features_df = pd.DataFrame([features])
80
 
81
+ # Ensure only model-expected features are used
82
+ features_df = features_df[expected_features] # Select only required columns
 
 
 
 
 
 
 
 
 
83
 
84
  # Apply scaling
85
+ features_scaled = scaler.transform(features_df)
86
 
87
  # Predict hemoglobin
88
+ hemoglobin = model.predict(features_scaled)[0]
89
 
90
  return f"Predicted Hemoglobin Value: {hemoglobin:.2f}"
91
 
92
  except Exception as e:
93
+ print(f"Error during prediction: {e}")
94
+ return "An error occurred. Please check inputs and try again."
95
 
96
  # Gradio interface
97
  with gr.Blocks() as anemia_detection_app:
 
99
 
100
  with gr.Row():
101
  age_input = gr.Number(label="Age", value=25)
102
+ gender_input = gr.Radio(label="Gender", choices=["Male", "Female"], value="Male", type="value")
103
 
104
  image_input = gr.Image(label="Upload Retinal Image", type="pil")
105
  output_text = gr.Textbox(label="Predicted Hemoglobin Value")