docs: 任务书 02 CEUS 定量;待定问题 07、08;CEUS 运行产物改放 runs/ceus/
- 任务书 02:先修 C14(关键图问题改为跳过单例);四阶段迁移 ceus、segment、 ceus_quant、build 装入 8 张图中的 7 张关键帧与 tic.json;过一轮「硕士生阅读」 - 负责人 2026-10-16:MedSAM2 从远程拷贝最快;任务书一份;紫圈阈值先照搬并记待定问题; CEUS 整例失败跳过、拟合不过只缺 D1–D4,两点认可 - 待定问题 07(超声图上烧录的性别年龄)、08(紫圈颜色阈值是占位值) - 结构.md:CEUS 运行产物进 runs/ceus/(会进资料库与论文,需可追溯),work/ 只放分割缓存 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -19,6 +19,8 @@
|
|||||||
|
|
||||||
## 未完成
|
## 未完成
|
||||||
|
|
||||||
|
- 2026-10-16 任务书 01 由执行者完成(提交 bceb01e),监督者验收通过:真实 40 例进库 34、跳过 6(C10 跨表不一致),独立脚本核对资料库内容与跳过名单一致,泄露扫描 0 命中。
|
||||||
|
|
||||||
- `结构.md` 按负责人要求对照 ClinDB 的 `结构.md` 重写后,重写版还没再过一轮「硕士生阅读」(design 0002 与上一版结构文档过过)。
|
- `结构.md` 按负责人要求对照 ClinDB 的 `结构.md` 重写后,重写版还没再过一轮「硕士生阅读」(design 0002 与上一版结构文档过过)。
|
||||||
|
|
||||||
## 关键决定
|
## 关键决定
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
|
|
||||||
| 段 | 做什么 | 输入 → 输出 | 旧项目状态 |
|
| 段 | 做什么 | 输入 → 输出 | 旧项目状态 |
|
||||||
| --- | --- | --- | --- |
|
| --- | --- | --- | --- |
|
||||||
| CEUS 定量 | 从超声造影视频里追踪病灶、画出亮度曲线、拟合、挑关键帧、算灌注指标 | `data/` 的视频 → `work/` | 算法约 7.3k 行,40 例跑通 34 例(旧项目远程结果清单);两条路径行为不一致,映射锚点按 1856 宽素材写死(design 0002 决定 4) |
|
| CEUS 定量 | 从超声造影视频里追踪病灶、画出亮度曲线、拟合、挑关键帧、算灌注指标 | `data/` 的视频 → `runs/ceus/`(分割缓存在 `work/`) | 算法约 7.3k 行,40 例跑通 34 例(旧项目远程结果清单);两条路径行为不一致,映射锚点按 1856 宽素材写死(design 0002 决定 4) |
|
||||||
| 装配两个库 | 读交付包,按白名单把每路允许的内容写进给专家的资料库,把答案写进标准答案库 | `data/` + `work/` → `library/`、`answers/` | 列白名单和编号规范化有,但按旧样本 `1.2-TEST` 写死了工作表名和列名,读不了 40 例交付包 |
|
| 装配两个库 | 读交付包,按白名单把每路允许的内容写进给专家的资料库,把答案写进标准答案库 | `data/` + `work/` → `library/`、`answers/` | 列白名单和编号规范化有,但按旧样本 `1.2-TEST` 写死了工作表名和列名,读不了 40 例交付包 |
|
||||||
| 会诊 | 三个专家各读自己那一路,按会诊流程给出判断 | `library/` → `runs/` | 没有,只有三版设计文档 |
|
| 会诊 | 三个专家各读自己那一路,按会诊流程给出判断 | `library/` → `runs/` | 没有,只有三版设计文档 |
|
||||||
| 评价 | 会诊结论对金标准;专家抽取的字段对医生标注 | `runs/` + `answers/` → `runs/<运行号>/eval/` | 没有;写过一套评估骨架,因缺陷和无人使用而删除 |
|
| 评价 | 会诊结论对金标准;专家抽取的字段对医生标注 | `runs/` + `answers/` → `runs/<运行号>/eval/` | 没有;写过一套评估骨架,因缺陷和无人使用而删除 |
|
||||||
@@ -55,8 +55,8 @@ data/交付包_20260908_40例/ 医院原始资料(只读)
|
|||||||
ceus + segment(显卡) │
|
ceus + segment(显卡) │
|
||||||
│ │
|
│ │
|
||||||
▼ ▼
|
▼ ▼
|
||||||
work/ 中间文件 ─────────► ② 装配两个库 config/build.yaml
|
runs/ceus/<运行号>/ ────► ② 装配两个库 config/build.yaml
|
||||||
(可删掉重算) scripts/build.py config/code_maps.yaml
|
(work/ 放分割缓存) scripts/build.py config/code_maps.yaml
|
||||||
delivery → build
|
delivery → build
|
||||||
┌─────────┴──────────┐
|
┌─────────┴──────────┐
|
||||||
▼ ▼
|
▼ ▼
|
||||||
@@ -86,7 +86,8 @@ work/ 中间文件 ─────────► ② 装配两个库
|
|||||||
|
|
||||||
- **给专家的资料库**(`library/`):AI 专家能看到的一切。每次装配是一个新目录,叫一次**构建**。
|
- **给专家的资料库**(`library/`):AI 专家能看到的一切。每次装配是一个新目录,叫一次**构建**。
|
||||||
- **标准答案库**(`answers/`):病理诊断、化名与真实病例号的对照、跳过清单(没进资料库的病例及原因),将来还有医生标注工作簿。只给评价用。
|
- **标准答案库**(`answers/`):病理诊断、化名与真实病例号的对照、跳过清单(没进资料库的病例及原因),将来还有医生标注工作簿。只给评价用。
|
||||||
- **中间文件**(`work/`):CEUS 定量的工作产物,可以删掉重算。
|
- **CEUS 运行**(`runs/ceus/<运行号>/`):一次 CEUS 定量的产物(轮廓、曲线、关键帧、指标),会装进资料库、可能写进论文,所以和会诊运行一样只追加不删(`AGENTS.md` 硬性约束 5)。
|
||||||
|
- **中间文件**(`work/`):可以删掉重算的东西,目前只有 MedSAM2 分割结果的缓存。
|
||||||
- **运行**:一次会诊或评价,产物放在 `runs/` 下一个新目录里,只追加不删。
|
- **运行**:一次会诊或评价,产物放在 `runs/` 下一个新目录里,只追加不删。
|
||||||
- **账本**:一次会诊运行里每次调用模型的记录(请求、回复、用量、结局),存为 SQLite,只追加。
|
- **账本**:一次会诊运行里每次调用模型的记录(请求、回复、用量、结局),存为 SQLite,只追加。
|
||||||
- **关键帧**:从 CEUS 视频里挑出交给超声专家的 7 张图,定义见第四部分。
|
- **关键帧**:从 CEUS 视频里挑出交给超声专家的 7 张图,定义见第四部分。
|
||||||
@@ -146,7 +147,7 @@ work/ 中间文件 ─────────► ② 装配两个库
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 四、两个库与 CEUS 中间文件的内容
|
## 四、两个库与 CEUS 定量产物的内容
|
||||||
|
|
||||||
### 给专家的资料库(`library/<构建号>/`)
|
### 给专家的资料库(`library/<构建号>/`)
|
||||||
|
|
||||||
@@ -184,7 +185,9 @@ library/<构建号>/
|
|||||||
- 跳过清单:没进资料库的病例、没过的那一项检查、涉及的文件和列,以及对不上的各表原值,供医生核对。40 例里已知有 6 例临床表与超声表对不上(`../待定问题/04-交付数据的跨表不一致.md`),会出现在这份清单里;
|
- 跳过清单:没进资料库的病例、没过的那一项检查、涉及的文件和列,以及对不上的各表原值,供医生核对。40 例里已知有 6 例临床表与超声表对不上(`../待定问题/04-交付数据的跨表不一致.md`),会出现在这份清单里;
|
||||||
- 将来加医生标注工作簿。
|
- 将来加医生标注工作簿。
|
||||||
|
|
||||||
### CEUS 中间文件(`work/`)
|
### CEUS 定量的产物(`runs/ceus/` 与 `work/`)
|
||||||
|
|
||||||
|
每次运行的产物写进 `runs/ceus/<运行号>/`,只追加;第 3 步的分割结果按下表的键缓存在 `work/`,可以删掉重算。具体布局见 `../任务书/02-CEUS定量.md`。
|
||||||
|
|
||||||
CEUS 定量按下面的阶段进行(旧项目的阶段划分,迁移时逐模块核对):
|
CEUS 定量按下面的阶段进行(旧项目的阶段划分,迁移时逐模块核对):
|
||||||
|
|
||||||
@@ -229,8 +232,8 @@ X 是超声报告工作簿的「推注开始时间s」,含义是视频第 0
|
|||||||
| `prompts/` | 版本化的提示词文件;每次运行记下所用提示词的哈希 | 是 |
|
| `prompts/` | 版本化的提示词文件;每次运行记下所用提示词的哈希 | 是 |
|
||||||
| `data/` | 医院交付的原始资料 | 否 |
|
| `data/` | 医院交付的原始资料 | 否 |
|
||||||
| `library/`、`answers/` | 两个库,每次构建一个目录 | 否 |
|
| `library/`、`answers/` | 两个库,每次构建一个目录 | 否 |
|
||||||
| `work/` | CEUS 中间文件 | 否 |
|
| `work/` | 可以删掉重算的中间文件,目前只有分割缓存 | 否 |
|
||||||
| `runs/` | 会诊与评价的运行,只追加不删 | 否 |
|
| `runs/` | CEUS 定量、会诊与评价的运行,只追加不删 | 否 |
|
||||||
| `models/` | 模型权重 | 否 |
|
| `models/` | 模型权重 | 否 |
|
||||||
| `reference/`、`reference-pdf/` | 旧项目副本、外部代码、文献原文 | 否 |
|
| `reference/`、`reference-pdf/` | 旧项目副本、外部代码、文献原文 | 否 |
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,228 @@
|
|||||||
|
# 任务书 02:CEUS 定量
|
||||||
|
|
||||||
|
把旧项目的 CEUS(超声造影视频)定量算法迁到本仓库,在本机显卡上跑完全部病例。对每段视频,程序要圈出病灶、画出亮度随时间变化的曲线、挑出关键帧、算出灌注指标,最后由 build 把每例的 7 张关键帧和指标装进资料库的超声一路。资料库里原有医生截的关键结构图,加上这 7 张,一共 8 张图。
|
||||||
|
|
||||||
|
对应 `research-wiki/explanation/结构.md` 第七部分第 3 步。前提:任务书 01 已完成(提交 bceb01e)。
|
||||||
|
|
||||||
|
一份任务书分四个阶段,每个阶段做完单独提交,四个阶段都完成后一起交报告(负责人 2026-10-16:「任务书一份」)。
|
||||||
|
|
||||||
|
来源:
|
||||||
|
|
||||||
|
- 负责人 2026-10-16 定:CEUS 代码「直接一个个迁移」,不在本机重跑旧代码作对比基线(design 0002 决定 4)。
|
||||||
|
- 负责人 2026-10-16 定:「推注开始时间s」是视频第 0 秒时已经推注了多少秒;40 例没有医生标的造影剂到达时间,关键帧全部由程序从曲线上算或按推注时间取(design 0002 决定 5、6)。
|
||||||
|
- 负责人 2026-10-16 定:MedSAM2 用最快的方式装(从远程服务器拷代码和权重);紫圈的颜色阈值先照搬旧值,记为待定问题(`待定问题/08`);先把关键帧和指标放进资料库,「一个患者的资料库中有 8 帧」。
|
||||||
|
- 其余做法(四处已知问题怎么改、中间文件的布局、复用的键、对外接口)是监督者 2026-10-16 提出的,负责人确认任务书时一并认可。
|
||||||
|
|
||||||
|
## 先认识几个词
|
||||||
|
|
||||||
|
- **CEUS、造影画面**:往静脉推注造影剂后连续录下的超声视频。超声机录像时屏幕左右各一半:一半是造影画面(造影剂到了就变亮),另一半是普通灰阶超声画面。哪一半是造影画面,各例不一定相同。
|
||||||
|
- **绿框**:医生在造影画面上画的病灶框,烧录在视频里。
|
||||||
|
- **紫圈**:医生用紫色轮廓圈的一块正常胰腺(003、010、012 例圈的是肝,033 例没有),用作对照(`待定问题/08`)。
|
||||||
|
- **提示帧**:绿框位置或形状明显变化的那几帧。程序把这几帧的绿框交给分割模型,告诉它「病灶在这里」。
|
||||||
|
- **MedSAM2**:医学图像分割模型(GitHub `bowang-lab/MedSAM2`),给它几帧的提示,它能把病灶轮廓传播到整段视频的每一帧。要用显卡,是整个流程里最慢的一步。
|
||||||
|
- **ROI**:最终圈出的病灶区域。**暗区**:病灶里装囊液、不进造影剂、一直发黑的部分。
|
||||||
|
- **TIC**(时间-强度曲线):ROI 平均亮度随时间的变化,先变亮再变暗。用 Lognormal(对数正态)形状的光滑曲线去拟合它,后面的时刻和指标都在拟合出的光滑曲线上算。
|
||||||
|
- **关键帧**:B0(刚开始变亮之前)、D1(开始变亮)、D2(变亮最快)、D3(最亮)、D4(变暗最快)这 5 张从拟合曲线上取;F1、F2 是推注后第 20、60 秒。定义见 `结构.md` 第四部分「CEUS 中间文件」。
|
||||||
|
- **灌注指标**:从拟合曲线算出的 11 个数(峰值强度、达峰时间、洗入速率等),口径仿照商用造影定量软件 VueBOX。
|
||||||
|
- **`work/`**:中间文件目录,不进 git,可以删掉重算。
|
||||||
|
- **两套编号**:本任务书的「第一阶段」到「第四阶段」是你交付的四个阶段;「第 1 步」到「第 9 步」是一段视频在 CEUS 定量里依次经过的 9 步(`结构.md` 第四部分有表):1 解码与分屏,2 找绿框、选提示帧,3 MedSAM2 分割,4 整理轮廓(平滑、与绿框融合),5 找暗区,6 TIC 采样,7 拟合,8 关键帧,9 灌注指标。
|
||||||
|
- **在哪一半上分割**:沿用旧代码。绿框画在造影那一半;造影画面里病灶边界随造影剂进出时明时暗,所以旧代码把绿框挪到灰阶那一半,让 MedSAM2 在灰阶画面上分割,再把轮廓挪回造影那一半,在造影画面上采亮度。
|
||||||
|
- **监督者**:和负责人讨论、写任务书并验收的会话;执行者是拿着这份任务书写代码的你。
|
||||||
|
|
||||||
|
## 开工前先读
|
||||||
|
|
||||||
|
- `AGENTS.md`:全部,尤其是「不设默认值」「罕见情况怎么办」「错误怎么处理」「测试」。
|
||||||
|
- `research-wiki/explanation/结构.md`:第二部分(框架图)、第三部分(ceus、segment 的职责和「几条边界」)、第四部分(「CEUS 定量的产物」的 9 步和关键帧表)、第五部分(「配置」、文件格式、导入契约)、第八部分(任务书 01 已有的接口)。
|
||||||
|
- `research-wiki/design/0002-四段流水线与两个库.md`:决定 4、5、6。
|
||||||
|
- `research-wiki/待定问题/01`(绿框在最终轮廓里占多少)、`02`(参数何时冻结)、`07`(图上的信息栏)、`08`(紫圈阈值)。这一步都不处理,只要知道它们存在、不要顺手改。
|
||||||
|
- `research-wiki/任务书/01-装配两个库.md` 和 `src/cadx/` 现有代码。
|
||||||
|
- 旧代码(只读,路径相对 `reference/CADx-4-CAD/`):
|
||||||
|
- `app/domain/ceus_roi/` 除 `service.py` 外的 17 个模块,约 7300 行,都不依赖数据库或 HTTP。
|
||||||
|
- `app/providers/video_decoder.py`(视频解码)。
|
||||||
|
- 实际跑出 40 例结果的三个脚本:`debugs/t1_local_debug.py` 做第 1–6 步,用子进程调 `debugs/medsam2_local_track.py` 做分割;`debugs/tic_lognormal_replay.py` 读轨迹,做 TIC、拟合、关键帧和指标。**迁移时以这条路径的行为为准**,`service.py` 不搬。
|
||||||
|
- `config/ceus_roi_default.yaml`:108 个参数。
|
||||||
|
- `tests/unit/` 下 19 个算法测试文件(约 303 个测试,全用合成数据)。
|
||||||
|
|
||||||
|
**旧测试怎么接新配置**:配置去掉默认值以后,旧测试里靠默认值构造配置的地方,改成由一个夹具读入 `config/ceus.yaml`,需要不同取值的测试用 `model_copy(update=...)` 改那一项;断言和预期值不改。
|
||||||
|
|
||||||
|
**旧脚本里的编排逻辑放哪**:两个 debug 脚本里按顺序调用各模块的那部分逻辑,收进 ceus 对外的两段接口(第二阶段「ceus 对外交出什么」);`scripts/ceus_quant.py` 只管读配置、找病例、读写文件、分割缓存和逐例循环。
|
||||||
|
|
||||||
|
**病人资料不进任何文字**:报告、提交说明、测试、日志里只写结构和计数,不写病例号、视频号、诊断和报告原文。
|
||||||
|
|
||||||
|
## 先修任务书 01 的一处
|
||||||
|
|
||||||
|
任务书 01 的执行者报告:关键图格式不对(不是 PNG、16 位、带透明)时,`library` 抛 `ValueError`,整次构建停下。这是只落在一个病例上的问题,按 `AGENTS.md`「错误怎么处理」应该跳过这一例。
|
||||||
|
|
||||||
|
要做:
|
||||||
|
|
||||||
|
- library 提供 `check_key_image(path) -> str | None`:能原样重编码时返回 None,不能时返回原因。现在 `_write_clean_png` 里的那几条判断移到这里。
|
||||||
|
- build 在写资料库之前对每例调它,返回原因的,这一例跳过,记为 **C14**「关键图能原样重编码」,涉及值写原因。
|
||||||
|
- `_write_clean_png` 里的判断保留为断言性质的报错(走到这里说明 build 漏了检查)。
|
||||||
|
- 补测试:一例关键图带透明,这一例被跳过、记 C14、其余照常进库。
|
||||||
|
- `结构.md` 第八部分相应几行改掉。
|
||||||
|
|
||||||
|
和第一阶段一起提交,提交说明里写明。
|
||||||
|
|
||||||
|
## 第一阶段:底层和分割之前的算法
|
||||||
|
|
||||||
|
迁移以下模块到 `src/cadx/ceus/`(文件名加 `_` 前缀,对外只经 `__init__.py`):geometry、视频解码(旧 `video_decoder.py`)、配置(旧 `research_config.py`)、split_screen、green_prompt、prompt_frames、mapping。
|
||||||
|
|
||||||
|
### 怎么迁
|
||||||
|
|
||||||
|
- 逐个模块照旧代码搬,去掉产品层的东西(数据库、settings、日志框架、`app.*` 的引用),注释和 docstring 改成中文、只写现在做什么和为什么。
|
||||||
|
- 对应的旧测试一起搬,改 import,断言和预期值不改。旧测试要是因为下面「四处要改的地方」而不再成立,删掉或改写那一条,在报告里逐条列出。
|
||||||
|
- 视频解码:旧代码先把整段视频读成字节、写临时文件,再整段读进内存。改成直接按路径用 cv2 打开、逐帧读。行为(读出的帧和时间戳)不变。`test_video_decoder` 原来要一段真实样例视频,改成在测试里用 cv2 现造一段几十帧的小视频。
|
||||||
|
|
||||||
|
### 配置
|
||||||
|
|
||||||
|
- 旧 `research_config.py` 的 22 个 pydantic 配置类搬过来,**去掉全部默认值**(旧 schema 里约 134 处),每个字段必填;`strict=True`、`extra="forbid"`、`frozen=True`,规则同 `结构.md` 第五部分「配置」。
|
||||||
|
- 新建 `config/ceus.yaml`:数值逐个照抄旧 `ceus_roi_default.yaml`。每个参数的注释写明出处:旧 yaml 注释里引的出处(临床口径契约、旧 findings、旧 design)照抄并注明「出自旧项目」;没有出处的写「旧项目工程侧定的,无出处」。不改任何数值(`待定问题/02`)。
|
||||||
|
- `ceus.yaml` 分三段:`paths`(交付包位置、`runs/` 和 `work/` 位置)、`segment`(分割设置,第二阶段加)、`ceus`(算法参数)。字段定义各归其主:`ceus` 段归 ceus,`segment` 段归 segment,最外层和 `paths` 由 `scripts/ceus_quant.py` 定义,它读整份文件、把各段交给各自的模型校验。第一阶段先只有 `paths` 和 `ceus` 两段。
|
||||||
|
- 下面「四处要改的地方」用不到的旧字段(映射锚点、`source_view`、只给 `service.py` 用的裁黑边设置、D1 取医生时刻的那个模式开关)直接删掉,不留着不用。
|
||||||
|
|
||||||
|
### 四处要改的地方
|
||||||
|
|
||||||
|
这四处在旧代码里是错的,或者在 40 例上会出问题,按下面改,各配手算预期值的测试。
|
||||||
|
|
||||||
|
1. **左右两半之间的坐标换算。** 程序要把造影画面上的绿框挪到另一半画面的同一位置。两半大小相同、只差一个水平平移,旧代码却把换算用的锚点按某一种视频宽度(1856 像素)写死成像素坐标(旧 yaml 第 45–49 行、旧 `mapping.py:91`),40 例有 5 种宽度,其余宽度会挪偏一两百像素。改成:平移量 = 目标那一半视图的左上角 − 造影那一半视图的左上角,直接用第 1 步切分出来的两个视图矩形算。测试:至少 3 种宽度,手算平移量。
|
||||||
|
2. **造影画面在哪一半。** 旧代码配置写死造影在左半(旧 yaml 第 15–16 行),013 例造影在右半,找不到绿框。改成:两半各自按旧代码的办法选提示帧(`collect_prompt_observations` + `select_prompt_frames`,参数不变),选出至少一帧就算「这一半有绿框」;恰好一半有,这一半就是造影画面;两半都找到或都找不到,这一例失败,记原因。测试:合成视频,绿框分别在左、在右、两边都有、两边都没有。
|
||||||
|
3. **D1 不用医生的时刻。** 旧关键帧代码有一个模式让 D1 直接取医生标注的造影剂到达时间(旧 `anchor_frames.py:203–206`)。这条路删掉,只保留从拟合曲线算 D1(design 0002 决定 6)。
|
||||||
|
4. **推注时间的换算。** X 是超声报告表的「推注开始时间s」,含义是视频第 0 秒时已经推注了 X 秒。F1 取视频第 20 − X 秒,F2 取第 60 − X 秒,取帧的容差窗口照旧 `anchor_frames` 段对 F1、F2 的设置;落在视频之外(小于 0 或超过视频末尾),这一帧记为未定位,写明原因,不拿别的帧补(`结构.md` 第四部分)。旧代码按「推注发生在视频第 X 秒」处理(旧 `anchor_frames.py:204` 的符号),要改。测试手算:X = 7 时 F1 在第 13 秒、F2 在第 53 秒;X = 25 时 F1 在第 −5 秒,未定位。
|
||||||
|
|
||||||
|
另有两处旧 debug 路径和 `service.py` 不一样,**按 debug 路径**,因为 40 例的结果是它跑出来的:不裁画面黑边;找分屏线只用均匀抽的 25 帧。
|
||||||
|
|
||||||
|
### 收尾点
|
||||||
|
|
||||||
|
上面的模块和测试都搬完,`make check` 通过,提交。
|
||||||
|
|
||||||
|
## 第二阶段:分割和后半段算法
|
||||||
|
|
||||||
|
### MedSAM2
|
||||||
|
|
||||||
|
- 从远程服务器拷代码和权重(ssh/rsync 一律走 `wangwenhan@202.38.247.58`,见 `AGENTS.md`「本机环境的坑」):
|
||||||
|
- 代码:远程 `/home/wangwenhan/MedSAM2/`,排除 `checkpoints/` 和 `data/`(约 25MB),连同 `.git` 一起拷到本机 `reference/MedSAM2/`,提交号从这个 `.git` 读出,不写死。它是 GitHub `bowang-lab/MedSAM2` 的 332f30d 提交,远程只改了 `download.sh`,不影响代码。
|
||||||
|
- 权重:只拷 `checkpoints/MedSAM2_latest.pt`(约 156MB)到本机 `models/MedSAM2_latest.pt`。
|
||||||
|
- 用 `SAM2_BUILD_CUDA=0 uv add --editable reference/MedSAM2` 装进项目环境(不编译 CUDA 扩展;旧项目也没用它)。装完确认 torch 能看到本机显卡。`guides/开发环境.md` 写明这几步,下一个人在新机器上照着就能装好。
|
||||||
|
- segment 模块(`src/cadx/segment/`):从旧 `medsam2_local_track.py` 改写,**在同一进程里调用**,不再开子进程和 conda 环境。对外一个函数:输入逐帧图像(只是要分割的那一半画面)、若干提示帧的病灶掩码、分割设置,输出每一帧的病灶掩码。它不认识分屏和绿框(`结构.md` 第三部分)。MedSAM2 要求帧以 jpg 文件放在一个目录里,临时目录由 segment 自己建、自己删。
|
||||||
|
- 分割设置(权重路径、模型配置路径、设备、旧脚本里的两个 offload 开关)写进 `ceus.yaml` 的 `segment` 段,字段定义在 segment 里,全部必填。权重路径不写死在代码里。
|
||||||
|
- 导入契约:`cadx` 里只有 segment 能引用 `torch`、`sam2`(改 `pyproject.toml` 里现有那条)。
|
||||||
|
|
||||||
|
### 其余模块
|
||||||
|
|
||||||
|
迁移 polygons、dark_region、reference_region、tic_fitting、tic、anchor_frames、perfusion_metrics、trajectory、tic_curves、tic_plot、overlay,旧测试一起搬,做法同第一阶段。
|
||||||
|
|
||||||
|
- 绿框在最终轮廓里的融合权重(旧 `roi_shape` 段)照搬,写在 `ceus.yaml` 里(`待定问题/01`)。
|
||||||
|
- 紫圈的颜色阈值(旧 `pan_source` 段)照搬(`待定问题/08`)。
|
||||||
|
- 关键帧各时刻的容差窗口,逐个核对出处,写进 `ceus.yaml` 的注释(`结构.md` 第四部分)。
|
||||||
|
|
||||||
|
### ceus 对外交出什么
|
||||||
|
|
||||||
|
ceus 不能引用 segment(`结构.md` 第三部分依赖表),所以分两段对外:
|
||||||
|
|
||||||
|
1. 第一段:输入视频路径和参数,做第 1–2 步,交出分屏结果、哪一半是造影画面、要交给分割的那一半的逐帧图像,以及提示帧的掩码。
|
||||||
|
2. 第二段:输入第一段的结果、分割得到的逐帧掩码、推注时间 X 和参数,做第 4–9 步,交出轨迹、TIC 曲线、拟合、7 个关键帧的定位结果、灌注指标。
|
||||||
|
|
||||||
|
两段中间由 `scripts/ceus_quant.py` 调 segment。具体类型由执行者定,写进 `结构.md` 第八部分。
|
||||||
|
|
||||||
|
### 收尾点
|
||||||
|
|
||||||
|
全部模块和测试搬完,`make check` 通过。另写一条标 `gpu` 的测试:在一段合成小视频上真的调一次 MedSAM2,输出掩码的帧数和尺寸对。跑通后提交。
|
||||||
|
|
||||||
|
## 第三阶段:`scripts/ceus_quant.py`,跑全部病例
|
||||||
|
|
||||||
|
### 跑哪些病例
|
||||||
|
|
||||||
|
用 delivery 读交付包,跑**检查全部通过的病例**(目前 34 例)。C14(关键图)在 build 时才查,被它跳过的病例 CEUS 照跑,build 时不用就是了。医生改完数据重新交付后,再跑一次。
|
||||||
|
|
||||||
|
delivery 的 `CaseRecord` 目前没有视频路径和推注时间,加上这两项(C04、C08 已经检查过它们)。
|
||||||
|
|
||||||
|
### 输出
|
||||||
|
|
||||||
|
CEUS 的结果会进资料库,最终可能写进论文,按 `AGENTS.md` 硬性约束 5 要能追到一次真跑的原始记录,所以每次运行放在 `runs/ceus/` 下、只追加不删;只有能重算的分割缓存放 `work/`。
|
||||||
|
|
||||||
|
```
|
||||||
|
runs/
|
||||||
|
ceus/<运行号>/
|
||||||
|
snapshot/ 快照:git 状态、ceus.yaml 原文、权重文件的 SHA-256、MedSAM2 的提交号
|
||||||
|
failed.csv 失败的病例:视频号、失败在第几步、原因
|
||||||
|
<视频号>/
|
||||||
|
trajectory.npz 逐帧轮廓(格式同旧 trajectory.py)
|
||||||
|
tic_curves.npz 曲线(格式同旧 tic_curves.py)
|
||||||
|
summary.json 拟合结果、灌注指标、紫圈检出率、7 个关键帧的定位(帧号、视频时间、状态、未定位的原因)
|
||||||
|
tic.png 曲线图,标出 D1–D4
|
||||||
|
overlay.mp4 带轮廓的回放视频,供人目视检查
|
||||||
|
keyframes/<槽位>.png 定位到的关键帧,B0、D1……F2,未定位的槽位没有文件
|
||||||
|
work/
|
||||||
|
segment_cache/<键>/masks.npz
|
||||||
|
```
|
||||||
|
|
||||||
|
- 运行号的格式同构建号(用 runs 的 `make_build_id`)。运行目录先写成 `.partial`,跑完再改名,已存在就报错,规则同任务书 01。
|
||||||
|
- 关键帧图是该帧的**整幅原始画面**(左右两半都在),不裁剪。给超声专家时裁不裁、怎么遮信息栏,留给会诊任务书(`待定问题/07`)。
|
||||||
|
- 只有分割结果跨运行复用(`结构.md` 第四部分)。键是下面几样拼起来的 SHA-256:视频文件的 SHA-256、第 1–3 步用到的全部算法参数(规范化成 JSON;不含设备和两个 offload 开关,它们不改变结果)、权重文件的 SHA-256、MedSAM2 的提交号(从 `reference/MedSAM2/.git` 读)。键相同就直接读缓存,不调显卡。缓存目录也是先写 `.partial` 再改名。
|
||||||
|
- 某一例在第 1–6 步失败(包括第一阶段第 2 条的「两半都有或都没有绿框」、选不出提示帧),这一例记进 `failed.csv`、接着跑下一例,和交付资料的问题同一个规矩(`AGENTS.md`「错误怎么处理」)。拟合没过质量门不算失败:D1–D4 记为未定位、灌注指标写 null,原因写进 `summary.json`,F1、F2 照常按推注时间取。个别关键帧槽位未定位也不算失败。
|
||||||
|
- 终端只打印计数:总例数、成功数、按步分的失败数、关键帧按槽位分的定位数、耗时。不打印视频号。
|
||||||
|
|
||||||
|
`scripts/ceus_quant.py` 只接收 `--config config/ceus.yaml`。全部病例要跑一阵子,放进 tmux,日志写到文件。
|
||||||
|
|
||||||
|
### 收尾点
|
||||||
|
|
||||||
|
在本机跑完全部病例,提交代码(`runs/`、`work/` 不进 git)。
|
||||||
|
|
||||||
|
## 第四阶段:build 装入 CEUS 结果
|
||||||
|
|
||||||
|
- `build.yaml` 加一个必填字段 `ceus_run`:某次 CEUS 运行目录的路径,或者 null(不装 CEUS 结果,就是现在的情况)。
|
||||||
|
- 不为 null 时,build 按视频号找到每例的 CEUS 结果。这一例在 `failed.csv` 里或者找不到结果目录,这一例跳过,记为 **C15**「CEUS 定量结果齐全」,涉及值写失败阶段和原因。CEUS 失败的病例要不要改成「超声不可评价、仍参与会诊」,等 `待定问题/03` 定,这一步按跳过处理。
|
||||||
|
- 资料库超声一路加:
|
||||||
|
- `ultrasound/keyframes/<槽位>.png`:定位到的关键帧,经 library 去掉附加数据重新编码(同 `key.png`)。加上原有的 `key.png`,每例最多 8 张图。
|
||||||
|
- `ultrasound/tic.json`:从 `summary.json` 里只挑这几样,此外什么都不写:旧 `tic.py` 四条曲线(病灶整体、病灶去暗区、紫圈、背景圆)各自的拟合是否成功和拟合优度;灌注指标(同旧 replay `summary.json` 的 `perfusion_metrics` 段);紫圈曲线是否可用;7 个槽位各自定位到没有,定位到的写视频时间(秒),未定位的写原因。视频号、文件路径、配置、帧号都不写。
|
||||||
|
- 资料库 `manifest.json` 的 CEUS 来源字段写 CEUS 运行号。
|
||||||
|
- 泄露扫描的禁词表加上视频文件名;扫描范围加上 `tic.json`。
|
||||||
|
- 用 `ceus_run` 指向第三阶段的那次运行,重新构建一次真实资料库,跑 `scripts/scan_library.py`。
|
||||||
|
|
||||||
|
### 收尾点
|
||||||
|
|
||||||
|
测试通过、真实构建和扫描跑完,提交。
|
||||||
|
|
||||||
|
## 测试
|
||||||
|
|
||||||
|
预期值照本任务书文字和旧测试写,不从新实现里推。
|
||||||
|
|
||||||
|
- 第一阶段的四处修改:各条手算测试,见上文。
|
||||||
|
- 旧测试:19 个文件中的 18 个(`test_tic_lognormal_replay` 不搬,它测的是旧 replay 脚本读标注工作簿的逻辑,第 3、4 条修改后不再适用)。conftest 里设产品层环境变量的那个夹具不搬。
|
||||||
|
- segment:一条 `gpu` 测试(第二阶段收尾点)。
|
||||||
|
- 分割缓存:同样的输入第二次运行不调 segment(用 pytest 的 monkeypatch 把脚本里用到的 segment 函数换成计数的假函数,不为测试加参数);改一个第 1–3 步的参数,键就变。
|
||||||
|
- `ceus_quant`:合成的两例小视频,一例正常、一例两半都没有绿框,后者进 `failed.csv`,前者有完整输出。
|
||||||
|
- build:C15 跳过;`tic.json` 只有上面列的几样;keyframes 的附加数据被去掉。
|
||||||
|
|
||||||
|
## 规模
|
||||||
|
|
||||||
|
| 模块 | 预期行数 |
|
||||||
|
| --- | --- |
|
||||||
|
| ceus | 6000–7500(照搬旧算法,去掉产品层) |
|
||||||
|
| segment | 150–300 |
|
||||||
|
| `scripts/ceus_quant.py` | ≤ 300 |
|
||||||
|
| delivery、library、build 的增量 | 各 ≤ 150 |
|
||||||
|
|
||||||
|
超过区间上限的两倍就停下检查。完成后更新:`结构.md` 第六部分实际行数、第八部分 ceus 和 segment 的对外接口;`guides/开发环境.md`(MedSAM2 怎么装);新写 `guides/CEUS定量.md`(怎么跑、产物在哪、怎么看 `failed.csv` 和 `overlay.mp4`,过一轮「硕士生阅读」);`WORK_LOG.md`。
|
||||||
|
|
||||||
|
## 审阅
|
||||||
|
|
||||||
|
- 这一步大部分是「其余部分」那一档(`AGENTS.md`「两档标准」),写完派一个全新上下文的子 Agent 审阅:只给它本任务书、`结构.md` 第三到第五部分和 diff,让它重点看「四处要改的地方」是否改对、迁移有没有漏掉旧代码里的分支、关键帧和指标有没有算错。
|
||||||
|
- 第四阶段改的是资料库(决定专家能看见什么),属于账本级,另派一个全新上下文的子 Agent 单独审这部分,找:CEUS 结果里有没有带进视频号、文件名、医生的判断;CEUS 失败的病例有没有进库。
|
||||||
|
- Codex 可用时再加一轮对抗审查(`/codex:rescue --fresh --wait`)。
|
||||||
|
- 意见的处理同任务书 01。子 Agent 的 prompt 里写明本机 `grep`、`find` 用 `/usr/bin/` 下的版本。
|
||||||
|
|
||||||
|
## 报告
|
||||||
|
|
||||||
|
四个阶段都完成后,在回复里交一份报告。已验证的事实、推断、未验证的部分分开写。
|
||||||
|
|
||||||
|
1. 四个提交号;各模块行数。
|
||||||
|
2. `make check` 的完整输出;`gpu` 测试的输出。
|
||||||
|
3. 旧测试:搬了多少条,删改了哪些、为什么。
|
||||||
|
4. 真实运行:运行号、跑了几例、成功几例、按步分的失败数、关键帧按槽位分的定位数、总耗时和显存峰值。
|
||||||
|
5. **紫圈检出率**:每例一个数(有多少比例的帧认出了紫圈),只报分布(最小、四分位、最大),以及低于 50% 的有几例。给 `待定问题/08` 用。
|
||||||
|
6. **请负责人目视检查的样例**:挑 3 例 `overlay.mp4` 和 `tic.png` 的路径(成功、关键帧缺槽位、紫圈检出率最低的各一例),只给路径不描述内容。
|
||||||
|
7. 重新构建的资料库:构建号、进库数、C15 跳过数、扫描结果。
|
||||||
|
8. 审阅意见和处理。
|
||||||
|
9. 和本任务书、`结构.md`、`AGENTS.md` 不一致的地方,以及为什么。
|
||||||
|
10. 规则不清楚的地方:哪里犹豫、哪里靠猜。没有就写「没有」。
|
||||||
@@ -0,0 +1,270 @@
|
|||||||
|
# 项目综述 v4 · 逐节修改草稿(2026-10-11)
|
||||||
|
|
||||||
|
> 性质:在 v3 基础上的逐节修改草稿(会前讨论用;会上逐节过,会后执行)
|
||||||
|
> 依据:《研究定位裁定.md》+ Nature Communications 2026 text anchoring 启发
|
||||||
|
> 操作原则:§1–3 基本不动;§4–10 重写;附录 A–E 保留;Linear 版第八节不覆盖
|
||||||
|
> ⚠️ 标注【需工程侧 input】的位置——会上逐项过
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 摘要(替换定位句)
|
||||||
|
|
||||||
|
> ……方法学内核为模态隔离的多智能体证据评估机制:经腹 CEUS 灌注定量、MR 报告与临床信息分别由独立智能体评估,各智能体仅接触本模态证据并输出结构化判断,跨模态分歧因此得以显式暴露并作为选择性预测的风险信号——而非在早期融合中被文本量占优的模态(如影像报告)压制。金标准为术后或穿刺病理。系统在此基础上评估两条主线:诊断效度(四亚型分类、校准与稳定性)与选择性预测效度(分歧能否在置信度之外识别易错病例)。
|
||||||
|
|
||||||
|
其余摘要内容(临床背景、数据规模、CEUS 电子化定位)保留 v3 原文。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §1 研究背景与临床问题 — **不动**
|
||||||
|
|
||||||
|
v3 原文保留。四亚型恶性潜能差异、指南多模态联合原则、"切除/随访/放心"管理决策框架——均仍有效。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §2 临床未满足需求与诊断困境 — **不动**
|
||||||
|
|
||||||
|
v3 原文保留。各模态性能天花板、经腹 CEUS 无创可及但缺乏定量、CH-EUS 有创但准确——叙事仍成立。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §3 相关工作与领域现状 — **补充一条**
|
||||||
|
|
||||||
|
v3 原文保留,§3.2 末尾新增:
|
||||||
|
|
||||||
|
> **3.x 多模态融合的文本主导风险**:近期研究(Nature Communications, 2026)系统评估了 8 种多模态基础模型在 1090 例医学影像病例上的表现,发现当加入误导性文本描述后,原本仅凭影像能正确回答的病例性能大幅下降(最佳模型从 84% 降至 28%)。文本越丰富,模型输出越稳定,但这种稳定反映的是模型对文本的依赖而非对影像的利用。这一"文本锚定"现象揭示了多模态医学 AI 的一个结构性风险:当不同模态以不同信息密度进入模型时,信息密度高的模态(通常是文本)可能系统性地压制信息密度低但临床价值独立的模态。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §4 研究目标与科学问题 — **重写**
|
||||||
|
|
||||||
|
### 4.1 总体目标
|
||||||
|
|
||||||
|
在多模态数据(临床信息、经腹 CEUS 灌注定量、MR 报告)基础上,构建面向胰腺囊性病变四亚型鉴别的诊断系统,实现经腹 CEUS 动态影像的电子化与信度评估,并以模态隔离的多智能体证据评估产出可审计的四分类诊断与选择性预测输出,服务于缺乏胰腺亚专科专家且难以施行有创内镜造影的场景。
|
||||||
|
|
||||||
|
### 4.2 科学问题(三层递进)
|
||||||
|
|
||||||
|
> **SQ-A(诊断效度)**:在多模态数据基础上,系统能否实现胰腺囊性病变四亚型的准确分类与良好校准?
|
||||||
|
>
|
||||||
|
> **SQ-B(选择性预测)**:当不同模态的独立评估产生分歧时,该分歧能否在最终整合置信度之外提供增量的错误风险信息——即高分歧病例是否系统性地更容易出错?系统能否据此实现可靠的选择性预测(高置信输出诊断、高分歧建议进一步检查)?
|
||||||
|
>
|
||||||
|
> **SQ-C(证据底座可信度)**:经腹 CEUS 动态影像经 ROI 提取与 TIC 灌注定量后,能否实现跨帧、跨操作者条件下可复现的电子化表征?人工标注的结构化判读在医生间是否具备足够的一致性?
|
||||||
|
|
||||||
|
**三层的关系**:SQ-A 是前提(四分类不行则后续无意义);SQ-B 是核心贡献(分歧的增量价值是本文科学主张);SQ-C 是底座(CEUS 量化不可信则以它为输入的 SQ-B 不成立)。三层依次递进,任何一层不成立都不强行推进到下一层。
|
||||||
|
|
||||||
|
### 4.3 贡献陈述
|
||||||
|
|
||||||
|
1. **数据工程贡献**:经腹 CEUS 动态影像的自动化 ROI/TIC 电子化流水线及其信度评估,以无创路径逼近既往依赖有创 CH-EUS 的鉴别能力。
|
||||||
|
2. **方法学贡献**:模态隔离的多智能体证据评估机制——通过在证据形成阶段保持模态隔离、在整合阶段显式暴露分歧,使跨模态冲突成为可测量的错误风险信号,支持选择性预测。
|
||||||
|
3. **临床价值贡献**:以连续、可审计的输出(诊断+分歧+拒答)服务于非专科场景,并以指南映射论证对管理路径的影响。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §5 目标期刊与发表定位 — **重写**
|
||||||
|
|
||||||
|
### 5.1 双轨制
|
||||||
|
|
||||||
|
**当前倾向**:新刊方向(命中概率考虑)。重点观察三个处于 launch 免 APC 窗口的期刊(南方医主办):
|
||||||
|
|
||||||
|
| 刊 | 窗口 | 匹配度 |
|
||||||
|
| :-- | :-- | :-- |
|
||||||
|
| Medicine Discovery | 2028 年底前投稿免 APC | 数字医学板块覆盖医学影像、预测建模、数据驱动决策系统;强调可解释性、验证、基准与真实世界部署——与选择性预测设计文字匹配度最高 |
|
||||||
|
| Intelligent Translational Medicine | 2027-12-31 前投稿全免 | 覆盖 AI/ML、医学影像、精准诊断、数字健康 |
|
||||||
|
| Molecular and Digital Medicine | 2028-12-31 前提交且此前接受全免 | 接收 AI/ML 与临床转化,但偏分子科学融合 |
|
||||||
|
|
||||||
|
**成熟刊备选**(按选择性预测结果定赛道):npj Digital Medicine、Radiology: Artificial Intelligence、JAMIA、JBI、AIM、CMPB。
|
||||||
|
|
||||||
|
### 5.2 纪律
|
||||||
|
|
||||||
|
不锁死(结果出来定);不因免 APC 降低设计标准;不为赶窗口提前解锁测试集。Watchlist 每 3–6 月复核。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §6 核心科学论点 — **重写**
|
||||||
|
|
||||||
|
### 6.1 多模态融合中的文本主导风险
|
||||||
|
|
||||||
|
近期研究(Nature Communications, 2026)实证:当不同模态以不同信息密度进入多模态模型时,信息密度高的模态(通常是文本报告)可能系统性压制信息密度低但临床价值独立的模态(通常是定量影像参数)。这种"文本锚定"现象在最佳模型上导致性能从 84% 降至 28%。【需引用:Nature Comms 2026, s41467-026-74207-5】
|
||||||
|
|
||||||
|
### 6.2 信息隔离作为设计对策
|
||||||
|
|
||||||
|
本项目的模态隔离架构直接回应上述风险。设计原则:各模态证据由独立智能体在隔离条件下先行评估——CEUS 智能体接触 TIC 灌注参数与结构化影像特征(不含医生总结性文字),MR 智能体接触报告描述段(剥离结论段),临床智能体接触结构化白名单字段。各智能体独立输出后,系统显式计算跨模态分歧,再进入质询与整合。
|
||||||
|
|
||||||
|
设计逻辑:如果多模态融合的主要风险是早期混合导致优势文本压制独立证据,那么对策就是在证据形成阶段保持模态隔离、在证据整合阶段显式暴露分歧。
|
||||||
|
|
||||||
|
### 6.3 系统完整流程
|
||||||
|
|
||||||
|
| 步 | 做什么 | 目的 |
|
||||||
|
| :-- | :-- | :-- |
|
||||||
|
| ① 模态隔离 | 各 agent 只读本模态证据 | 防止早期融合导致文本主导 |
|
||||||
|
| ② 独立判断 | 各 agent 独立输出结构化判断+概率向量 | 保存独立证据 |
|
||||||
|
| ③ 分歧计算 | 系统显式计算跨模态分歧 | 分歧是核心输出 |
|
||||||
|
| ④ 质询 | 分歧显式呈现,互相质询、可修正 | 处理分歧——裁决得了→整合;裁决不了→拒答 |
|
||||||
|
| ⑤ 整合输出 | 最终概率+置信度+分歧指标+拒答决策 | 选择性预测 |
|
||||||
|
|
||||||
|
质询的角色:不是"让 agent 更聪明",而是**处理隔离暴露的分歧**。分歧本身已经是核心信号——质询看它能否被裁决;裁决不了的分歧直接驱动选择性预测。
|
||||||
|
|
||||||
|
### 6.4 选择性预测作为临床出口
|
||||||
|
|
||||||
|
当分歧可测量时,系统实现分级输出:模块间高度一致且置信度充分→确定性诊断;分歧显著→标记不确定并建议进一步检查(如 EUS-FNA)。核心检验:分歧是否真的与错误相关?加入分歧后,风险–覆盖表现是否优于仅靠置信度?
|
||||||
|
|
||||||
|
### 6.5 CEUS 定量证据的独立价值
|
||||||
|
|
||||||
|
在上述框架中,ROI/TIC 灌注定量不是"多了一种输入",而是**一种无法被简化为文本的结构化、连续、具有生理学意义的独立证据通道**。如果所有模态都以文本形式进入系统,那么"多模态分歧"可能只是几段医生文本之间的措辞差异。TIC 定量参数(达峰时间、增强模式、洗脱特征、病灶与正常实质比值)来源于不同物理机制——它使 CEUS 智能体真正掌握 MR 和临床智能体不具备的信息,是抵抗文本锚定的关键资产。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §7 方法学定位 — **重写**
|
||||||
|
|
||||||
|
### 7.1 从工程设计到针对已知失败模式的系统对策
|
||||||
|
|
||||||
|
模态信息隔离架构不是 agent 工程设计偏好,而是针对一个已被实证的失败模式(文本锚定/模态压制)的系统性对策。设计逻辑:早期融合→可能的文本主导;独立证据形成→显式分歧→裁决。
|
||||||
|
|
||||||
|
### 7.2 四种运行模式
|
||||||
|
|
||||||
|
系统按可用模态进入预定义运行模式(非按需选择):
|
||||||
|
|
||||||
|
| 模式 | 输入 | 定位 |
|
||||||
|
| :-- | :-- | :-- |
|
||||||
|
| CEUS+临床 | 基础能力 | fallback |
|
||||||
|
| CEUS+MR+临床 | **主路线** | 主要评价对象 |
|
||||||
|
| CEUS+CT+临床 | 关键次要路线 | 历史 93 例 |
|
||||||
|
| 全模态 | 上限探索 | 历史 15 例 |
|
||||||
|
|
||||||
|
每种运行模式是独立的 index-test configuration,需各自的性能与校准评价。缺模态不补——不用 CT 猜 MR、不生成缺失报告、不把"无 MR"编码为阴性。CEUS 缺失→系统 out-of-scope。
|
||||||
|
|
||||||
|
【需工程侧 input ①】四种运行模式的架构可实现性:各模态独立 agent 的接口设计、统一 evidence schema 的字段定义。
|
||||||
|
|
||||||
|
### 7.3 机制实验的逻辑闭环
|
||||||
|
|
||||||
|
最小机制实验为 2×2 设计:
|
||||||
|
|
||||||
|
| | 无质询 | 有质询 |
|
||||||
|
| :-- | :-- | :-- |
|
||||||
|
| **共享信息** | 测试是否出现文本主导 | 测试融合后能否处理冲突 |
|
||||||
|
| **模态隔离** | 测试独立证据是否保留 | 测试隔离后分歧能否被正确裁决 |
|
||||||
|
|
||||||
|
辅以 single-agent/全信息基线。三个条件合在一起构成完整机制链:早期融合→可能的文本锚定;独立证据形成→显式分歧→裁决。
|
||||||
|
|
||||||
|
### 7.4 Integrator 架构
|
||||||
|
|
||||||
|
各 agent 只向 Integrator 提交标准化 evidence packet(modality、available、quality、四分类概率向量、supporting_evidence[]、opposing_evidence[]、uncertainty、missing_information[]),Integrator 主要看 packet,不重新看原始报告文本。
|
||||||
|
|
||||||
|
【需工程侧 input ②】evidence packet 的 schema 设计与 Integrator 是否需要看原始文本(或仅作为对照条件)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §8 系统设计概要 — **重写**
|
||||||
|
|
||||||
|
### 8.1 数据电子化层
|
||||||
|
|
||||||
|
CEUS ROI 提取流水线(分屏切分 → 绿框 HSV 检测选关键帧 → 坐标映射 → 自托管 GPU 分割传播 → 多边形平滑 → TIC 三曲线);对 CT 与临床信息完成结构化入库。流水线中显式使用的坐标/位置先验作为消融对象。
|
||||||
|
|
||||||
|
### 8.2 多智能体证据评估层
|
||||||
|
|
||||||
|
以模态划分的独立智能体(CEUS/MR/Clinical 各自独立),经五步流程(模态隔离→独立判断→分歧计算→质询→整合)产出四分类概率、分歧指标、拒答决策。
|
||||||
|
|
||||||
|
各 agent 只向 Integrator 提交标准化 evidence packet,Integrator 不重新看原始报告文本(见 §7.4)。
|
||||||
|
|
||||||
|
### 8.3 运行模式路由
|
||||||
|
|
||||||
|
系统按可用模态进入预定义运行模式(CEUS+临床/+MR/+CT/全模态),缺模态不补,CEUS 缺失→out-of-scope。
|
||||||
|
|
||||||
|
### 8.4 输出层
|
||||||
|
|
||||||
|
四分类概率(经校准)、各模态概率向量、分歧指标(五件套)、证据支持/反对记录、拒答/转诊状态与原因、版本绑定。
|
||||||
|
|
||||||
|
【需工程侧 input ③】日志 schema:能否按 §5.4-8 和证据资产清单的十项要求逐条落盘。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §9 验证方案设计 — **重写(四层)**
|
||||||
|
|
||||||
|
### Layer 1|基础诊断效度(locked 164)
|
||||||
|
|
||||||
|
macro-F1、balanced accuracy、per-class sensitivity、混淆矩阵、Brier+log loss(主)+calibration plots+ECE(补充),关键指标带 95%CI。金标准为术后或穿刺病理。
|
||||||
|
|
||||||
|
### Layer 2|选择性预测效度
|
||||||
|
|
||||||
|
比较三种拒答策略(仅置信度/仅分歧/组合):AURC、ΔAURC、预设覆盖率下 selective risk、error enrichment。按类报告:overall coverage、per-class coverage、per-class selective risk。
|
||||||
|
|
||||||
|
### Layer 3|机制实验
|
||||||
|
|
||||||
|
最小 2×2(共享 vs 模态隔离 × 无质询 vs 有质询)+single-agent/全信息基线(必做)。辅以 modality dominance 分析与 natural discordance analysis。
|
||||||
|
|
||||||
|
### Layer 4|可信度与鲁棒性
|
||||||
|
|
||||||
|
CEUS 读者间 κ/ICC(C 测量集 17 条,双医生盲判 20–30 例);AI test–retest 稳定性(区分稳定正确 vs 稳定错误);per-class rejection;历史队列时间鲁棒性(route 分层);missing-modality stress test。
|
||||||
|
|
||||||
|
### 9.1 within-patient 配对比较
|
||||||
|
|
||||||
|
164 例三模态完整→同一患者做所有关键运行模式的配对评价:Clinical→MR+Clin→+CEUS 定性→+TIC 定量(CT 路线重复)。止损条件=TIC 信度差且对分类/校准/错误识别/disagreement 均无增量。
|
||||||
|
|
||||||
|
### 9.2 单模态配置
|
||||||
|
|
||||||
|
Clinical-only/MR-only/CEUS-only/MR+Clin/CEUS+Clin/Full 六配置(防 Clinical shortcut,回答"CEUS 到底提供什么独立增量")。
|
||||||
|
|
||||||
|
### 9.3 C 测量学扩展
|
||||||
|
|
||||||
|
C 路线可评价基数=274 例(164+110)。评价 TIC 提取成功率、QC 失败率、参数分布、设备/年代鲁棒性、CEUS-only/CEUS+Clinical 性能。
|
||||||
|
|
||||||
|
### 9.4 阅片研究
|
||||||
|
|
||||||
|
人力不足不强做;无阅片研究时主张限定为"算法层面的选择性预测"。
|
||||||
|
|
||||||
|
【需工程侧 input ④】Layer 3 消融配置(2×2+single-agent+六配置)的可实现性与计算成本。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §10 消融、失败模式与分析 — **重写**
|
||||||
|
|
||||||
|
### 10.1 消融矩阵
|
||||||
|
|
||||||
|
| 实验 | 目的 |
|
||||||
|
| :-- | :-- |
|
||||||
|
| 2×2(共享 vs 隔离 × 无质询 vs 有质询) | 隔离的价值/质询的价值/交互效应 |
|
||||||
|
| single-agent/全信息基线 | 区分增益来自多 agent/隔离/更多计算 |
|
||||||
|
| modality ablation(六配置) | 各模态独立增量;防 Clinical shortcut |
|
||||||
|
| Findings vs Impression | MR 结论段是否导致文本锚定 |
|
||||||
|
| CEUS 增量三档(无 CEUS/+定性/+TIC 定量) | TIC 定量的独立价值 |
|
||||||
|
|
||||||
|
### 10.2 失败模式分析
|
||||||
|
|
||||||
|
| 分析 | 内容 |
|
||||||
|
| :-- | :-- |
|
||||||
|
| modality dominance | 冲突病例中系统跟随哪个模态;override 正确率 |
|
||||||
|
| natural discordance | 真实 CEUS–MR–Clinical 冲突子集的裁决与病理一致性 |
|
||||||
|
| confident consensus failure | 低分歧+高置信+稳定→但错误的病例 |
|
||||||
|
| error enrichment | 高分歧病例是否富集错误 |
|
||||||
|
|
||||||
|
### 10.3 止损条件
|
||||||
|
|
||||||
|
TIC 信度差且对分类/校准/错误识别/disagreement 均无增量→停止无限扩展 ROI 自动化。选择性预测无增量→退回基础效度+CEUS 量化。
|
||||||
|
|
||||||
|
【需工程侧 input ⑤】上述消融条件(2×2+single-agent+六配置+Findings/Impression+CEUS 三档)的机器可重复配置与计算成本评估。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 不变的节
|
||||||
|
|
||||||
|
| 节 | 状态 |
|
||||||
|
| :-- | :-- |
|
||||||
|
| §1 研究背景 | 不动 |
|
||||||
|
| §2 临床未满足需求 | 不动 |
|
||||||
|
| §3 相关工作 | 补充 §3.x text anchoring 段 |
|
||||||
|
| 附录 A(四亚型特征) | 保留 |
|
||||||
|
| 附录 B(指南风险分层) | 保留 |
|
||||||
|
| 附录 C(管理阈值对比) | 保留 |
|
||||||
|
| 附录 D(诊断模态性能) | 保留,补 Nature Comms 引用 |
|
||||||
|
| 附录 E(参考文献) | 补 Nature Comms、TRIPOD+AI、PROBAST+AI |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 需工程侧 input 汇总(会上逐项过)
|
||||||
|
|
||||||
|
| # | 位置 | 问题 |
|
||||||
|
| :-- | :-- | :-- |
|
||||||
|
| ① | §7.2 | 四种运行模式的架构可实现性 |
|
||||||
|
| ② | §7.4 | evidence packet schema 设计;Integrator 是否看原始文本 |
|
||||||
|
| ③ | §8.4 | 日志 schema:能否按证据资产十项要求逐条落盘 |
|
||||||
|
| ④ | §9 | Layer 3 消融配置的可实现性与计算成本 |
|
||||||
|
| ⑤ | §10 | 消融条件的机器可重复配置与计算成本 |
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
# 07 超声图上烧录的性别、年龄
|
||||||
|
|
||||||
|
提出:2026-10-16 任务书 01 的执行者在报告里指出,负责人同意记为待定问题。
|
||||||
|
|
||||||
|
## 问题
|
||||||
|
|
||||||
|
超声机把一条信息栏烧录在画面上(拼音姓名、检查号、性别、年龄、医院与设备参数)。资料库里给超声一路的关键图 `key.png` 原样带着这条信息栏;第 3 步做出的 CEUS 关键帧取自视频画面,也会带着。
|
||||||
|
|
||||||
|
`AGENTS.md` 有两条规则在这里字面上冲突:
|
||||||
|
|
||||||
|
- 硬性约束 3:信息栏不做遮蔽。这条是从隐私角度定的:临床方判定拼音和不唯一的检查号不构成身份泄露(出自旧 design 0041)。
|
||||||
|
- 硬性约束 2:性别、年龄只给临床一路,影像两路先看到会被人口学先验带偏(旧 design 0026 决定三)。这条是从研究设计角度定的。
|
||||||
|
|
||||||
|
两条的目的不同。隐私上可以不遮,研究设计上,超声专家仍不该从图上读到性别、年龄。
|
||||||
|
|
||||||
|
## 为什么要紧
|
||||||
|
|
||||||
|
超声专家能看图时,如果模型从信息栏读出了性别、年龄,三路隔离就不成立,超声一路的结论里会混进人口学先验。资料库在会诊之前不会给任何模型看,所以这一步(装配两个库)不受影响;会诊开跑之前必须定下来。
|
||||||
|
|
||||||
|
## 选项
|
||||||
|
|
||||||
|
- 给超声专家的图裁掉或遮住信息栏所在的区域(区域位置随分辨率变化,40 例有 5 种分辨率,要按分辨率逐种确认)。
|
||||||
|
- 不遮,在论文里写明这一局限。
|
||||||
|
- 超声专家不看图,只看文字和 TIC 指标。
|
||||||
|
|
||||||
|
## 倾向
|
||||||
|
|
||||||
|
监督者倾向第一种,在会诊任务书里和「超声一路给哪些图」一起定,关键图和 CEUS 关键帧用同一套处理。
|
||||||
|
|
||||||
|
## 等谁定
|
||||||
|
|
||||||
|
负责人,写会诊任务书时定。
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# 08 紫圈的颜色阈值是占位值
|
||||||
|
|
||||||
|
提出:2026-10-16 监督者盘点旧 CEUS 代码时发现,负责人决定先照搬、记为待定问题。
|
||||||
|
|
||||||
|
## 问题
|
||||||
|
|
||||||
|
CEUS 视频上,医生除了用绿框圈病灶,还用紫色轮廓(紫圈)圈了病灶旁边一块正常的胰腺(个别病例圈的是肝),作为对照:病灶和正常组织比,亮得快还是慢、亮得多还是少,这类「相对参数」都以紫圈里的亮度曲线为参照。
|
||||||
|
|
||||||
|
程序靠颜色在每一帧里认出紫圈:HSV 颜色空间里色调、饱和度、亮度落在某个范围内的像素就算紫色。旧项目配置里这组范围(旧 `config/ceus_roi_default.yaml` 的 `pan_source` 段,约第 33–38 行)自己注明是占位值,没有在真实视频上标定过。
|
||||||
|
|
||||||
|
## 为什么要紧
|
||||||
|
|
||||||
|
范围不对,紫圈就认不全或认错:参照曲线是错的,相对参数跟着错,超声专家拿到的指标也错,而且不会报错。
|
||||||
|
|
||||||
|
## 选项
|
||||||
|
|
||||||
|
1. 照搬占位值,40 例跑完后看每例紫圈的检出率(有多少帧认出了紫圈),检出率低的再标定。
|
||||||
|
2. 先在几例视频上人工标定范围,再跑。
|
||||||
|
|
||||||
|
## 倾向
|
||||||
|
|
||||||
|
负责人 2026-10-16 定:先照搬占位值跑(选项 1),任务书 02 要求报告每例紫圈检出率。是否重新标定,看完检出率再定。
|
||||||
|
|
||||||
|
## 等谁定
|
||||||
|
|
||||||
|
负责人,看任务书 02 的检出率报告后定。
|
||||||
Reference in New Issue
Block a user