docs: 任务书 04 核对包改成医生读得懂;紫圈与病灶去暗区两组灌注指标
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
# 任务书 04:核对包改成医生读得懂、加上「给 agent 的参数」
|
||||
|
||||
## 目标
|
||||
|
||||
任务书 03 做出来的核对包(`runs/review_pack/20261017-060427-c7373ef-dirty/`)是照任务书做的,但任务书本身写错了读者:它把我们自己才用得上的东西(检查编号、字段名、原因码、tic.json 全部字段)都要求给了医生。本任务把核对包改成合作医生拿到就能看懂的样子,并加上医生明确要的「给 agent 的参数」。
|
||||
|
||||
医生不是搞计算机的。包里的每个文件、每一列、每一句话,都要回答得了「医生看这个能判断什么」;回答不了的不放。
|
||||
|
||||
来源:负责人 2026-10-17「说明.pdf 写的很奇怪,既不符合对于合作方的语气,我们是合作者啊……类似公文……合作方是医生,感觉他们也不一定看得懂」「TIC结果.csv 为什么有那么多值是空的」「中间结果……不需要给医生,他们又不是搞计算机的」「医生明确说需要有『给 agent 的参数』」「从 Lognormal 拟合曲线算出来,算不出来就是空;应该是要算两组的,一个是实质的曲线算,一个是去暗区的那条……得类似正常区域与疾病区域对比看。但是病灶整体肯定是不要的……每一组都是那些参数」「就用那几个指标」(指旧项目已经写程序算过的那组灌注指标)。
|
||||
|
||||
## 定下来的「给 agent 的参数」
|
||||
|
||||
- **两组**:胰腺实质(医生画的紫圈,`roi_pan`)一组,病灶去暗区(`roi_perf`)一组。病灶整体(`roi_all`)不要。
|
||||
- **每组同样的参数**:旧项目 `perfusion_metrics.py` 那 11 个灌注指标,本仓库已迁移为 `src/cadx/ceus/_perfusion_metrics.py`:PE、TTP、WiR、RT、WiAUC、WiPI、WoR、FT、WoAUC、WiWoAUC、mTTl。辅助时刻 TI、TO、mTT 不给(它们只是算上面几项的中间量)。
|
||||
- **怎么算**:照现在的做法,从过了质量门的 Lognormal 拟合曲线算;这一组拟合没过,整组为空;观测不够算不出的单项为空,不外推。
|
||||
- **不给**:拟合成功与否、R²、背景圆、紫圈检出率、信号域等内部标记。
|
||||
|
||||
资料库的存储格式这次**不改**(负责人:「可以先不改 library……存储格式晚点再改也行」)。核对包里的参数表直接从 CEUS 运行读。
|
||||
|
||||
## 一、CEUS:紫圈也算灌注指标
|
||||
|
||||
现在第 9 步只对 `LESION_CURVES = ("roi_all", "roi_perf")` 算指标(`src/cadx/ceus/_pipeline.py:59`、`:313`),紫圈没算。改为对 `roi_perf` 和 `roi_pan` 也算(`roi_all` 照旧算,资料库现在还在用它,存储格式改的时候再一起去掉)。
|
||||
|
||||
注意 `LESION_CURVES` 同时决定「两条病灶曲线都过才定位 D1–D4」(`_pipeline.py:300`),那条规则不动;给「算指标的曲线」单独一个名字,不要把 `roi_pan` 塞进 `LESION_CURVES`。
|
||||
|
||||
`summary.json` 的 `perfusion_metrics` 下相应多一个 `roi_pan`。确认 build 读 `summary.json` 时多出这个键不出错、资料库的 tic.json 内容不变(build 原有测试照过)。
|
||||
|
||||
### 重跑
|
||||
|
||||
紫圈指标要重跑 CEUS 才有,顺便把 `-dirty` 的问题一起解决:
|
||||
|
||||
1. **开跑前工作区必须干净**(`git status` 无改动,包括负责人自己的 AGENTS.md、README.md、`research-wiki/paper/`)。不干净就停下来告诉负责人,不要替他提交。
|
||||
2. 全量重跑 `ceus_quant`(40 例),再用新运行重新 `build`,再出核对包。三个运行目录都不带 `-dirty`。
|
||||
3. 上次全量跑过一次 OOM(`runs/ceus/20261016-070216-e165b32-dirty.partial`),这次用当时修好后的设置。超过一分钟的命令放 tmux,日志写文件。
|
||||
4. 报告里对比新旧两次 CEUS 运行:成功例数、各曲线拟合成功例数应完全相同(只多了紫圈指标);不同就停下来查原因,不要往下走。
|
||||
|
||||
## 二、核对包的内容
|
||||
|
||||
```
|
||||
医生核对包_<构建号>/
|
||||
说明.pdf
|
||||
问题清单.csv
|
||||
病例总表.csv
|
||||
标准答案/ 4 张表照旧
|
||||
病例/<病例号>/
|
||||
临床信息.csv
|
||||
超声报告.pdf
|
||||
MR报告.pdf
|
||||
关键图.png
|
||||
关键帧/<槽位>_第<秒>秒.png
|
||||
TIC曲线.png
|
||||
TIC参数.csv 新增,取代 TIC结果.csv
|
||||
回放视频.mp4
|
||||
```
|
||||
|
||||
`TIC结果.csv` 删掉。其余文件的拷贝规则、CSV 格式(BOM、中文列名、缺失为空)照任务书 03。
|
||||
|
||||
### TIC参数.csv
|
||||
|
||||
一例一张,行是 11 个指标,列:
|
||||
|
||||
| 列 | 内容 |
|
||||
| --- | --- |
|
||||
| 指标 | 中文名加缩写,如「达峰时间 TTP」 |
|
||||
| 单位 | 秒、灰度、灰度·秒、灰度/秒 |
|
||||
| 胰腺实质(紫圈) | 数值 |
|
||||
| 病灶(去暗区) | 数值 |
|
||||
|
||||
- 时间类保留 1 位小数,其余保留 2 位。
|
||||
- 某一组整组没算出时,该列全空,并在表的最后加一行:「指标」列写「没算出的原因」,对应列写一句医生能懂的话(见下文「原因的写法」)。两组都算出时没有这一行。
|
||||
- 单项因观测不够算不出、而同组其他项有值时,该格留空,不另写原因(说明.pdf 里统一交代一次)。
|
||||
- CEUS 失败的病例本来就不进资料库,没有这个文件。
|
||||
|
||||
### 问题清单.csv
|
||||
|
||||
列不变(病例号、视频号、环节、问题),内容改成每条一句大白话:
|
||||
|
||||
- 「问题」里不出现:检查编号(C10、C15 …)、英文原因码、JSON、文件路径、运行号、`roi_*` 之类的字段名、程序内部用词(band、谷值、互相关、模板匹配 …)。
|
||||
- 「环节」改成医生认得的说法,例如「资料核对」「造影视频处理」「TIC 曲线」「关键帧」「紫圈」。
|
||||
- 由同一个原因引起的多条合并成一条。例如病灶曲线拟合没成功导致 B0、D1–D4 都没取到,只写一条:「病灶曲线没能拟合,B0、D1–D4 这 5 个关键帧没有取」;不要再各写 5 行。
|
||||
- 跨表不一致写出对不上的具体值,例如「三张表的年龄对不上:临床表 28 岁,超声表和 MR 表 63 岁」(这是病例数据,只进包,不进仓库、日志和报告)。
|
||||
- 一个 CEUS 失败的病例只写一条(现在是「CEUS 第 N 步」和「装配资料库 C15」各一条,说的是同一件事)。
|
||||
|
||||
### 原因的写法
|
||||
|
||||
在 review 里维护一张「程序原因 → 医生能懂的一句话」的对照表,覆盖:跳过清单的每个检查编号、`failed.csv` 里各步的失败原因、拟合的每个原因码、关键帧每类未取到的原因、紫圈不可用。
|
||||
|
||||
- 对照表按「原因的种类」写,具体数值从原记录里取出来填进句子;数值对医生没意义的(谷值、像素偏移)不填。
|
||||
- 遇到对照表里没有的原因**直接报错停下**,不能把程序原文漏给医生。
|
||||
- 程序原文照旧留在 `snapshot/` 里(新增一份 `问题清单_原文.csv`,列同旧版),给我们自己追溯用,不进医生的目录。
|
||||
|
||||
写法参考(执行者可改得更顺,意思不变):
|
||||
|
||||
| 程序原因 | 给医生的话 |
|
||||
| --- | --- |
|
||||
| 第 1 步找不到分屏暗缝 | 视频里找不到左右两屏的分界线 |
|
||||
| 第 1 步两半配准相差超过门槛 | 视频左右两屏的位置对不齐 |
|
||||
| 第 2 步两半都没有绿框 | 视频里找不到画好的绿框 |
|
||||
| 拟合 `parameter_on_boundary` | 曲线形状超出了程序预设的范围,没能拟合 |
|
||||
| 拟合其他原因码 | 各写一句,说的是曲线本身的样子(太平、没有明显的峰、开头就已经很亮 …),不说算法 |
|
||||
| 紫圈不可用 | 视频里大部分时间认不出紫圈 |
|
||||
|
||||
### 说明.pdf
|
||||
|
||||
整份重写,模板仍在 `src/cadx/review/` 下。
|
||||
|
||||
- **口吻**:合作者之间说话。用「我们」「你们」,不用「贵方」「请您核对」这类公文腔。开头一两句说清这是什么、想请他们帮忙看什么就行。
|
||||
- **读者**:胰腺外科或超声科医生,懂 CEUS、懂 TIC 的临床意义,不懂编程、不懂我们的程序。
|
||||
- **篇幅**:尽量 3 页内,最多 4 页。
|
||||
- **只讲这些**:
|
||||
1. 包里有什么、每个文件夹打开能看到什么(分条,不用长表);
|
||||
2. 看病例的建议顺序:报告 → 关键图 → 回放视频(黄色、绿色线是程序画的病灶轮廓,蓝色是程序认为一直不进造影剂的部分)→ TIC 曲线图 → 关键帧 → TIC 参数;
|
||||
3. 7 个关键帧各是什么时刻,用临床的话说;
|
||||
4. TIC 曲线图上每条线是什么(图上的英文标注逐个对照成中文);
|
||||
5. 11 个指标各是什么意思,一句一个;两组的意思是让病灶和正常胰腺对着看;数值是在视频显示的灰度上算的,不是机器内部的回声强度,所以单看一个数意义不大,看两组的对比;时间从视频第一帧算起;空着表示没算出,最后一行写了原因;
|
||||
6. 问题清单、病例总表、标准答案 4 张表各是什么,一句一个;
|
||||
7. 包里有患者资料,只在我们双方之间传。
|
||||
- **不写**:检查编号、原因码列表、字段名、算法和模型名(MedSAM2、Lognormal 等,Lognormal 可以说成「用一条平滑曲线去贴合」)、质量门的具体条件、构建配置开关、化名的设计理由。构建号、CEUS 运行号、生成日期放在第一页末尾一行小字即可。
|
||||
- **排版**:现在的 PDF 有 4 张表(第 3、5 页的问题清单列说明、「环节」、「槽位」、「原因码」)在转换后只剩第一列。改完必须确认没有这种问题;能用分条就不用表。
|
||||
|
||||
## 三、验收要求(执行者自己做完再交)
|
||||
|
||||
1. **把 PDF 渲染成图片逐页看一遍**(`pdftoppm`),说明.pdf 全部页和一份超声报告 PDF。报告里写看过了、有没有发现问题。
|
||||
2. **医生视角阅读**:派一个全新上下文的子 Agent,扮演「三甲医院胰腺外科医生,懂 CEUS,不会编程,第一次拿到这个包」,只给它:说明.pdf 转出的文字、`问题清单.csv`、一例病例目录里的 `TIC参数.csv` 和 `临床信息.csv`(用假交付包测试产出的那份,不给真实病例数据)。让它先复述「这个包让我看什么、怎么看」,再列出读不懂的句子、看不懂的词、觉得多余的内容、语气别扭的地方。这一轮替代 AGENTS.md 的「硕士生阅读」(读者不同)。格式建议不采纳,读不懂和多余的必须改。
|
||||
3. 问题清单全文 `/usr/bin/grep` 一遍,确认不含:`C[0-9]`、`roi_`、`_`、`{`、`[`、`band`、运行号格式。写成测试。
|
||||
|
||||
## 测试
|
||||
|
||||
预期值照本任务书写,不从实现里推:
|
||||
|
||||
- 紫圈指标:假 CEUS 运行里造一例紫圈拟合成功的,`summary.json` 有 `perfusion_metrics.roi_pan` 且 11 项值等于直接调 `compute_lognormal_perfusion_metrics` 的结果;`lesion_fit_ready` 的判定不受影响(造一例紫圈过、病灶有一条没过,D1–D4 仍不定位)。
|
||||
- `TIC参数.csv`:列名、11 行的顺序和中文名;两组都有值、只有一组有值、两组都没有三种情况;「没算出的原因」行只在有组为空时出现;数值的小数位。
|
||||
- 问题清单:每种原因至少一例,断言「环节」「问题」原文;拟合失败连带的关键帧只出一行;CEUS 失败只出一行;对照表里没有的原因报错;上面第 3 条的禁用字符检查。
|
||||
- `snapshot/问题清单_原文.csv` 存在且内容与旧写法一致。
|
||||
- 包里不再有 `TIC结果.csv`。
|
||||
- build、ceus、review 原有测试照过(按本任务改了预期的除外,在报告里列出改了哪几条、为什么)。
|
||||
|
||||
## 文档
|
||||
|
||||
- `research-wiki/explanation/` 里讲 CEUS 第 9 步的地方:指标改为对病灶去暗区和紫圈两组算,写明来源是负责人 2026-10-17 的决定(医生要正常区与病灶对比看)。
|
||||
- `research-wiki/guides/医生核对包.md`:文件清单改成新的;重跑顺序写成「干净工作区 → ceus_quant → build → review_pack」。
|
||||
- `结构.md`:规模表若有变化同步。
|
||||
- `WORK_LOG.md`。
|
||||
|
||||
## 审阅
|
||||
|
||||
「其余部分」那一档。写完派一个全新上下文的子 Agent,只给本任务书、diff 和渲染后的说明.pdf 页面图片。重点:问题清单里有没有漏出程序原文;对照表是否覆盖了真跑时出现的全部原因;紫圈指标改动有没有影响 D1–D4 的定位规则;review 有没有写 `library/` 或 `answers/`。Codex 连不上就跳过。
|
||||
|
||||
## 报告
|
||||
|
||||
1. 提交号;各部分行数变化。
|
||||
2. `make check` 完整输出。
|
||||
3. 新旧 CEUS 运行的对比(见「重跑」第 4 条);新的 CEUS、build、review_pack 三个运行号。
|
||||
4. 紫圈、病灶去暗区两组各有几例算出了指标,两组都有的几例(只报计数)。
|
||||
5. 问题清单按新「环节」分的行数,与旧版行数对比。
|
||||
6. 渲染检查和医生视角阅读的结果,以及据此改了什么。
|
||||
7. 说明.pdf 和一例病例目录的路径,供负责人目视检查。
|
||||
8. 和本任务书、`AGENTS.md` 不一致的地方,以及为什么。
|
||||
Reference in New Issue
Block a user