isLinXu commited on
Commit
ed345e7
·
1 Parent(s): 368c289

fix(single-task): 修复 CAPTION 等文本任务 'str' object has no attribute 'get'

Browse files

_extract_detections / _extract_polygons 中 block = parsed.get(prompt) or {}
对 CAPTION 任务返回的字符串值不生效,后续 block.get('bboxes') 崩溃。
改为 isinstance(block, dict) 显式检查。

同时增加 Dockerfile 构建期模型预下载缓存,避免每次启动重新下载。

Files changed (2) hide show
  1. Dockerfile +23 -0
  2. app.py +6 -2
Dockerfile CHANGED
@@ -37,6 +37,28 @@ RUN pip install --no-cache-dir --no-build-isolation -e /app/
37
  # 版本成为最终生效版本(覆盖本地包解析出的较新版本,避免模板兼容性 bug)
38
  RUN pip install --no-cache-dir -r /app/requirements.txt
39
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  # 暴露 Hugging Face Spaces 默认端口
41
  EXPOSE 7860
42
 
@@ -47,6 +69,7 @@ ENV FLORENCE_MODE=embedded
47
  ENV FLORENCE_DEVICE=auto
48
  ENV FLORENCE_WEBUI_HOST=0.0.0.0
49
  ENV FLORENCE_WEBUI_PORT=7860
 
50
 
51
  # 启动命令
52
  CMD ["python", "app.py"]
 
37
  # 版本成为最终生效版本(覆盖本地包解析出的较新版本,避免模板兼容性 bug)
38
  RUN pip install --no-cache-dir -r /app/requirements.txt
39
 
40
+ # ---------------------------------------------------------------------------
41
+ # 预下载模型权重到镜像层(构建期缓存),避免每次启动时再从 HF Hub 下载。
42
+ # - 通过 build-arg FLORENCE_MODEL 控制要预缓存的模型(默认 base)。
43
+ # - Florence-2 含自定义远程代码,需 allow_patterns 拉取 *.py,并在运行时
44
+ # 保持 trust_remote_code=True。
45
+ # - 缓存写入 HF_HOME,运行时同路径命中,离线可用。
46
+ # ---------------------------------------------------------------------------
47
+ ENV HF_HOME=/app/.cache/huggingface
48
+ ENV HF_HUB_ENABLE_HF_TRANSFER=0
49
+
50
+ ARG FLORENCE_MODEL=microsoft/Florence-2-base
51
+ RUN python -c "from huggingface_hub import snapshot_download; \
52
+ import os; m=os.environ.get('PRELOAD_MODEL') or '${FLORENCE_MODEL}'; \
53
+ print('Pre-downloading model:', m); \
54
+ snapshot_download(repo_id=m, \
55
+ allow_patterns=['*.json','*.txt','*.py','*.bin','*.safetensors','*.model','*.tokenizer*','vocab*','merges*'], \
56
+ ignore_patterns=['*.msgpack','*.h5','*.onnx','*.ot']); \
57
+ print('Model cached under', os.environ.get('HF_HOME'))"
58
+
59
+ # 让运行时默认使用已预缓存的模型,并优先离线命中缓存(缓存缺失时仍可联网回退)
60
+ ENV FLORENCE_MODEL=${FLORENCE_MODEL}
61
+
62
  # 暴露 Hugging Face Spaces 默认端口
63
  EXPOSE 7860
64
 
 
69
  ENV FLORENCE_DEVICE=auto
70
  ENV FLORENCE_WEBUI_HOST=0.0.0.0
71
  ENV FLORENCE_WEBUI_PORT=7860
72
+ # 注: HF_HOME / FLORENCE_MODEL 已在上方预下载阶段设置,运行时复用同一缓存
73
 
74
  # 启动命令
75
  CMD ["python", "app.py"]
app.py CHANGED
@@ -264,7 +264,9 @@ def _extract_detections(parsed: Any, task_prompt: str) -> List[Dict[str, Any]]:
264
  """从 Florence-2 post_process 结果中提取 bbox 检测,统一为可视化格式。"""
265
  if not isinstance(parsed, dict):
266
  return []
267
- block = parsed.get(task_prompt) or {}
 
 
268
  bboxes = block.get("bboxes") or []
269
  labels = block.get("labels") or block.get("bboxes_labels") or []
270
  dets: List[Dict[str, Any]] = []
@@ -278,7 +280,9 @@ def _extract_polygons(parsed: Any, task_prompt: str) -> List[List[float]]:
278
  """从 post_process 结果中提取分割多边形点序列。"""
279
  if not isinstance(parsed, dict):
280
  return []
281
- block = parsed.get(task_prompt) or {}
 
 
282
  polygons = block.get("polygons") or []
283
  flat: List[List[float]] = []
284
  for inst in polygons:
 
264
  """从 Florence-2 post_process 结果中提取 bbox 检测,统一为可视化格式。"""
265
  if not isinstance(parsed, dict):
266
  return []
267
+ block = parsed.get(task_prompt)
268
+ if not isinstance(block, dict):
269
+ return []
270
  bboxes = block.get("bboxes") or []
271
  labels = block.get("labels") or block.get("bboxes_labels") or []
272
  dets: List[Dict[str, Any]] = []
 
280
  """从 post_process 结果中提取分割多边形点序列。"""
281
  if not isinstance(parsed, dict):
282
  return []
283
+ block = parsed.get(task_prompt)
284
+ if not isinstance(block, dict):
285
+ return []
286
  polygons = block.get("polygons") or []
287
  flat: List[List[float]] = []
288
  for inst in polygons: