File size: 3,099 Bytes
fad4787
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import cv2
import numpy as np
from PIL import Image
import os
from utils.model_loader import load_blood_group_model, load_gender_model
from utils.predictor import predict_blood_group, predict_gender
from utils.preprocessing import preprocess_fingerprint

# Load models on startup
blood_model = load_blood_group_model()
gender_model = load_gender_model()

def analyze_fingerprint(image):
    """Analyze uploaded fingerprint image"""
    if image is None:
        return "Please upload a fingerprint image.", "", "", ""
    
    try:
        # Preprocess for both models
        preprocessed_blood = preprocess_fingerprint(image, model_type="blood_group")
        preprocessed_gender = preprocess_fingerprint(image, model_type="gender")
        
        # Get predictions
        blood_result = predict_blood_group(blood_model, preprocessed_blood)
        gender_result = predict_gender(gender_model, preprocessed_gender)
        
        # Format results
        if blood_result["success"]:
            blood_text = f"**Predicted Blood Group:** {blood_result['blood_group']}\n**Confidence:** {blood_result['confidence']:.2%}"
            blood_details = "\n".join([f"{k}: {v:.2%}" for k, v in blood_result['all_scores'].items()])
        else:
            blood_text = "Error predicting blood group"
            blood_details = str(blood_result.get('error', 'Unknown error'))
        
        if gender_result["success"]:
            gender_text = f"**Predicted Gender:** {gender_result['gender']}\n**Confidence:** {gender_result['confidence']:.2%}"
        else:
            gender_text = "Error predicting gender"
        
        return blood_text, blood_details, gender_text, ""
    
    except Exception as e:
        return f"Error processing image: {str(e)}", "", "", ""

# Create Gradio interface
with gr.Blocks(title="Forensic Fingerprint Analysis", theme=gr.themes.Soft()) as demo:
    gr.Markdown("# 🔍 Forensic Fingerprint Analysis System")
    gr.Markdown("Upload a fingerprint image to predict blood group and gender using machine learning models.")
    
    with gr.Row():
        with gr.Column():
            image_input = gr.Image(label="Upload Fingerprint Image", type="pil")
            analyze_btn = gr.Button("Analyze Fingerprint", variant="primary")
        
        with gr.Column():
            gr.Markdown("### Results")
            blood_output = gr.Textbox(label="Blood Group Prediction", lines=2)
            blood_scores = gr.Textbox(label="All Blood Group Scores", lines=8)
            gender_output = gr.Textbox(label="Gender Prediction", lines=2)
    
    # Connect the function
    analyze_btn.click(
        analyze_fingerprint,
        inputs=image_input,
        outputs=[blood_output, blood_scores, gender_output, gr.Textbox(visible=False)]
    )
    
    gr.Markdown("---")
    gr.Markdown("**About:** 4th Year Forensic Research Project - Analyzing fingerprint patterns for biometric identification.")

# Launch the app
if __name__ == "__main__":
    demo.launch()