150eb5f6ae
- 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>
87 lines
4.4 KiB
Markdown
87 lines
4.4 KiB
Markdown
# 开发环境
|
||
|
||
读者:第一次在本机搭环境的人。
|
||
|
||
## 一、前提
|
||
|
||
- [uv](https://docs.astral.sh/uv/)(Python 包和环境管理工具),本机 `~/.local/bin/uv`。
|
||
- Python 3.12:uv 会按 `.python-version` 自动准备,不需要另装。
|
||
|
||
## 二、同步环境
|
||
|
||
```bash
|
||
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):
|
||
|
||
```bash
|
||
# 代码:连同 .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`):
|
||
|
||
```bash
|
||
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,走代理可能很慢。可以临时绕开代理直连国内镜像:
|
||
|
||
```bash
|
||
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 看得到显卡**:
|
||
|
||
```bash
|
||
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`。
|