File size: 3,078 Bytes
0c81ec7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a6ef945
0c81ec7
 
 
 
 
 
fdfd7de
0c81ec7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import numpy as np
import cv2
import tensorflow as tf
from PIL import Image
import os

# ===================== LOAD MODELS =====================

blood_model = None
gender_model = None

def load_models():
    global blood_model, gender_model

    if blood_model is None:
        try:
            blood_model = tf.keras.models.load_model("blood_model.h5")
        except Exception as e:
            print(f"Blood model error: {e}")
            blood_model = None

    if gender_model is None:
        try:
            gender_model = tf.keras.models.load_model("gender_model.keras")
        except Exception as e:
            print(f"Gender model error: {e}")
            gender_model = None

    return blood_model, gender_model


# ===================== PREPROCESS =====================

def preprocess_image(image):
    image = np.array(image)
    img = cv2.resize(image, (224, 224))
    img = img / 255.0
    img = np.expand_dims(img, axis=0)
    return img


# ===================== LABELS =====================

BLOOD_GROUPS = ["A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-"]
GENDERS = ["Male", "Female"]


# ===================== PREDICTION =====================

def analyze_fingerprint(image):

    if image is None:
        return "Please upload image", "", ""

    try:
        blood_model, gender_model = load_models()

        if blood_model is None or gender_model is None:
            return "Model files missing", "", ""

        img = preprocess_image(image)

        # Blood prediction
        blood_pred = blood_model.predict(img)[0]
        blood_idx = np.argmax(blood_pred)

        blood_text = f"Predicted Blood Group: {BLOOD_GROUPS[blood_idx]} ({blood_pred[blood_idx]:.2%})"
        blood_scores = "\n".join(
            [f"{bg}: {score:.2%}" for bg, score in zip(BLOOD_GROUPS, blood_pred)]
        )

        # Gender prediction
        gender_pred = gender_model.predict(img)[0]
        gender_idx = np.argmax(gender_pred)

        gender_text = f"Predicted Gender: {GENDERS[gender_idx]} ({gender_pred[gender_idx]:.2%})"

        return blood_text, blood_scores, gender_text

    except Exception as e:
        return f"Error: {str(e)}", "", ""


# ===================== UI =====================

with gr.Blocks(title="Forensic Fingerprint Analysis") as demo:
    gr.Markdown("# 🔍 Forensic Fingerprint Analysis")
    gr.Markdown("Upload a fingerprint image to predict blood group and gender.")

    with gr.Row():
        with gr.Column():
            image_input = gr.Image(type="pil", label="Upload Fingerprint")
            btn = gr.Button("Analyze")

        with gr.Column():
            blood_output = gr.Textbox(label="Blood Group")
            blood_scores = gr.Textbox(label="All Scores")
            gender_output = gr.Textbox(label="Gender")

    btn.click(
        analyze_fingerprint,
        inputs=image_input,
        outputs=[blood_output, blood_scores, gender_output],
    )


# ===================== RUN =====================

if __name__ == "__main__":
    demo.launch(server_name="0.0.0.0", server_port=7860)