From 739953bc13a728c4de0626e3566f2e1933a35d41 Mon Sep 17 00:00:00 2001 From: admin <572701190@qq.com> Date: Sun, 3 May 2026 18:11:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=B9=E5=BD=A2Logo?= =?UTF-8?q?=E5=92=8C=E5=A4=B4=E9=A2=88=E9=83=A8CT=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 侧边栏 Logo 改为导入根目录 logo_square.png,favicon 也切换为 /logo_square.png,并让前端服务显式提供该根目录图片。 - 头颈部CT分割默认模板分类名改为纯中文,去掉括号英文翻译,颜色和 maskid 保持用户给定顺序。 - 增加旧版头颈部CT英文括号 label 的窄迁移,启动 seed 时自动把旧默认系统模板更新为纯中文默认。 - 更新前端 Logo 测试、后端默认模板和恢复出厂设置测试,覆盖纯中文分类和根目录方形 Logo。 - 更新 AGENTS、README、前端审计、需求冻结和测试计划文档,记录根目录 Logo 和头颈部CT纯中文默认分类。 --- AGENTS.md | 5 +-- README.md | 5 +-- backend/services/default_templates.py | 35 ++++++++++++------ backend/tests/test_admin.py | 20 +++++------ backend/tests/test_templates.py | 49 ++++++++++++++++++++------ doc/03-frontend-element-audit.md | 2 +- doc/07-current-requirements-freeze.md | 2 +- doc/09-test-plan.md | 2 +- index.html | 3 +- logo_square.png | Bin 0 -> 101215 bytes server.ts | 3 ++ src/components/Sidebar.test.tsx | 6 ++++ src/components/Sidebar.tsx | 3 +- 13 files changed, 94 insertions(+), 41 deletions(-) create mode 100644 logo_square.png diff --git a/AGENTS.md b/AGENTS.md index 358a072..01136b4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -56,8 +56,9 @@ Seg_Server/ ├── package.json # npm 依赖与脚本 ├── .env.example # AI Studio/Gemini 前端环境变量模板 ├── metadata.json # AI Studio 元数据 +├── logo_square.png # Sidebar 与 favicon 使用的根目录方形 Logo ├── public/ -│ └── logo.png # Sidebar 使用的 /logo.png +│ └── logo.png # 旧版保留 Logo 静态资源 ├── doc/ # 当前实现审计、接口契约和后续实施文档 ├── start_services.sh # 本地一键启动 PostgreSQL/Redis/MinIO/FastAPI/Celery/前端 ├── restart_dev_services.sh # 本地开发重启脚本;重启 FastAPI/Celery/前端并检查 3000/8000 @@ -247,7 +248,7 @@ uvicorn main:app --host 0.0.0.0 --port 8000 --reload 9. AI 分割:侧栏和工作区工具栏的 AI 智能分割入口使用 Bot + Sparkles 组合图标强化 AI 识别;前端工具包括 SAM 2.1 变体选择、正向点、反向点和框选;AI 画布会按容器和当前帧尺寸默认居中放大底图并保留边距;工作区和 AI 页面都可点击已有提示点删除单点,AI 页面也可删除最近锚点、删除选中候选或清空本页锚点;这些删除入口会限制在当前提示点/本页 AI 候选范围内,避免误删工作区已有 mask。SAM 2.1 框选会建立候选 mask,后续正/反点通过 `interactive` prompt 携带原始框和累计点细化同一个候选 mask;AI 页面框选会先固化 `promptBox`,执行分割时只框选发送 `box` prompt,框选后继续加正/反点发送 `interactive` prompt;重复执行高精度分割会替换上一次 AI 页候选,只保留最新一个候选。包含反向点时工作区会传 `options.auto_filter_background=true` 和 `min_score=0.05`,如果后端过滤为空则移除旧候选 mask。后端 `ai.py` 期望按 `image_id`、`prompt_type`、`prompt_data`、`model` 和可选 `options` 调用 SAM registry。当前 registry 暴露 `sam2.1_hiera_tiny`、`sam2.1_hiera_small`、`sam2.1_hiera_base_plus`、`sam2.1_hiera_large`,并兼容 `sam2` 作为 tiny 别名;`model=sam3` 会被拒绝,`semantic` 文本提示也被禁用。SAM 2.1 支持点/框/interactive/自动分割和 video predictor 传播;多候选默认只采用最高分区域,避免重叠候选同时显示;AI 页面只渲染本页最新生成的候选 mask,不会把工作区已有 mask 带入 AI 画布;AI 页面生成的 mask 会写入全局 `masks` 并自动选中,右侧分类树可直接改标签,推送到工作区会切到“调整多边形”并保留选择和当前帧视角。`options.crop_to_prompt` 可对点/框/interactive prompt 做局部裁剪推理并回映射,`options.auto_filter_background` 可按分数和负向点过滤结果。 10. 视频片段传播:工作区以当前打开帧作为参考帧,使用该帧全部 mask 作为 seed,并用传播起始帧和传播结束帧指定追踪范围;如果当前参考帧没有 mask,点击开始传播会提示“当前参考帧无遮罩”,不会提交任务或保存其它帧标注;用户可直接修改数字框,也可点击“自动传播”进入时间轴范围选择模式,在播放进度条或视频处理进度条上点击/拖拽选择范围,再点击“开始传播”。工作区顶栏有独立“传播权重”选择器,可为本次传播二次选择 SAM 2.1 tiny/small/base+/large 权重,不提供 SAM2/SAM3 家族切换,也不影响 AI 单帧分割权重;前端提交传播前只保存当前参考帧中的 draft/dirty mask,使 seed 优先带稳定的后端 `source_annotation_id`,再按传播权重 id、seed mask、seed 来源 id 和前/后方向组装 `steps` 并调用 `POST /api/ai/propagate/task` 创建 `propagate_masks` 后台任务;后端入队时会规范化/校验权重 id 并把规范化后的 id 写入任务 payload/result;Celery worker 顺序执行各 step,避免多个视频 tracker 并发抢占 GPU;每个 step 会根据 seed 来源 id、方向和 seed 签名做幂等判断,同权重且未改变的 seed 直接跳过,已改变或换用其他权重的 seed 会先删除同源旧自动传播标注再重传;旧版本用前端临时 `source_mask_id` 生成的传播标注会按同一参考帧、方向和语义信息兼容清理;中间帧人工新增/修改同一物体后重新传播时,后端会在写入目标帧新结果前按语义和空间重叠清理旧传播结果,且写入前清理不受旧结果传播方向限制;后端按项目帧序列下载片段帧,当前使用所选 SAM 2.1 权重变体的 `SAM2VideoPredictor.add_new_mask()` + `propagate_in_video()`,并把后续帧结果保存为 `Annotation`;若历史或外部 seed 仍带 `geometry_smoothing`,forward/backward 两个方向的传播结果保存前仍会应用同一参数;当前工作区平滑按钮应用后会直接改写实际 polygon,后续传播以新几何参与签名和追踪。工作区轮询 `GET /api/tasks/{task_id}` 展示进度并刷新标注,Dashboard 也能显示/取消/重试传播任务。 11. GT 导入:工作区左侧工具栏“导入 GT Mask”调用 `/api/ai/import-gt-mask`;选择文件后前端会显示导入结果预览,并让用户决定未知 maskid 处理方式,可舍弃未知类别,也可导入为“未定义类别”等待重新命名。后端用 `cv2.IMREAD_UNCHANGED` 读取 mask 并校验 dtype;GT 图片必须是 8-bit 灰度 maskid 图,或 8-bit RGB 三通道完全相同的 `[X,X,X]` maskid 图,0 为背景、X 为 1-255 的 maskid,16-bit/uint16 GT_label、普通彩色类别图和全背景 0 图都会返回明确错误;全背景图错误信息固定为“GT Mask 图片中没有非背景 maskid 区域。”;灰度/RGB 等通道图按模板 `maskId` 匹配类别,超出现有类别时按 `unknown_color_policy` 处理;如果 mask 图片尺寸和当前帧不同,会按当前帧长宽最近邻拉伸后再提取区域;每个连通域用高精度 contour 生成 polygon 标注,保留更多边界点并设置点数上限避免拖慢前端;导入结果与普通 mask 共用拓扑锚点统计、边缘平滑、顶点编辑、分类和保存链路;后端仍可写入 distance transform seed point 供数据兼容,但前端不显示或拖动 seed point。 -12. 模板管理:`TemplateRegistry.tsx` 管理分类、颜色、maskid 和内部覆盖顺序;所有新建、复制、批量导入和后端返回的模板都会归一化包含黑色 `[0,0,0]`、`maskid: 0` 的“待分类”保留类,该类固定在语义分类树最后,不能删除,也不能拖拽到更高层级;批量导入 JSON 支持 `[[colors], [names]]` 和 `{colors, names}` 两种格式,也兼容带“批量导入分类:”前缀、代码块、未加引号 keys、单引号、中文逗号/冒号和尾随逗号的粘贴内容,会先预览分类数量、maskid 分配起点和缺失颜色提示,语法或结构错误以内联错误展示;系统默认模板包括“腹腔镜胆囊切除术”和“头颈部CT分割”,恢复演示出厂设置只删除用户私有模板,并会重建缺失的系统默认模板、覆盖恢复被修改或删减的默认语义分类树;模板库“生效中模板架构清单”里的每个模板卡片支持鼠标点击复制,复制会创建当前用户私有副本并保留分类名称、颜色、maskid、内部层级和规则,同时重建类别内部 id;模板库详情页的分类区标题为“语义分类树(拖拽调层级)”,右上角提供“+ 新建分类”,每个分类行右侧用垃圾桶图标删除该 label,不再展示“未分类/批量导入/模板名”等来源标签;编辑模板弹窗点击分类后只编辑分类名称,不展示或编辑旧 `category` 来源元信息;如果项目中的已保存 mask 引用了当前模板里已被删除的类别,工作区打开项目回显时会把该 mask 降级为 `maskid: 0` 的“待分类”mask 并标记为待保存;模板库详情页和编辑弹窗都支持拖拽调整语义类别层级顺序,拖拽会重算 `zIndex` 并保存到后端,保存后当前详情页会立刻刷新;`OntologyInspector.tsx` 在工作区显示当前模板分类树,也支持拖拽调整内部覆盖顺序。maskid 只作为 GT_label/类别 ID,不参与排序。 +12. 模板管理:`TemplateRegistry.tsx` 管理分类、颜色、maskid 和内部覆盖顺序;所有新建、复制、批量导入和后端返回的模板都会归一化包含黑色 `[0,0,0]`、`maskid: 0` 的“待分类”保留类,该类固定在语义分类树最后,不能删除,也不能拖拽到更高层级;批量导入 JSON 支持 `[[colors], [names]]` 和 `{colors, names}` 两种格式,也兼容带“批量导入分类:”前缀、代码块、未加引号 keys、单引号、中文逗号/冒号和尾随逗号的粘贴内容,会先预览分类数量、maskid 分配起点和缺失颜色提示,语法或结构错误以内联错误展示;系统默认模板包括“腹腔镜胆囊切除术”和“头颈部CT分割”,头颈部 CT 默认分类名使用纯中文(肿瘤/结节、下颌骨、甲状腺、气管、颈椎、颈动脉、颈静脉、腮腺、下颌下腺、舌骨),恢复演示出厂设置只删除用户私有模板,并会重建缺失的系统默认模板、覆盖恢复被修改或删减的默认语义分类树;模板库“生效中模板架构清单”里的每个模板卡片支持鼠标点击复制,复制会创建当前用户私有副本并保留分类名称、颜色、maskid、内部层级和规则,同时重建类别内部 id;模板库详情页的分类区标题为“语义分类树(拖拽调层级)”,右上角提供“+ 新建分类”,每个分类行右侧用垃圾桶图标删除该 label,不再展示“未分类/批量导入/模板名”等来源标签;编辑模板弹窗点击分类后只编辑分类名称,不展示或编辑旧 `category` 来源元信息;如果项目中的已保存 mask 引用了当前模板里已被删除的类别,工作区打开项目回显时会把该 mask 降级为 `maskid: 0` 的“待分类”mask 并标记为待保存;模板库详情页和编辑弹窗都支持拖拽调整语义类别层级顺序,拖拽会重算 `zIndex` 并保存到后端,保存后当前详情页会立刻刷新;`OntologyInspector.tsx` 在工作区显示当前模板分类树,也支持拖拽调整内部覆盖顺序。maskid 只作为 GT_label/类别 ID,不参与排序。 13. 导出:工作区使用统一“分割结果导出”入口,导出前先保存待归档 mask;用户可选择整体视频、特定范围帧或当前图片,默认导出范围为当前图片,并勾选分开二值 mask、GT_label 黑白图、Pro_label 彩色图和 Mix_label 原图叠加图。选择特定范围帧时,可直接修改起止帧输入框,也可在播放进度条或视频处理进度条上点击/拖拽选择导出范围;选择 Mix_label 时可调透明度,默认 0.3,并显示当前/待导出第一帧预览。下载 ZIP 文件名使用 `{项目库项目名}_seg_T_{起始时间戳}-{结束时间戳}_P_{起始项目帧序号}-{结束项目帧序号}.zip`,项目名来自 `Project.name` 并替换文件系统不安全字符,时间戳格式为 `0h00m00s000ms`,帧号使用项目抽帧后的 1-based 顺序而非原视频帧号。后端保留兼容的 COCO JSON 和 PNG mask ZIP 接口,同时新增统一结果 ZIP;统一 ZIP 固定包含 `annotations_coco.json`、`maskid_GT像素值_类别映射.json` 和 `原始图片/`;导出时 GT_label 固定写 8-bit uint8 PNG,像素值使用类别真实 `maskid`,其中 `maskid: 0` 的“待分类”与背景同为 0,Pro_label 中也与背景同为黑色 `[0,0,0]`,缺失 `maskid` 的旧标注才补下一个可用值,正整数 maskid 超出 1-255 会拒绝导出,保证导出的 GT_label 可按同一模板再导入;选择分开 mask 时输出 `分开Mask分割结果/{视频名称_时间戳_项目帧序号}_分别导出/{视频名称_时间戳_项目帧序号}_{类别名称}_maskid{maskid}.png`,同一帧同一类别合并为一张图;选择 GT_label/Pro_label/Mix_label 时分别输出 `GT_label图/{视频名称_时间戳_项目帧序号}.png`、`Pro_label彩色分割结果/{视频名称_时间戳_项目帧序号}.png`、`Mix_label重叠覆盖彩色分割结果/{视频名称_时间戳_项目帧序号}.png`。maskid 不参与覆盖排序,GT_label/Pro_label/Mix_label 重叠区域覆盖顺序由内部拖拽排序字段决定,并与未选中状态下的 Canvas 显示顺序一致。 --- diff --git a/README.md b/README.md index f6aeb2a..0e6755c 100644 --- a/README.md +++ b/README.md @@ -139,8 +139,9 @@ Seg_Server/ ├── uploads/ # 临时上传目录 ├── frames/ # 临时帧目录 ├── doc/ # 当前实现审计、接口契约与后续实施文档 +├── logo_square.png # 侧边栏与 favicon 使用的根目录方形 Logo ├── public/ -│ └── logo.png # 侧边栏 Logo 静态资源 +│ └── logo.png # 旧版保留 Logo 静态资源 ├── start_services.sh # 一键启动所有服务脚本 ├── server.ts # Express + Vite 前端入口(不再提供旧版 mock API) ├── index.html # SPA HTML 入口 @@ -419,7 +420,7 @@ cd ~/Desktop/Seg_Server 当前项目、帧、标注、任务、Dashboard 和导出接口已经按当前 JWT 用户拥有的项目隔离;模板支持系统模板(`owner_user_id IS NULL`)和用户模板。角色分为 `admin`、`annotator`、`viewer`:`admin/annotator` 可调用写入类业务接口,`viewer` 只能读取;管理员会在侧栏看到“用户管理”,可通过 `/api/admin/users` 新增、停用/启用、改角色、改密码和删除无项目用户,并通过 `/api/admin/audit-logs` 查看登录与用户管理审计。演示部署还提供“恢复演示出厂设置”,站内二次确认后调用 `/api/admin/demo-factory-reset`,只保留默认 admin、演示视频项目和一个已按文件名自然顺序生成帧的演示 DICOM 项目。生产部署时必须在 `backend/.env` 覆盖 `JWT_SECRET_KEY` 并修改默认管理员密码。 -系统默认模板会在后端启动时幂等补齐,当前包括“腹腔镜胆囊切除术”和“头颈部CT分割”;所有新建、复制、导入和后端返回的模板都会归一化带上黑色 `maskid: 0` 的“待分类”保留类,并固定在语义分类树最后。恢复演示出厂设置只删除用户私有模板,并会按内置权威定义重建缺失的默认系统模板、覆盖恢复被修改或删减的默认语义分类树。模板库左侧“生效中模板架构清单”里的复制按钮会把任一模板复制成当前用户私有副本,并保留分类名称、颜色、maskid、内部层级顺序和规则。 +系统默认模板会在后端启动时幂等补齐,当前包括“腹腔镜胆囊切除术”和“头颈部CT分割”;头颈部 CT 默认分类名使用纯中文,不带括号英文翻译。所有新建、复制、导入和后端返回的模板都会归一化带上黑色 `maskid: 0` 的“待分类”保留类,并固定在语义分类树最后。恢复演示出厂设置只删除用户私有模板,并会按内置权威定义重建缺失的默认系统模板、覆盖恢复被修改或删减的默认语义分类树。模板库左侧“生效中模板架构清单”里的复制按钮会把任一模板复制成当前用户私有副本,并保留分类名称、颜色、maskid、内部层级顺序和规则。 --- diff --git a/backend/services/default_templates.py b/backend/services/default_templates.py index 472564f..0436b6e 100644 --- a/backend/services/default_templates.py +++ b/backend/services/default_templates.py @@ -86,16 +86,16 @@ def bundled_default_template_definitions() -> list[dict]: "classes": _with_reserved_unclassified_class(_template_classes( "头颈部CT分割", [ - "肿瘤/结节 (Tumor/Nodule)", - "下颌骨 (Mandible)", - "甲状腺 (Thyroid)", - "气管 (Trachea)", - "颈椎 (Cervical Spine)", - "颈动脉 (Carotid Artery)", - "颈静脉 (Jugular Vein)", - "腮腺 (Parotid Gland)", - "下颌下腺 (Submandibular Gland)", - "舌骨 (Hyoid Bone)", + "肿瘤/结节", + "下颌骨", + "甲状腺", + "气管", + "颈椎", + "颈动脉", + "颈静脉", + "腮腺", + "下颌下腺", + "舌骨", ], [ (255, 0, 0), @@ -115,6 +115,19 @@ def bundled_default_template_definitions() -> list[dict]: ] +def _has_legacy_head_neck_english_labels(template: Template) -> bool: + if template.name != "头颈部CT分割": + return False + classes = (template.mapping_rules or {}).get("classes") or [] + return any( + isinstance(item, dict) + and isinstance(item.get("name"), str) + and "(" in item["name"] + and ")" in item["name"] + for item in classes + ) + + def ensure_default_templates(db: Session, *, restore_existing: bool = False) -> list[Template]: """Create bundled system templates, optionally restoring existing ones exactly.""" templates: list[Template] = [] @@ -126,7 +139,7 @@ def ensure_default_templates(db: Session, *, restore_existing: bool = False) -> if existing is None: existing = Template(owner_user_id=None) db.add(existing) - elif not restore_existing: + elif not restore_existing and not _has_legacy_head_neck_english_labels(existing): templates.append(existing) continue diff --git a/backend/tests/test_admin.py b/backend/tests/test_admin.py index c36b62a..a3c74fe 100644 --- a/backend/tests/test_admin.py +++ b/backend/tests/test_admin.py @@ -189,16 +189,16 @@ def test_demo_factory_reset_leaves_admin_and_parsed_demo_dicom(client, db_sessio head_neck_classes = templates_by_name["头颈部CT分割"].mapping_rules["classes"] lap_classes = templates_by_name["腹腔镜胆囊切除术"].mapping_rules["classes"] assert [item["name"] for item in head_neck_classes] == [ - "肿瘤/结节 (Tumor/Nodule)", - "下颌骨 (Mandible)", - "甲状腺 (Thyroid)", - "气管 (Trachea)", - "颈椎 (Cervical Spine)", - "颈动脉 (Carotid Artery)", - "颈静脉 (Jugular Vein)", - "腮腺 (Parotid Gland)", - "下颌下腺 (Submandibular Gland)", - "舌骨 (Hyoid Bone)", + "肿瘤/结节", + "下颌骨", + "甲状腺", + "气管", + "颈椎", + "颈动脉", + "颈静脉", + "腮腺", + "下颌下腺", + "舌骨", "待分类", ] assert [item["maskId"] for item in head_neck_classes] == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0] diff --git a/backend/tests/test_templates.py b/backend/tests/test_templates.py index 29d66d9..6faa80c 100644 --- a/backend/tests/test_templates.py +++ b/backend/tests/test_templates.py @@ -55,16 +55,16 @@ def test_default_head_neck_ct_template_is_seeded_and_visible(client, db_session) head_neck = next(template for template in listing.json() if template["name"] == "头颈部CT分割") assert head_neck["description"] == "头颈部CT分割" expected_names = [ - "肿瘤/结节 (Tumor/Nodule)", - "下颌骨 (Mandible)", - "甲状腺 (Thyroid)", - "气管 (Trachea)", - "颈椎 (Cervical Spine)", - "颈动脉 (Carotid Artery)", - "颈静脉 (Jugular Vein)", - "腮腺 (Parotid Gland)", - "下颌下腺 (Submandibular Gland)", - "舌骨 (Hyoid Bone)", + "肿瘤/结节", + "下颌骨", + "甲状腺", + "气管", + "颈椎", + "颈动脉", + "颈静脉", + "腮腺", + "下颌下腺", + "舌骨", "待分类", ] expected_colors = [ @@ -89,3 +89,32 @@ def test_default_head_neck_ct_template_is_seeded_and_visible(client, db_session) raise AssertionError(f"Unexpected head-neck colors: {actual_colors}") if actual_mask_ids != [*list(range(1, 11)), 0]: raise AssertionError(f"Unexpected head-neck mask IDs: {actual_mask_ids}") + + +def test_default_head_neck_ct_template_migrates_legacy_english_labels(db_session): + from main import ensure_default_templates + from models import Template + + db_session.add(Template( + name="头颈部CT分割", + description="legacy", + color="#ef4444", + z_index=10, + owner_user_id=None, + mapping_rules={ + "classes": [ + {"id": "old-1", "name": "肿瘤/结节 (Tumor/Nodule)", "color": "#ff0000", "zIndex": 10, "maskId": 1}, + {"id": "reserved-unclassified", "name": "待分类", "color": "#000000", "zIndex": 0, "maskId": 0}, + ], + "rules": [], + }, + )) + db_session.commit() + + ensure_default_templates(db_session) + + templates = db_session.query(Template).filter(Template.name == "头颈部CT分割").all() + assert len(templates) == 1 + classes = templates[0].mapping_rules["classes"] + assert classes[0]["name"] == "肿瘤/结节" + assert all("(" not in item["name"] for item in classes) diff --git a/doc/03-frontend-element-audit.md b/doc/03-frontend-element-audit.md index efeaac1..2a1ebfd 100644 --- a/doc/03-frontend-element-audit.md +++ b/doc/03-frontend-element-audit.md @@ -13,7 +13,7 @@ |------|------|------|------| | 登录拦截 | `App.tsx` | 真实可用 | 未登录显示 `Login`,登录后显示主界面 | | 模块切换 | `Sidebar.tsx` + `App.tsx` | 真实可用 | 切换 `dashboard/projects/workspace/ai/templates`;“AI智能分割”入口使用 Bot + Sparkles 组合图标,强化 AI 语义 | -| Logo | `Sidebar.tsx` | 真实可用 | 使用 `/logo.png`,文件存在于 `public/logo.png` | +| Logo | `Sidebar.tsx` | 真实可用 | 侧边栏通过 Vite 资源导入使用根目录 `logo_square.png`;favicon 使用 `/logo_square.png`,前端服务会从项目根目录提供该文件 | | GPU 状态圆标 | `Sidebar.tsx` | 真实可用 | 通过 `GET /api/ai/models/status` 显示 GPU/CPU 和当前模型可用性 | ## 登录页 diff --git a/doc/07-current-requirements-freeze.md b/doc/07-current-requirements-freeze.md index 27b3250..9279a74 100644 --- a/doc/07-current-requirements-freeze.md +++ b/doc/07-current-requirements-freeze.md @@ -17,7 +17,7 @@ - 管理员侧栏显示“用户管理”入口;管理员可以新增用户、修改角色、停用/启用、修改密码、删除无项目用户。 - 系统记录登录成功/失败和用户管理操作到 `audit_logs`,管理员后台可查看最近审计日志。 - 管理员后台提供“恢复演示出厂设置”危险操作;前端必须二次确认,后端也必须校验 `confirmation=RESET_DEMO_FACTORY`,执行后只保留默认 admin 账号、系统模板、演示视频项目和一个已按文件名自然顺序生成帧的演示 DICOM 项目,清空其它用户、项目、帧、标注、任务、用户模板和旧审计记录,并写入本次重置审计。 -- 系统默认模板至少包含“腹腔镜胆囊切除术”和“头颈部CT分割”;恢复演示出厂设置不得删除系统默认模板,并必须重建缺失的默认模板、覆盖恢复被修改或删减的默认语义分类树。 +- 系统默认模板至少包含“腹腔镜胆囊切除术”和“头颈部CT分割”;头颈部 CT 默认分类名必须使用纯中文,不带括号英文翻译;恢复演示出厂设置不得删除系统默认模板,并必须重建缺失的默认模板、覆盖恢复被修改或删减的默认语义分类树。 ## R2 项目管理 diff --git a/doc/09-test-plan.md b/doc/09-test-plan.md index 1ba3183..d878673 100644 --- a/doc/09-test-plan.md +++ b/doc/09-test-plan.md @@ -40,7 +40,7 @@ | R5 | 顶点直接拖动编辑、顶点拖拽结束不改变 Canvas 视口、边中点插点、双击边界按位置插点、顶点删除、整块删除、删除传播链自动传播 mask 且保留独立 AI 推理 mask、工作区顶栏撤销/重做按钮、顶栏撤销/重做图标强调色、撤销/重做快捷键、区域合并、区域去除、布尔选择主区域黄色实线/扣除区域红色虚线、布尔选择顺序提示、hole even-odd 渲染 | `CanvasArea.test.tsx`, `VideoWorkspace.test.tsx`, `useStore.test.ts` | 已覆盖 | | R6 | SAM 2.1 变体选择、点/框/interactive、semantic 禁用、SAM 3 入口隐藏和后端拒绝、SAM 2.1 最高分候选去重、AI 页框选/框选后加点、AI 页提示工具上下文提示、AI 页重复执行替换旧候选、AI 页不渲染工作区已有 mask、AI 页可在候选 mask 上继续添加正/反点、AI 页可删除提示点、AI 页可删除选中候选、AI 页清空只移除本页候选、AI 页/右侧共享遮罩透明度只改预览 opacity、AI 页生成 mask 自动选中并可换标签、AI 页无语义候选禁止推送到工作区并用 error toast 提示、离开 AI 页时清理未分类候选、AI 页推送到工作区编辑保留选择和当前帧、SAM 2.1 视频按参考帧全部 mask 和范围自动传播、当前参考帧无遮罩提示、传播前只保存参考帧 draft/dirty seed mask、传播前独立选择 SAM 2.1 tiny/small/base+/large 权重、自动传播 Celery 任务入队、传播入队权重 id 规范化/拒绝不支持 id、传播 seed 来源 id/签名和历史平滑 metadata 兼容、历史平滑 seed 保存前对 forward/backward polygon 实际应用边缘平滑并减少密集轮廓点、边缘平滑强度缓入递进曲线、未编辑传播结果作为 seed 时继承原始签名并跳过重复传播、已编辑传播结果保留 lineage 但重算签名并清理旧结果、中间帧人工新增替代 seed 时清理下游同物体旧传播结果、中间帧 backward 传播清理旧 forward 结果、换权重传播先清理旧结果、旧临时 seed id 传播结果兼容清理、前端任务轮询进度、传播任务 runner 保存标注和结果权重 id、传播任务重试、传播空结果提示、GPU/模型状态、参数 options、polygons 转 mask | `api.test.ts`, `CanvasArea.test.tsx`, `AISegmentation.test.tsx`, `VideoWorkspace.test.tsx`, `ModelStatusBadge.test.tsx`, `test_ai.py`, `test_tasks.py`, `test_sam2_engine.py` | 已覆盖 | | R7 | 保存状态按钮“保存 X 个改动/已全部保存”、保存、保存后替换已提交 draft、查询、更新、删除标注、工作区回显、清空已保存标注、GT mask 导入和 seed point 数据兼容、导入 mask 不显示黄色 seed point、高精度 GT contour、导入 mask 拓扑统计和边缘平滑、8-bit 低数值 GT_label 图导入、16-bit/uint16 GT_label 图拒绝、全背景 0 GT_label 图拒绝并保留“没有非背景 maskid 区域”提示、RGB 等通道 maskid 图导入、导入预览、未知 maskid 导入策略、非法彩色 GT mask 拒绝、尺寸不一致自动最近邻拉伸 | `VideoWorkspace.test.tsx`, `CanvasArea.test.tsx`, `api.test.ts`, `test_ai.py` | 已覆盖 | -| R8 | 模板加载、新建、编辑、删除、删除模板站内确认、鼠标复制模板为私有副本并保留 maskid/颜色/层级/规则、所有模板归一化包含黑色 `maskid:0`“待分类”保留类、保留类固定最后且不可删除/拖拽上移、详情页标题/新建分类/垃圾桶删 label、编辑弹窗分类编辑不显示旧 category 来源元信息、默认模板“腹腔镜胆囊切除术”和“头颈部CT分割”幂等 seed、恢复出厂设置保留并权威恢复系统模板、默认模板缺失后重建、默认语义分类树被修改/删减后覆盖恢复、编辑后详情页刷新、详情页和编辑弹窗拖拽语义层级顺序、拖拽保存 `zIndex` 且不改变 maskid、JSON 分类导入预览、数组/对象/常见粘贴格式导入、JSON 错误内联提示、保存错误非阻塞提示、mapping_rules 映射、后端 CRUD | `TemplateRegistry.test.tsx`, `TransientNotice.test.tsx`, `api.test.ts`, `test_templates.py`, `test_admin.py` | 已覆盖 | +| R8 | 模板加载、新建、编辑、删除、删除模板站内确认、鼠标复制模板为私有副本并保留 maskid/颜色/层级/规则、所有模板归一化包含黑色 `maskid:0`“待分类”保留类、保留类固定最后且不可删除/拖拽上移、详情页标题/新建分类/垃圾桶删 label、编辑弹窗分类编辑不显示旧 category 来源元信息、默认模板“腹腔镜胆囊切除术”和“头颈部CT分割”幂等 seed、头颈部 CT 默认分类名纯中文且不带括号英文翻译、恢复出厂设置保留并权威恢复系统模板、默认模板缺失后重建、默认语义分类树被修改/删减后覆盖恢复、编辑后详情页刷新、详情页和编辑弹窗拖拽语义层级顺序、拖拽保存 `zIndex` 且不改变 maskid、JSON 分类导入预览、数组/对象/常见粘贴格式导入、JSON 错误内联提示、保存错误非阻塞提示、mapping_rules 映射、后端 CRUD | `TemplateRegistry.test.tsx`, `TransientNotice.test.tsx`, `api.test.ts`, `test_templates.py`, `test_admin.py` | 已覆盖 | | R9 | 模板选择、面板标题简化、工作区遮罩透明度滑杆、分类展示、分类选择、模板类别删除后项目旧 mask 回显为 `maskid:0` 待分类、分类树拖拽调整内部覆盖顺序且不改变 maskid、拖拽后同步同类 mask 层级并标记待保存、点击 mask 自动聚焦对应分类、已选 mask 换标签并置顶显示、分类变更同步同一传播链前后帧对应 mask、自定义分类写入后端模板、目标实例标题显示当前 mask label、隐藏当前选中区域计数、隐藏后端模型置信度、后端拓扑属性分析、拓扑锚点真实顶点计数、分析请求 abort/cancel 静默忽略且旧请求不覆盖新状态、边缘平滑强度防抖预览、边缘平滑应用后确认 dirty、平滑作为实际几何编辑、平滑同步传播链对应 mask、平滑撤销/重做、平滑应用后强度归零、占位状态 | `OntologyInspector.test.tsx`, `VideoWorkspace.test.tsx`, `CanvasArea.test.tsx`, `useStore.test.ts`, `test_ai.py` | 已覆盖 | | R10 | Dashboard 概览、任务进度区、最近完成任务保留显示、活动日志、WebSocket progress/complete/error/status/cancelled、取消/重试/详情、连接状态回调、heartbeat | `Dashboard.test.tsx`, `websocket.test.ts`, `test_dashboard.py`, `test_main.py`, `test_progress_events.py`, `test_tasks.py` | 已覆盖 | | R11 | 统一“分割结果导出”下拉、整体视频/特定范围帧/当前图片导出、特定范围帧时间轴拖拽选择、ZIP 文件名 `{项目库项目名}_seg_T_{起始时间戳}-{结束时间戳}_P_{起始项目帧序号}-{结束项目帧序号}.zip`、时间戳 `0h00m00s000ms` 格式、项目帧序号使用抽帧后 1-based 顺序、分开 Mask/GT_label/Pro_label/Mix_label outputs、Mix_label 透明度、导出前保存、兼容 COCO/PNG ZIP 路径、JSON/ZIP 结构、maskid/GT 像素值映射、原始图片导出、分开 Mask 按帧子目录与同类合并命名、GT_label/Pro_label/Mix_label 命名、GT/Pro/Mix 内部优先级融合且和语义分类树顺序一致、GT_label 固定 uint8、GT_label 背景 0、保留类别真实 maskid、`maskid:0` 待分类导出为黑色 0、正整数 maskid 超出 1-255 拒绝导出、导出的 GT_label 可按同一模板导回 | `VideoWorkspace.test.tsx`, `api.test.ts`, `test_export.py` | 已覆盖 | diff --git a/index.html b/index.html index 74eb0e9..ee1b458 100644 --- a/index.html +++ b/index.html @@ -2,7 +2,7 @@ - + 语义分割系统 SegServer @@ -11,4 +11,3 @@ - diff --git a/logo_square.png b/logo_square.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9ee7e222feb7bc438d9a3752b172ed0e569505 GIT binary patch literal 101215 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%0Dm@X7@4rYwPunif5<;7-I7~T8)spTkQM}y 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 z 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

?IybFnJto4d3_5u@RN3tJv9Jy_92}ei9*Aw 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 FV1nvpN0$Hq literal 0 HcmV?d00001 diff --git a/server.ts b/server.ts index b0afc05..6016ecf 100644 --- a/server.ts +++ b/server.ts @@ -7,6 +7,9 @@ async function startServer() { const PORT = 3000; app.use(express.json()); + app.get("/logo_square.png", (_req, res) => { + res.sendFile(path.join(process.cwd(), "logo_square.png")); + }); // Vite middleware for development if (process.env.NODE_ENV !== "production") { diff --git a/src/components/Sidebar.test.tsx b/src/components/Sidebar.test.tsx index e88ab5e..89673e6 100644 --- a/src/components/Sidebar.test.tsx +++ b/src/components/Sidebar.test.tsx @@ -38,4 +38,10 @@ describe('Sidebar', () => { expect(screen.getByTitle('AI智能分割').querySelector('[data-testid="ai-segmentation-icon"]')).toBeInTheDocument(); }); + + it('uses the root logo_square asset for the sidebar logo', () => { + render(); + + expect(screen.getByAltText('Logo')).toHaveAttribute('src', expect.stringContaining('logo_square')); + }); }); diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index b6a34da..338d392 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -5,6 +5,7 @@ import type { ActiveModule } from '../App'; import { ModelStatusBadge } from './ModelStatusBadge'; import { useStore } from '../store/useStore'; import { AiSegmentationIcon } from './AiSegmentationIcon'; +import logoSquareUrl from '../../logo_square.png'; interface SidebarProps { activeModule: ActiveModule; @@ -26,7 +27,7 @@ export function Sidebar({ activeModule, setActiveModule }: SidebarProps) { return (