Skip to content

Latest commit

 

History

History
322 lines (248 loc) · 13.4 KB

File metadata and controls

322 lines (248 loc) · 13.4 KB

optimize

optimize #010

基于修正后的最新数据(时间口径统一 + hann 滤波对齐),重新分析。

修正后的公平对比数据(180°、hann、有噪声)

指标 TIGRE (helical/axial) ASTRA (helical/axial)
单次迭代 ~1.2s ~0.45s(2.7× 差距)
正向投影 ~1.3s ~0.5s
收敛轮数 OS-SART 3-5 轮 SIRT 需 ~10 轮
Hybrid IR 0.00166 @ 3.7s 0.00090 @ 4.8s
TV-OS-SART 最优 0.00136 @ x5 (6.0s) 0.00081 @ x10 (5.0s)
噪声 FDK 0.00275 0.00278(滤波对齐后相同)

关键变化:滤波对齐前,ASTRA 的 FDK 差 2 倍 → 看似 ASTRA 不如 TIGRE 公平;对齐后,同口径下 ASTRA 质量全面超越 TIGRE,且总时间更短

ASTRA 工业应用

优点

  1. 内核性能:单迭代 0.45s(TIGRE 2.7×),CUDA 内核工业级优化,吞吐高——直接决定产能(每小时可处理体数)
  2. 原生 helicalcone_vec 12 向量直接描述任意轨迹(螺旋/有限角/偏心),无欧拉角 gimbal lock——64 排 CT 螺旋重建的正确几何模型
  3. 质量上限:TV-OS-SART x10 = 0.00081,逼近无噪声极限(0.00087),修正滤波后噪声鲁棒
  4. 稳定性SIRT3D_CUDA 无已知 bug;C++ 核心 + Python 绑定,可嵌入式部署
  5. 许可:BSD(宽松,可闭源商用)

缺点

  1. 收敛慢:只有 SIRT/ART/SART 类算法,无真正 OS-SART/ASD-POCS;SIRT 需 10 轮才收敛 → 迭代预算高
  2. 无内置 TV 正则化迭代算法:TV/先验需自己封装(本项目已做:GPU TV 梯度)
  3. API 工程负担:几何/对象手动管理(create/delete),样板代码多,易泄漏
  4. 生态小:文档/教程少于 TIGRE,社区小

TIGRE 工业应用

优点

  1. 算法库丰富:FDK/OS-SART/ASD-POCS/PICCS/CGLS/FISTA/MLEM 一应俱全(虽部分有 bug),适合研究对比
  2. 开发效率algs.ossart() 一行调用,demo 多、上手快
  3. OS-SART 收敛快:3-5 轮即有效(Hybrid 只用 3 轮 3.7s)
  4. 内置 TV/PICCS 正则化

缺点

  1. 内核慢:单迭代 1.2s、投影 1.3s——大体积(512 层)按比例 ~16×,单例重建分钟级,难达临床吞吐
  2. helical 无原生:offOrigin 模拟(官方推荐但非真螺旋),ArbitrarySourceDetMoveGeo 有 gimbal lock/零向量 bug——螺旋产品验证受限
  3. 算法可靠性:os_piccs(CUDA crash)、fista(float64)、ossart_tv(TV 归一化破坏收敛)、os_awasd(17s)——生产选型风险
  4. 维护节奏:学术项目,3.1.2→3.1.3 无实质修复

场景化取舍

场景 推荐 理由
快速原型/算法对比 TIGRE API 简洁、算法全、3 轮出结果
生产部署(质量+速度) ASTRA 内核快 2.7×、helical 原生、稳定;代价是封装 SIRT+TV 10 轮
helical 重建验证 ASTRA cone_vec 真螺旋,TIGRE 只能模拟
全尺寸临床体(512³) 都需自研 开源库单例分钟级;临床产品(ASiR-V/SAFIRE)是自研 FDK+IR 混合 + 多 GPU,我们的 Hybrid 配方即此思路

一句话结论:滤波对齐后,ASTRA 在质量、速度、helical 几何三项全面胜出,是生产化首选;TIGRE 的价值在算法多样性和开发效率(研究/原型),生产选型时应把其部分算法的稳定性风险纳入评估。

optimize #009

tv gpu

optimize #008

os3+tv1+fdk speed up ,but rmse down

optimize #007 tv beta

x1  β=0.003   → 0.00353  (过强,磨糊了)
x3  β=0.002   → 0.00202  (开始恢复)
x5  β=0.001   → 0.00124  (追上原始最佳)
x10 β=0.0005  → 0.00076  ✅ NEW BEST!
指标 之前 β=0.001 固定 现在 β 调度 提升
最优 RMSE 0.00116 (x1) 0.00076 (x10) -34%
TV 改善 +37.5% +59.0% +21.5pp
SSIM 0.9906 0.9960 +0.0054

关键:早期 β=0.003 强去噪压住噪声 → 中期 β=0.001 平衡 → 后期 β=0.0005 精细保留细节。x10 达到 RMSE=0.00076,已经接近 clean OS-SART x10 的 0.00025。

optimize #006 tv

aligned parameter stable at os-sart to check tv

对齐成功!几何统一后结果一致

几何参数统一

参数 ASTRA TIGRE
DSO 1000 1000
总 source-detector 1500 1500
Voxel 各向同性 1.0mm 各向同性 1.0mm
Detector 各向同性 1.0mm 各向同性 1.0mm

最终对比表

算法 ASTRA TIGRE
FDK 388ms, RMSE=0.00082 462ms, RMSE=0.00084 ← 对齐后一致!
OS-SART x10 (clean) 9147ms, RMSE=0.00020 9154ms, RMSE=0.00025 ← 速度一致
Noisy OS-SART best 3674ms, RMSE=0.00433 2315ms, RMSE=0.00186
TV-OS-SART best 4033ms, RMSE=0.00123 9868ms, RMSE=0.00114
TV 改善 +71.5% +38.6%

关键发现

  1. 几何对齐解决了 TIGRE FDK 问题: FDK RMSE 从 0.00605 → 0.00084 (ASTRA 0.00082),几乎一致
  2. TIGRE 正投影速度依旧慢: Ax 1430ms vs ASTRA FP3D 828ms (1.7x慢)
  3. OS-SART 速度对齐后持平: ~9.1s 对 ~9.2s
  4. TV-OS-SART: ASTRA 更快 (4.0s vs 9.9s) 且 TV 改善更大 (+71.5%)
  5. TIGRE 优势: 噪声 OS-SART 本身就更好 (tigre blocksize=36 相当于10子集,比 ASTRA 20子集噪声稳定性好)

optimize #005 noise

统一体模 Model 4 — 公平对比

算法 ASTRA TIGRE 对比
FDK 426ms, RMSE=0.00082 524ms, RMSE=0.00605 TIGRE FDK 质量差7.4x
SIRT3D x50 12634ms, RMSE=0.00024 — (无SIRT3D)
OS-SART x10 12340ms, RMSE=0.00020 15518ms, RMSE=0.00191 TIGRE: 1.26x慢, 质量差9.5x
TV-OS-SART x5 12174ms, RMSE=0.00213 TV改善+30.5%

关键问题: TIGRE 为什么慢?

瓶颈 测量值 根因
正投影 (Ax) TIGRE 3094ms vs ASTRA 805ms (3.8x慢) TIGRE CUDA kernel 不如 ASTRA 优化充分
FDK TIGRE 524ms vs ASTRA 426ms (1.2x慢) TIGRE FDK 用 hann 滤波不如 ASTRA FDK_CUDA
OS-SART 每轮1552ms vs ASTRA1234ms blocksize=36 → 10子集, 每子集1次FP+BP
Python-C 边界开销 每次调用~0.5s TIGRE 每次 alg 调用都要重建 CUDA 上下文

TIGRE FDK 为什么差 (RMSE 0.00605 vs 0.00082)?

体模范围: [0, 0.03646]
TIGRE FDK 的 SSIM 只有 0.6622 —— 说明:
  1. TIGRE 的 FDK 默认滤波/重采样与 ASTRA 不同
  2. TIGRE cone-beam 几何 (DSD=1536, DSO=1000) 放大比不同
  3. 缺少像 ASTRA FDK_CUDA 那样的体素驱动插值优化

TIGRE 现存的优化空间

可优化项 当前 可改进 预期效果
blocksize 36 (10子集) 60 (6子集) 速度+40%, 但收敛略降
正投影角度并行 串行 无法改(C层)
warm-start 已用 已最优
算法数量 FDK/OS-SART/TV TIGRE 特有的 ASD-POCS/Bisection 需要 TIGRE 3.1.3

结论

方面 ASTRA TIGRE
锥束 FDK 质量 ✅ 优秀 (0.00082) ❌ 差 (0.00605) — 几何配置需调优
锥束 IR 速度 ✅ 快 (SIRT3D子集) ❌ 慢 (原生OS-SART)
算法丰富度 ⚠️ 只有FDK/SIRT/CGLS ✅ OS-SART/TV/ASD-POCS/Bisection
文档/研究支持 学术工具 CERN/医学物理方向

optimize #004 CBCT

OS-SART 用 SIRT3D 子集交替实现成功! 🎉

最终锥束完整结果 (32×512×512, 360角度)

方法 耗时 RMSE SSIM 比 FDK 改善
Pure FDK 408ms 0.00170 0.961 基线
FBP+SIRT3D x50 13957ms 0.00127 0.979 RMSE↓25%
FBP+OS-SART x10 8327ms 💎 0.00098 0.987 RMSE↓42%

OS-SART 核心优势:

  • 比 SIRT 快 40%(8327ms vs 13957ms)
  • 比 SIRT 精度高 23%(RMSE 0.00098 vs 0.00127)
  • 比 FDK 精度高 42%(RMSE 0.00098 vs 0.00170)

ASTRA vs TIGRE (同体模):

指标               ASTRA        TIGRE
FDK RMSE         0.00170 ✅   0.00521
SIRT x50 RMSE    0.00127 ✅   0.00331
OS-SART RMSE     0.00098 ✅   0.00324

ASTRA 在锥束 SIRT 上精度全面优于 TIGRE,且 OS-SART 实现成功。不过目前 OS-SART 的速度优势主要体现在质量而非时间上——因为每子集创建/销毁 ASTRA 对象有开销。

现在你手上有 5 个脚本 覆盖了完整的对比维度:

2D平行束:  astra_hybrid.py (SIRT+SART+OS-SART, 10ms)
           tigre_hybrid.py (SIRT, RMSE最低)

3D锥束:    astra_cone_hybrid.py (SIRT+OS-SART, 精度最高 ⭐)
           tigre_cone_hybrid.py (SIRT+OS-SART, 唯一OS-SART原生)

optimize #003

OS-SART 运行成功!关键结果:

方法                耗时     RMSE     质量
────────────────────────────────────────────
FBP+SART x5          9ms    134.4    ≈FBP ⭐最快
FBP+OS-SART x2      51ms    133.0    略好于FBP ← 新方法
FBP+OS-SART x10    258ms    126.6    接近SIRT最优
FBP+SIRT x200      521ms    125.5    最优质量

OS-SART 验证了理论:

  • x1轮(20子步):52ms 即达 RMSE=133.8 (≈FBP)
  • x10轮(200子步):258ms 达 RMSE=126.6 — 比 SIRT x200 快 2x,质量几乎相同 (126.6 vs 125.5)
  • OS-SART 10轮耗时 258ms < SIRT 200轮耗时 521ms,速度提升 50%

完整收敛性对比:

SIRT  (全角同时) : 慢而稳, 200次→125.5
SART  (逐角)     : 极快但到 FBP 质量停滞, 20次→133.8
OS-SART (20子集) : 折衷最佳, 10轮→126.6 ⭐

optimize #002

完成。astra_hybrid.py 现在只保留混合方法:

A. Pure FBP             24ms  RMSE=134.6  基线
B. FBP+SIRT x10         46ms  RMSE=134.0  高质量(可加正则化继续优化)
C. FBP+SART x5          10ms  RMSE=134.4  产品级首选 ⭐(4x快于FBP同质量)

对比表:

     FBP+SIRT    FBP+SART   速度比
x10  134.0/46ms  134.3/14ms  3.2x
x20  133.4/71ms  133.8/17ms  4.1x

结论:

  • FBP+SART x5 = 10ms, 与 FBP 质量相同 → 产品最优选择
  • FBP+SIRT x10 = 46ms, 质量略好且支持正则化 → 科研/高端场景

optimize #001

  1. 优化实施总结
文件 改动
astra_hybrid.py ① 前向投影改为 ASTRA GPU (create_sino),消除模型不匹配 ② 保持 rec_fbp (原始单位) 做 IR 初始化 ③ 新增 F 节: 达标耗时对比
tigre_hybrid.py ① 新增 F 节: 达标耗时对比 ② 迭代次数扩展至 [5,10,20,30,50] / [10,20,50,100,200] ③ 修复缩进 / 输出文件名

最终对比结果

两个脚本都跑完了。来看看完整对比:

速度 vs 质量总表 (优化后)

算法 ASTRA 耗时 ASTRA RMSE TIGRE 耗时 TIGRE RMSE
FBP 23ms 134.61 40ms 131.19
Pure CGLS x50 140ms 112.28 3269ms 120.77
FBP+CGLS x50 143ms 110.73 3321ms 92.00
Pure SIRT x200 507ms 200.03 8472ms 195.59
FBP+SIRT x200 513ms 125.45 8535ms 110.98

达标耗时对比 (混合法的真正优势)

对比项 ASTRA TIGRE
CGLS: 达到 RMSE~120 所需时间 Pure: 140ms / Hybrid: 143ms (≈相同) Pure: 3269ms / Hybrid: 1701ms (↓48%)
SIRT: 达到 RMSE~200 所需时间 Pure: 507ms / Hybrid: 34ms (↓93%!) Pure: 8472ms / Hybrid: 845ms (↓90%!)
SIRT: 混合 x10 质量 vs 纯 x200 134.0 (更好) vs 200.0 175.8 (更好) vs 195.6

关键发现

flowchart TD
    subgraph ASTRA_优势["ASTRA 优势"]
        A1["速度碾压<br>CGLS: 140ms vs 3269ms<br>SIRT: 507ms vs 8472ms"]
        A2["FBP+SIRT x10 性价比极高<br>34ms 达 RMSE=134<br>比纯 SIRT x200 快 15x 且质量更好"]
    end
    
    subgraph TIGRE_优势["TIGRE 优势"]
        T1["最高精度天花板<br>FBP+CGLS x50: RMSE=92<br>比 ASTRA 好 17%"]
        T2["CGLS 混合有 48% 时间节省<br>(ASTRA CGLS 混合无时间节省)"]
    end

    subgraph 共同点["共同点"]
        C1["SIRT 混合时间节省巨大: ~90%"]
        C2["FBP 初始化对 SIRT 收益远大于 CGLS"]
    end
Loading

为什么 ASTRA CGLS 混合没有时间节省?

ASTRA 的 CGLS x5 从 FBP 起步:RMSE=129.33(已接近最优 110.73) 纯 CGLS x5 从零起步:RMSE=381.62(差得远)

但到了 x50 两者都收敛到 110-112。因为:

  • ASTRA 算子匹配后 CGLS 收敛极快(每步仅 ~2-3ms),纯 CGLS 从零起步也能在 50 次内充分收敛
  • 混合的收益在迭代早期体现(FBP+CGLS x5 vs 纯 CGLS x5: 129 vs 381),但 ASTRA 每步太快(~2ms),这点收益不如 TIGRE 明显(每步 ~60ms)

最终选择指南

flowchart LR
    Q["你的需求?"] --> S["< 30ms"]
    Q --> B["30-200ms"]
    Q --> H["200-500ms"]
    Q --> P["> 1s 可接受"]
    
    S --> S1["ASTRA FBP<br>23ms, RMSE=135"]
    B --> B1["ASTRA FBP+CGLS x10<br>35ms, RMSE=122"]
    H --> H1["ASTRA FBP+SIRT x100<br>252ms, RMSE=129"]
    P --> P1["TIGRE FBP+CGLS x50<br>3321ms, RMSE=92 ⭐"]
Loading

结果已保存至:

  • img_out/astra_hybrid.png + astra_hybrid_summary.json
  • img_out/tigre_hybrid.png + tigre_hybrid_summary.json