- 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>
4.4 KiB
开发环境
读者:第一次在本机搭环境的人。
一、前提
- 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/MedSAM2SAM2_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。