yakvrz commited on
Commit
9299a29
·
1 Parent(s): 9c5a0eb

Harden HF runtime: no-op segmentation, safe dropdown, disable hot reload

Browse files
Files changed (3) hide show
  1. app.py +2 -0
  2. app/segmentation.py +13 -1
  3. 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
- self._segmenters[model_id] = SemanticSegmenter(model_id)
 
 
 
 
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