material_identification / backend /core /model_loader.py
Deploy Bot
Add complete Django backend with SciANN model loader and API endpoints
ed85fe4
import os
import glob
import importlib.util
from typing import Optional
PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
_MODEL = None
def _import_model_definition(path: str):
try:
spec = importlib.util.spec_from_file_location('model_definition', path)
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)
return mod
except Exception:
return None
def _find_weights() -> Optional[str]:
candidates = glob.glob(os.path.join(PROJECT_ROOT, 'models', '**', '*.h5'), recursive=True)
candidates += glob.glob(os.path.join(PROJECT_ROOT, 'models', '**', '*.hdf5'), recursive=True)
return candidates[0] if candidates else None
def _try_load_sciann_model():
try:
import sciann as sn
except Exception:
return None
model_def_path = os.path.join(PROJECT_ROOT, 'model_definition.py')
if os.path.exists(model_def_path):
mod = _import_model_definition(model_def_path)
if mod and hasattr(mod, 'create_model'):
try:
return mod.create_model()
except Exception:
pass
loader_path = os.path.join(PROJECT_ROOT, 'models', 'load_model.py')
if os.path.exists(loader_path):
mod = _import_model_definition(loader_path)
if mod and hasattr(mod, 'load_model'):
try:
return mod.load_model(PROJECT_ROOT)
except Exception:
pass
return None
def get_model():
global _MODEL
if _MODEL is not None:
return _MODEL
model = _try_load_sciann_model()
if model is None:
_MODEL = None
return None
weights = _find_weights()
if weights:
try:
if hasattr(model, 'load_weights'):
model.load_weights(weights)
except Exception:
pass
_MODEL = model
return _MODEL