File size: 3,666 Bytes
2e6a149
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""

Model loading utilities for fingerprint analysis models

"""

import os
import pickle
import joblib
from pathlib import Path
import warnings
warnings.filterwarnings('ignore')

# Import TensorFlow
import tensorflow as tf

# Configure paths
BASE_DIR = Path(__file__).parent.parent
MODELS_DIR = BASE_DIR / "models"

# Model paths
BLOOD_GROUP_MODEL_PATH = os.environ.get(
    "BLOOD_GROUP_MODEL_PATH",
    str(MODELS_DIR / "blood_group.h5")
)
GENDER_MODEL_PATH = os.environ.get(
    "GENDER_MODEL_PATH", 
    str(MODELS_DIR / "gender_model.keras")
)

# Global variables to cache loaded models
_blood_group_model = None
_gender_model = None


def load_blood_group_model():
    """Load the blood group prediction model"""
    global _blood_group_model
    
    if _blood_group_model is not None:
        return _blood_group_model
    
    try:
        if BLOOD_GROUP_MODEL_PATH.endswith(('.h5', '.keras')):
            try:
                _blood_group_model = tf.keras.models.load_model(BLOOD_GROUP_MODEL_PATH)
            except Exception as e:
                # Fallback: load without compile
                print(f"⚠️ Trying compile=False...")
                _blood_group_model = tf.keras.models.load_model(BLOOD_GROUP_MODEL_PATH, compile=False)
                _blood_group_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
        elif BLOOD_GROUP_MODEL_PATH.endswith('.pkl'):
            with open(BLOOD_GROUP_MODEL_PATH, 'rb') as f:
                _blood_group_model = pickle.load(f)
        elif BLOOD_GROUP_MODEL_PATH.endswith('.joblib'):
            _blood_group_model = joblib.load(BLOOD_GROUP_MODEL_PATH)
        else:
            raise ValueError(f"Unsupported format: {BLOOD_GROUP_MODEL_PATH}")
        
        print(f"✓ Blood group model loaded")
        return _blood_group_model
    
    except Exception as e:
        raise Exception(f"Error loading blood group model: {str(e)}")


def load_gender_model():
    """Load the gender classification model"""
    global _gender_model
    
    if _gender_model is not None:
        return _gender_model
    
    try:
        if GENDER_MODEL_PATH.endswith(('.h5', '.keras')):
            try:
                _gender_model = tf.keras.models.load_model(GENDER_MODEL_PATH)
            except Exception as e:
                # Fallback: load without compile
                print(f"⚠️ Trying compile=False...")
                _gender_model = tf.keras.models.load_model(GENDER_MODEL_PATH, compile=False)
                _gender_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
        elif GENDER_MODEL_PATH.endswith('.pkl'):
            with open(GENDER_MODEL_PATH, 'rb') as f:
                _gender_model = pickle.load(f)
        elif GENDER_MODEL_PATH.endswith('.joblib'):
            _gender_model = joblib.load(GENDER_MODEL_PATH)
        else:
            raise ValueError(f"Unsupported format: {GENDER_MODEL_PATH}")
        
        print(f"✓ Gender model loaded")
        return _gender_model
    
    except Exception as e:
        raise Exception(f"Error loading gender model: {str(e)}")


def set_model_paths(blood_group_path, gender_path):
    """Update model paths at runtime"""
    global BLOOD_GROUP_MODEL_PATH, GENDER_MODEL_PATH
    global _blood_group_model, _gender_model
    
    BLOOD_GROUP_MODEL_PATH = blood_group_path
    GENDER_MODEL_PATH = gender_path
    
    # Clear cached models
    _blood_group_model = None
    _gender_model = None
    
    print(f"Model paths updated successfully")