Spaces:
Runtime error
Runtime error
Harden HF runtime: no-op segmentation, safe dropdown, disable hot reload
Browse files- app.py +2 -0
- app/segmentation.py +13 -1
- app/ui.py +2 -1
app.py
CHANGED
|
@@ -7,6 +7,8 @@ from app.ui import build_ui
|
|
| 7 |
|
| 8 |
|
| 9 |
def main() -> None:
|
|
|
|
|
|
|
| 10 |
demo = build_ui()
|
| 11 |
use_queue = os.getenv("DA_USE_QUEUE")
|
| 12 |
use_queue_flag = False if use_queue is None else use_queue.lower() not in {"0", "false", "no"}
|
|
|
|
| 7 |
|
| 8 |
|
| 9 |
def main() -> None:
|
| 10 |
+
# Spaces hot reload requires newer client; disable to avoid runtime crashes.
|
| 11 |
+
os.environ.setdefault("GRADIO_HOT_RELOAD", "0")
|
| 12 |
demo = build_ui()
|
| 13 |
use_queue = os.getenv("DA_USE_QUEUE")
|
| 14 |
use_queue_flag = False if use_queue is None else use_queue.lower() not in {"0", "false", "no"}
|
app/segmentation.py
CHANGED
|
@@ -144,10 +144,15 @@ class SegmenterService:
|
|
| 144 |
self._segmenters[model_id] = SemanticSegmenter(model_id)
|
| 145 |
except Exception as exc:
|
| 146 |
print(f"[WARN] Failed to preload segmentation model {model_id}: {exc}")
|
|
|
|
| 147 |
|
| 148 |
def _get_segmenter(self, model_id: str) -> SemanticSegmenter:
|
| 149 |
if model_id not in self._segmenters:
|
| 150 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 151 |
return self._segmenters[model_id]
|
| 152 |
|
| 153 |
def get_masks(self, request: SegmenterRequest, model_id: str | None = None) -> dict[str, np.ndarray]:
|
|
@@ -186,6 +191,13 @@ class SegmenterService:
|
|
| 186 |
return result
|
| 187 |
|
| 188 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 189 |
__all__ = ["SegmenterService", "SegmenterRequest", "SemanticSegmenter"]
|
| 190 |
|
| 191 |
# Shared singleton to avoid reloads across analyzer instances
|
|
|
|
| 144 |
self._segmenters[model_id] = SemanticSegmenter(model_id)
|
| 145 |
except Exception as exc:
|
| 146 |
print(f"[WARN] Failed to preload segmentation model {model_id}: {exc}")
|
| 147 |
+
self._segmenters[model_id] = _NoOpSegmenter()
|
| 148 |
|
| 149 |
def _get_segmenter(self, model_id: str) -> SemanticSegmenter:
|
| 150 |
if model_id not in self._segmenters:
|
| 151 |
+
try:
|
| 152 |
+
self._segmenters[model_id] = SemanticSegmenter(model_id)
|
| 153 |
+
except Exception as exc:
|
| 154 |
+
print(f"[WARN] Segmentation unavailable for {model_id}; using no-op segmenter: {exc}")
|
| 155 |
+
self._segmenters[model_id] = _NoOpSegmenter()
|
| 156 |
return self._segmenters[model_id]
|
| 157 |
|
| 158 |
def get_masks(self, request: SegmenterRequest, model_id: str | None = None) -> dict[str, np.ndarray]:
|
|
|
|
| 191 |
return result
|
| 192 |
|
| 193 |
|
| 194 |
+
class _NoOpSegmenter:
|
| 195 |
+
"""Fallback segmenter when the real model cannot be loaded (e.g., gated repo)."""
|
| 196 |
+
|
| 197 |
+
def segment(self, image, max_side, prompts, score_threshold, mask_threshold):
|
| 198 |
+
return {}
|
| 199 |
+
|
| 200 |
+
|
| 201 |
__all__ = ["SegmenterService", "SegmenterRequest", "SemanticSegmenter"]
|
| 202 |
|
| 203 |
# Shared singleton to avoid reloads across analyzer instances
|
app/ui.py
CHANGED
|
@@ -146,7 +146,8 @@ def build_ui(analyzer: SafetyAnalyzer | None = None) -> gr.Blocks:
|
|
| 146 |
input_path = gr.Dropdown(
|
| 147 |
label="Input file",
|
| 148 |
choices=data_inputs,
|
| 149 |
-
value=data_inputs[0] if data_inputs else
|
|
|
|
| 150 |
info="Pick any VISLOC image under data/Image/VISLOC/.",
|
| 151 |
)
|
| 152 |
model_id = defaults.model_id
|
|
|
|
| 146 |
input_path = gr.Dropdown(
|
| 147 |
label="Input file",
|
| 148 |
choices=data_inputs,
|
| 149 |
+
value=data_inputs[0] if data_inputs else None,
|
| 150 |
+
allow_custom_value=True,
|
| 151 |
info="Pick any VISLOC image under data/Image/VISLOC/.",
|
| 152 |
)
|
| 153 |
model_id = defaults.model_id
|