BtechProjectPCCOE commited on
Commit
0c81ec7
·
verified ·
1 Parent(s): 40141f3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +111 -106
app.py CHANGED
@@ -1,106 +1,111 @@
1
- import gradio as gr
2
- import cv2
3
- import numpy as np
4
- from PIL import Image
5
- import os
6
- from utils.model_loader import load_blood_group_model, load_gender_model
7
- from utils.predictor import predict_blood_group, predict_gender
8
- from utils.preprocessing import preprocess_fingerprint
9
-
10
- blood_model = None
11
- gender_model = None
12
-
13
-
14
- def load_models():
15
- global blood_model, gender_model
16
- if blood_model is None:
17
- try:
18
- blood_model = load_blood_group_model()
19
- except Exception as e:
20
- print(f"Warning: Blood group model not loaded: {e}")
21
- blood_model = None
22
-
23
- if gender_model is None:
24
- try:
25
- gender_model = load_gender_model()
26
- except Exception as e:
27
- print(f"Warning: Gender model not loaded: {e}")
28
- gender_model = None
29
-
30
- return blood_model, gender_model
31
-
32
-
33
- def analyze_fingerprint(image):
34
- """Analyze uploaded fingerprint image"""
35
- if image is None:
36
- return "Please upload a fingerprint image.", "", "", ""
37
-
38
- try:
39
- # Load models lazily
40
- blood_model, gender_model = load_models()
41
- if blood_model is None or gender_model is None:
42
- missing = []
43
- if blood_model is None:
44
- missing.append("blood group")
45
- if gender_model is None:
46
- missing.append("gender")
47
- missing_text = ", ".join(missing)
48
- msg = f"Model files not deployed on Vercel. Missing: {missing_text}."
49
- return msg, "", msg, ""
50
-
51
- # Preprocess for both models
52
- preprocessed_blood = preprocess_fingerprint(image, model_type="blood_group")
53
- preprocessed_gender = preprocess_fingerprint(image, model_type="gender")
54
-
55
- # Get predictions
56
- blood_result = predict_blood_group(blood_model, preprocessed_blood)
57
- gender_result = predict_gender(gender_model, preprocessed_gender)
58
-
59
- # Format results
60
- if blood_result["success"]:
61
- blood_text = f"**Predicted Blood Group:** {blood_result['blood_group']}\n**Confidence:** {blood_result['confidence']:.2%}"
62
- blood_details = "\n".join([f"{k}: {v:.2%}" for k, v in blood_result['all_scores'].items()])
63
- else:
64
- blood_text = "Error predicting blood group"
65
- blood_details = str(blood_result.get('error', 'Unknown error'))
66
-
67
- if gender_result["success"]:
68
- gender_text = f"**Predicted Gender:** {gender_result['gender']}\n**Confidence:** {gender_result['confidence']:.2%}"
69
- else:
70
- gender_text = "Error predicting gender"
71
-
72
- return blood_text, blood_details, gender_text, ""
73
-
74
- except Exception as e:
75
- return f"Error processing image: {str(e)}", "", "", ""
76
-
77
- # Create Gradio interface
78
- with gr.Blocks(title="Forensic Fingerprint Analysis", theme=gr.themes.Soft()) as demo:
79
- gr.Markdown("# 🔍 Forensic Fingerprint Analysis System")
80
- gr.Markdown("Upload a fingerprint image to predict blood group and gender using machine learning models.")
81
-
82
- with gr.Row():
83
- with gr.Column():
84
- image_input = gr.Image(label="Upload Fingerprint Image", type="pil")
85
- analyze_btn = gr.Button("Analyze Fingerprint", variant="primary")
86
-
87
- with gr.Column():
88
- gr.Markdown("### Results")
89
- blood_output = gr.Textbox(label="Blood Group Prediction", lines=2)
90
- blood_scores = gr.Textbox(label="All Blood Group Scores", lines=8)
91
- gender_output = gr.Textbox(label="Gender Prediction", lines=2)
92
-
93
- # Connect the function
94
- analyze_btn.click(
95
- analyze_fingerprint,
96
- inputs=image_input,
97
- outputs=[blood_output, blood_scores, gender_output, gr.Textbox(visible=False)]
98
- )
99
-
100
- gr.Markdown("---")
101
- gr.Markdown("**About:** 4th Year Forensic Research Project - Analyzing fingerprint patterns for biometric identification.")
102
-
103
- # Launch the app
104
- if __name__ == "__main__":
105
- port = int(os.environ.get("PORT", 7860))
106
- demo.launch(server_name="0.0.0.0", server_port=port)
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import numpy as np
3
+ import cv2
4
+ import tensorflow as tf
5
+ from PIL import Image
6
+ import os
7
+
8
+ # ===================== LOAD MODELS =====================
9
+
10
+ blood_model = None
11
+ gender_model = None
12
+
13
+ def load_models():
14
+ global blood_model, gender_model
15
+
16
+ if blood_model is None:
17
+ try:
18
+ blood_model = tf.keras.models.load_model("models/blood_model.h5")
19
+ except Exception as e:
20
+ print(f"Blood model error: {e}")
21
+ blood_model = None
22
+
23
+ if gender_model is None:
24
+ try:
25
+ gender_model = tf.keras.models.load_model("models/gender_model.h5")
26
+ except Exception as e:
27
+ print(f"Gender model error: {e}")
28
+ gender_model = None
29
+
30
+ return blood_model, gender_model
31
+
32
+
33
+ # ===================== PREPROCESS =====================
34
+
35
+ def preprocess_image(image):
36
+ image = np.array(image)
37
+ img = cv2.resize(image, (224, 224))
38
+ img = img / 255.0
39
+ img = np.expand_dims(img, axis=0)
40
+ return img
41
+
42
+
43
+ # ===================== LABELS =====================
44
+
45
+ BLOOD_GROUPS = ["A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-"]
46
+ GENDERS = ["Male", "Female"]
47
+
48
+
49
+ # ===================== PREDICTION =====================
50
+
51
+ def analyze_fingerprint(image):
52
+
53
+ if image is None:
54
+ return "Please upload image", "", ""
55
+
56
+ try:
57
+ blood_model, gender_model = load_models()
58
+
59
+ if blood_model is None or gender_model is None:
60
+ return "Model files missing", "", ""
61
+
62
+ img = preprocess_image(image)
63
+
64
+ # Blood prediction
65
+ blood_pred = blood_model.predict(img)[0]
66
+ blood_idx = np.argmax(blood_pred)
67
+
68
+ blood_text = f"Predicted Blood Group: {BLOOD_GROUPS[blood_idx]} ({blood_pred[blood_idx]:.2%})"
69
+ blood_scores = "\n".join(
70
+ [f"{bg}: {score:.2%}" for bg, score in zip(BLOOD_GROUPS, blood_pred)]
71
+ )
72
+
73
+ # Gender prediction
74
+ gender_pred = gender_model.predict(img)[0]
75
+ gender_idx = np.argmax(gender_pred)
76
+
77
+ gender_text = f"Predicted Gender: {GENDERS[gender_idx]} ({gender_pred[gender_idx]:.2%})"
78
+
79
+ return blood_text, blood_scores, gender_text
80
+
81
+ except Exception as e:
82
+ return f"Error: {str(e)}", "", ""
83
+
84
+
85
+ # ===================== UI =====================
86
+
87
+ with gr.Blocks(title="Forensic Fingerprint Analysis") as demo:
88
+ gr.Markdown("# 🔍 Forensic Fingerprint Analysis")
89
+ gr.Markdown("Upload a fingerprint image to predict blood group and gender.")
90
+
91
+ with gr.Row():
92
+ with gr.Column():
93
+ image_input = gr.Image(type="pil", label="Upload Fingerprint")
94
+ btn = gr.Button("Analyze")
95
+
96
+ with gr.Column():
97
+ blood_output = gr.Textbox(label="Blood Group")
98
+ blood_scores = gr.Textbox(label="All Scores")
99
+ gender_output = gr.Textbox(label="Gender")
100
+
101
+ btn.click(
102
+ analyze_fingerprint,
103
+ inputs=image_input,
104
+ outputs=[blood_output, blood_scores, gender_output],
105
+ )
106
+
107
+
108
+ # ===================== RUN =====================
109
+
110
+ if __name__ == "__main__":
111
+ demo.launch(server_name="0.0.0.0", server_port=7860)