Spaces:
Sleeping
Sleeping
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 构建期模型预下载缓存,避免每次启动重新下载。
- Dockerfile +23 -0
- 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)
|
|
|
|
|
|
|
| 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)
|
|
|
|
|
|
|
| 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:
|