Spaces:
Sleeping
Sleeping
Ultra-robust monkey-patching and FER import safety
Browse files- backend/app/main.py +32 -10
- backend/app/routers/emotion.py +18 -1
- backend/app/utils/patching.py +39 -22
backend/app/main.py
CHANGED
|
@@ -1,18 +1,40 @@
|
|
| 1 |
import os
|
| 2 |
import sys
|
|
|
|
| 3 |
|
| 4 |
-
#
|
| 5 |
os.environ["KERAS_BACKEND"] = "torch"
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
from fastapi import FastAPI, Request
|
|
|
|
| 16 |
from fastapi.responses import RedirectResponse
|
| 17 |
from fastapi.staticfiles import StaticFiles
|
| 18 |
from fastapi.templating import Jinja2Templates
|
|
|
|
| 1 |
import os
|
| 2 |
import sys
|
| 3 |
+
from types import ModuleType
|
| 4 |
|
| 5 |
+
# 1. SET ENVIRONMENT FIRST
|
| 6 |
os.environ["KERAS_BACKEND"] = "torch"
|
| 7 |
+
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" # Suppress TF logs
|
| 8 |
+
|
| 9 |
+
# 2. INLINE MONKEY-PATCH (Absolute priority)
|
| 10 |
+
def _patch():
|
| 11 |
+
if "tensorflow" in sys.modules: return
|
| 12 |
+
try:
|
| 13 |
+
import keras
|
| 14 |
+
tf = ModuleType("tensorflow")
|
| 15 |
+
sys.modules["tensorflow"] = tf
|
| 16 |
+
tf.keras = keras
|
| 17 |
+
sys.modules["tensorflow.keras"] = keras
|
| 18 |
+
|
| 19 |
+
# Essential submodules for 'fer'
|
| 20 |
+
import keras.models, keras.layers
|
| 21 |
+
sys.modules["tensorflow.keras.models"] = keras.models
|
| 22 |
+
sys.modules["tensorflow.keras.layers"] = keras.layers
|
| 23 |
+
|
| 24 |
+
# Support for 'tensorflow.python.keras'
|
| 25 |
+
tf_py = ModuleType("tensorflow.python")
|
| 26 |
+
sys.modules["tensorflow.python"] = tf_py
|
| 27 |
+
tf_py.keras = keras
|
| 28 |
+
sys.modules["tensorflow.python.keras"] = keras
|
| 29 |
+
print("Inline monkey-patch success.")
|
| 30 |
+
except Exception as e:
|
| 31 |
+
print(f"Inline monkey-patch failed: {e}")
|
| 32 |
+
|
| 33 |
+
_patch()
|
| 34 |
+
|
| 35 |
+
# 3. NOW PROCEED WITH OTHER IMPORTS
|
| 36 |
from fastapi import FastAPI, Request
|
| 37 |
+
|
| 38 |
from fastapi.responses import RedirectResponse
|
| 39 |
from fastapi.staticfiles import StaticFiles
|
| 40 |
from fastapi.templating import Jinja2Templates
|
backend/app/routers/emotion.py
CHANGED
|
@@ -34,10 +34,27 @@ import torch
|
|
| 34 |
import torch.nn as nn
|
| 35 |
import json
|
| 36 |
import io
|
| 37 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 38 |
|
| 39 |
router = APIRouter(prefix="/emotion", tags=["emotion"])
|
| 40 |
|
|
|
|
| 41 |
# Initialize FER Detector
|
| 42 |
detector = FER(mtcnn=False)
|
| 43 |
|
|
|
|
| 34 |
import torch.nn as nn
|
| 35 |
import json
|
| 36 |
import io
|
| 37 |
+
|
| 38 |
+
# Try to import FER with extra safety
|
| 39 |
+
try:
|
| 40 |
+
from fer import FER
|
| 41 |
+
except ImportError as e:
|
| 42 |
+
print(f"DEBUG: Initial FER import failed: {e}. Attempting manual recovery...")
|
| 43 |
+
# One more try after ensuring patch is active
|
| 44 |
+
try:
|
| 45 |
+
from app.utils.patching import patch_tensorflow_with_keras
|
| 46 |
+
patch_tensorflow_with_keras()
|
| 47 |
+
from fer import FER
|
| 48 |
+
except Exception as e2:
|
| 49 |
+
print(f"CRITICAL: FER import totally failed: {e2}")
|
| 50 |
+
# Define a dummy FER class to avoid crash, though it won't work
|
| 51 |
+
class FER:
|
| 52 |
+
def __init__(self, *args, **kwargs): pass
|
| 53 |
+
def detect_emotions(self, frame): return []
|
| 54 |
|
| 55 |
router = APIRouter(prefix="/emotion", tags=["emotion"])
|
| 56 |
|
| 57 |
+
|
| 58 |
# Initialize FER Detector
|
| 59 |
detector = FER(mtcnn=False)
|
| 60 |
|
backend/app/utils/patching.py
CHANGED
|
@@ -26,32 +26,49 @@ def patch_tensorflow_with_keras():
|
|
| 26 |
sys.modules["tensorflow.keras"] = keras
|
| 27 |
tf.keras = keras
|
| 28 |
|
| 29 |
-
#
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
sys.modules["tensorflow.keras.models"] = keras.models
|
| 34 |
-
tf.keras.models = keras.models
|
| 35 |
-
except ImportError: pass
|
| 36 |
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
tf.keras.layers = keras.layers
|
| 41 |
-
except ImportError: pass
|
| 42 |
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
|
| 55 |
print("Successfully monkey-patched tensorflow with keras.")
|
| 56 |
except Exception as e:
|
| 57 |
print(f"Warning: Failed to monkey-patch tensorflow with keras: {e}")
|
|
|
|
|
|
| 26 |
sys.modules["tensorflow.keras"] = keras
|
| 27 |
tf.keras = keras
|
| 28 |
|
| 29 |
+
# Create dummy python submodule
|
| 30 |
+
tf_python = ModuleType("tensorflow.python")
|
| 31 |
+
sys.modules["tensorflow.python"] = tf_python
|
| 32 |
+
tf.python = tf_python
|
|
|
|
|
|
|
|
|
|
| 33 |
|
| 34 |
+
# Map keras to tensorflow.python.keras
|
| 35 |
+
sys.modules["tensorflow.python.keras"] = keras
|
| 36 |
+
tf_python.keras = keras
|
|
|
|
|
|
|
| 37 |
|
| 38 |
+
# Map common submodules explicitly
|
| 39 |
+
sub_modules = [
|
| 40 |
+
"models", "layers", "backend", "utils", "callbacks",
|
| 41 |
+
"initializers", "optimizers", "regularizers", "constraints", "activations"
|
| 42 |
+
]
|
| 43 |
|
| 44 |
+
for sub in sub_modules:
|
| 45 |
+
try:
|
| 46 |
+
# Try to get from keras
|
| 47 |
+
module = getattr(keras, sub, None)
|
| 48 |
+
if not module:
|
| 49 |
+
# Try to import directly
|
| 50 |
+
import_name = f"keras.{sub}"
|
| 51 |
+
__import__(import_name)
|
| 52 |
+
module = sys.modules[import_name]
|
| 53 |
+
|
| 54 |
+
if module:
|
| 55 |
+
sys.modules[f"tensorflow.keras.{sub}"] = module
|
| 56 |
+
sys.modules[f"tensorflow.python.keras.{sub}"] = module
|
| 57 |
+
setattr(tf.keras, sub, module)
|
| 58 |
+
setattr(tf.python.keras, sub, module)
|
| 59 |
+
except (ImportError, AttributeError):
|
| 60 |
+
pass
|
| 61 |
+
|
| 62 |
+
# Add some dummy compat modules if needed
|
| 63 |
+
tf_compat = ModuleType("tensorflow.compat")
|
| 64 |
+
sys.modules["tensorflow.compat"] = tf_compat
|
| 65 |
+
tf.compat = tf_compat
|
| 66 |
+
|
| 67 |
+
tf_v1 = ModuleType("tensorflow.compat.v1")
|
| 68 |
+
sys.modules["tensorflow.compat.v1"] = tf_v1
|
| 69 |
+
tf_compat.v1 = tf_v1
|
| 70 |
|
| 71 |
print("Successfully monkey-patched tensorflow with keras.")
|
| 72 |
except Exception as e:
|
| 73 |
print(f"Warning: Failed to monkey-patch tensorflow with keras: {e}")
|
| 74 |
+
|