Files
iomgaa 150eb5f6ae feat(ceus,segment): 任务书 02 第二阶段——分割和后半段算法
- ceus 迁入 polygons、dark_region、reference_region、tic_fitting、tic、anchor_frames、
  perfusion_metrics、trajectory、tic_curves、tic_plot、overlay,旧测试照搬(改 import 与配置读取)。
- 对外两段接口:prepare_segmentation(第 1–2 步)与 quantify_case(第 4–9 步)。
- 第 3 条:删掉 D1 取医生标注时刻的模式,D1 只从拟合曲线算。
- 第 4 条:F1/F2 取视频第 20−X、60−X 秒(X 为视频第 0 秒时已推注的秒数),落在视频外记未定位。
- 绿框融合权重、紫圈颜色阈值照搬;关键帧容差窗口的出处写进 ceus.yaml 注释。
- segment:同一进程调用 MedSAM2,设置写进 ceus.yaml 的 segment 段,全部必填;gpu 测试真跑通过。
- 依赖加 scipy、matplotlib、medsam2(可编辑安装,不编译 CUDA 扩展);uv 只解析 linux x86_64。
- 导入契约:只有 segment 引用 torch、sam2;segment 不引用其他 cadx 模块。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 05:07:02 -04:00

4.4 KiB
Raw Permalink Blame History

开发环境

读者:第一次在本机搭环境的人。

一、前提

  • uv(Python 包和环境管理工具),本机 ~/.local/bin/uv。
  • Python 3.12:uv 会按 .python-version 自动准备,不需要另装。

二、同步环境

make sync          # 按 uv.lock 建 .venv 并安装依赖
uv run pre-commit install   # 每次提交前跑 gitleaks、本地材料拦截和格式检查

三、日常命令

命令 做什么
make fmt ruff 自动修正并格式化
make test 不花钱、不需要显卡的测试
make check lint、格式、类型(pyright strict)、导入边界(import-linter)、测试,依次执行,失败即停

需要显卡的测试用 uv run pytest -m gpu,花钱的真实模型测试用 uv run pytest -m live,都不在 make check 里。

四、数据和本地材料

以下目录不进 git,新机器上要自己准备:

目录 从哪来
data/ 远程 wangwenhan@202.38.247.58:CADx-4-CAD/data/ 下的 交付包_20260908_40例、1.2-TEST,用 rsync 同步
reference/CADx-4-CAD/ 旧项目:先 rsync 工作区(排除 data/),再 git fetch 远程 CADx-4 仓库的全部分支恢复历史
reference/MedSAM2/ MedSAM2 代码(连同 .git),见下一节
models/ MedSAM2 权重 MedSAM2_latest.pt,见下一节

远程服务器走 202.38.247.58,不走 Tailscale 地址 100.83.164.94:同一台机器,后者慢几百倍。

五、MedSAM2(CEUS 分割用)

MedSAM2 是医学图像分割模型(GitHub bowang-lab/MedSAM2),CEUS 定量的第 3 步用它把几帧的病灶提示传播到整段视频。它以可编辑方式装进项目环境,代码放在 reference/MedSAM2/,src/cadx/segment 在同一进程里 import sam2 调用。位置写在 config/ceus.yaml 的 segment 段。

1. 拷代码和权重(两种情况都要做;代码和权重都不进 git):

# 代码:连同 .git 一起拷(提交号从这个 .git 读),不要 checkpoints/ 和 data/,约 25MB
rsync -a --exclude checkpoints/ --exclude data/ \
    wangwenhan@202.38.247.58:/home/wangwenhan/MedSAM2/ reference/MedSAM2/
# 权重:只要这一个文件,约 156MB
mkdir -p models
rsync -a wangwenhan@202.38.247.58:/home/wangwenhan/MedSAM2/checkpoints/MedSAM2_latest.pt models/

远程的代码是 bowang-lab/MedSAM2 的 332f30d 提交,只改了 download.sh,不影响代码。

2. 装进环境,分两种情况:

  • 仓库里已有 uv.lock 且已含 medsam2(pyproject.toml 的依赖里有 medsam2,平常就是这种):拷完代码后 make sync(即 uv sync)就会按锁文件装上 torch 和 MedSAM2。

  • 第一次把 MedSAM2 加进项目(pyproject.toml 里还没有 medsam2):

    SAM2_BUILD_CUDA=0 uv add --editable reference/MedSAM2
    

    SAM2_BUILD_CUDA=0 表示不编译 MedSAM2 的 CUDA 扩展(旧项目也没用它)。命令会改 pyproject.toml 和 uv.lock。

uv sync 时同样要设 SAM2_BUILD_CUDA=0(SAM2_BUILD_CUDA=0 uv sync),否则重新构建 medsam2 时会尝试编译 CUDA 扩展。

代理太慢时:torch 的轮子有几个 GB,走代理可能很慢。可以临时绕开代理直连国内镜像:

env -u http_proxy -u https_proxy -u HTTP_PROXY -u HTTPS_PROXY \
    UV_DEFAULT_INDEX=https://mirrors.aliyun.com/pypi/simple/ \
    SAM2_BUILD_CUDA=0 uv sync      # 第一次加进项目时把 uv sync 换成 uv add --editable reference/MedSAM2

镜像地址只在这一条命令里临时用,不写进 pyproject.toml;uv add 会把镜像地址写进 uv.lock 里各个包的来源,装完要把这些地址换回 https://pypi.org/simple(以及对应的 files.pythonhosted.org 下载地址),再跑一次 uv lock --check 确认锁文件和 pyproject.toml 一致。

3. 确认 torch 看得到显卡:

uv run python -c "import torch; print(torch.__version__, torch.cuda.is_available(), torch.cuda.get_device_name(0))"

应打印 torch 版本、True 和显卡名。最后跑 uv run pytest -m gpu -v:在一段合成小视频上真跑一次 MedSAM2。运行时会出现几条警告(注意力内核回退;sam2/_C.so 里的连通域后处理报 inputs must be a CUDA tensor 后被跳过),MedSAM2 自己说明这不影响主要结果,测试仍应 passed。