@ 消防员/ 消防员
浏览器中的医疗图像注册:僵硬、相亲、SYN和贪婪
线性CPU或WebGPU后端可变形对齐. 两个NIfTI
ArrayBuffer进入,扭曲的移动图像出来.
这是经过修改的衍生作品. 模块汇编自
cfireants,纯 C 重新执行 消防员 —— 说 文件已经 已更改,原始的Python没有被结转,这个包是 未经FireANTs作者认可。 在FireANTs下分发 许可证 v1.0 (LICENSE),其第4节要求版权通知, 许可文本和书目与之一同旅行;见 第三次议会 NoTICES.md,带有 引证. 如果您使用此方式发表作品,请引用 FireANTs 的论文.在再分配审查之前,公开出版的成套出版物将封口. 节次 4(a) 列举了允许的再分配形式,npm包是 无论是原始寄存器还是软件包管理器上的轮子 项目文件。 4(a)(三)(经修订的保留通知和 参考文献目录)是本套件所依赖的条款. 发布工作流程将 建造并测试柏油丸,但不会公布于 npm 或公开附加 直到仓库变量
CFIREANTS_NPM_REDISTRIBUTION_APPROVED实值 明确设置为true书面许可或经审查的解释后 已记录.
安装
一旦再分配批准被记录,请从 npm 安装软件包 :
npm install @fireants/fireants
软件包已经命名 fireants· ; cfireants 原产地C的名称
可执行和内部WebAssembly资产。 每个
GitHub 发布 还携带
无法改变的 npm 沥青球和 SHA-256 文件
.github/workflows/release-npm.yml。 。 。 .
import { register } from '@fireants/fireants'
const { image, elapsedMs, variant } = await register(
await fixedFile.arrayBuffer(), // .nii or .nii.gz
await movingFile.arrayBuffer(),
)
// image is gzipped if the moving input was
CPU 线程和 WebGPU
三个造船厂 自动选择两个 CPU 变体; WebGPU
以 backend: 'webgpu'数字 :
| 变体 | 需求 | 小的2毫米对 | 质量 |
|---|---|---|---|
mt | (单位:千美元) 跨原生个体 页 次 | 13.6 会 议 | 0.9555 (英语) |
st | 无 | 84.9s (中文(简体) ) | 0.9555 (英语) |
gpu | navigator.gpu —— 说 无隔离 | 15.7s (韩语) | 0.9557 (中文(简体) ) |
Chrome,14个核心;质量是全球NCCC对照模板. WebGPU 不是一个 目前为快的. 如此大小的悬浮状态和部件仍然同步 cPU(尤其是SyN曲速倒置)上的成本比GPU所保存的还要高—— 同样的跑道是6.4 s土生土长。 它买的是它需要的 无交叉来源 隔离:在无法发送COOP/COEP的宿主上,比较不是15.7 s 对13.6s,对15.7s,对84.9s.
1毫米口径的单条大脑需要几分钟,这就是为什么 st
超时默认为30分钟 mt15岁.
线性构造是 -pthread,因此它导入了共享内存,并导入了一个页面
并非跨原生隔离 无法即兴表演
失败. 标志性游泳池的产卵
DataCloneError: SharedArrayBuffer transfer requires self.crossOriginIsolated
所以工厂既不决意也不拒绝 这个
因此,一揽子问题 在此之前 它会得到任何东西, 安静地
带 st 当答案为否时——在 GitHub Pages 上无法设置的页面
这些头,仍然工作. result.variant 说哪一个跑.
为了得到 mt,服务于 顶级文档 改为:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
把他们放在 .wasm 反之则无所作为:孤立是一种
属性。 注意费用,这是部署的通常原因
关闭隔离: 在 require-corp 每一个跨源子资源
页面加载 —— 图像、 字体、 分析、 嵌入 —— 必须自己发送
Cross-Origin-Resource-Policy 或被封锁.
在向用户保证快速运行前先询问:
import { checkSupport } from '@fireants/fireants'
const { threaded, variant, threads, reasons } = checkSupport()
if (!threaded) console.warn(`falling back to ${variant}: ${reasons.join('; ')}`)
WebGPU 被单独询问, 因为唯一的诚实答案需要
requestAdapter() 并因此成为同步—— navigator.gpu 存在于浏览器中
然后把任何适配器递回去:
import { checkWebgpuSupport, register } from '@fireants/fireants'
if (await checkWebgpuSupport()) await register(fixed, moving, { backend: 'webgpu' })
backend: 'webgpu' 永不退缩。 在没有设备的地方,它扔
CfireantsError 与 code: 'no-webgpu'所以有个叫GPU的人
发现而不是被交给 CPU 的结果标签为一个。 GPU建设
是单行本,因为它没有在设备上工作,所以 threads 实值
在那里是无意义的,是被拒绝的; result.variant 实值 'gpu'。 。 。 .
API 密码
register(
fixed: ArrayBuffer | ArrayBufferView,
moving: ArrayBuffer | ArrayBufferView,
options?: RegisterOptions,
): Promise<RegisterResult>
checkSupport(): SupportReport
checkWebgpuSupport(): Promise<boolean>
RegisterResult 实值 { image: ArrayBuffer, elapsedMs: number, variant: 'mt' | 'st' | 'gpu', threads: number, log: string } —— 说 elapsedMs 是模块内的时间,
log 是它写给studt and stderr的所有东西.
SupportReport 实值 { supported, threaded, variant, threads, reasons }数字 :
supported 只有在没有网络大会的情况下才有假, threaded 说
是否为 mt 可用,且 reasons 说为什么不是.
| 选项 | 默认 | 含义 |
|---|---|---|
backend | 'cpu' | 'cpu' 或者说 'webgpu'; WebGPU 清晰且永不悄悄倒回 |
transform | 'syn' | 预设阶段序列 : 'rigid', (中文(简体) ), 'affine', (中文(简体) ), 'syn', (中文(简体) ), 'greedy' |
stages | —— 说 | 明确阶段,顺序; 覆盖 transform |
verbose | 0 | 0无声,一取一取一取一取二取入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入出出出入入入入入入入入入出出入入入入入入入入入入入入入入入入入入入入入入入出出出入入入入入出入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入. onLog 只看这发出什么 |
gzip | 匹配移动输入 | gzip 返回缓冲器 |
worker | true 地点 Worker 已存在 | 运行在网络工作。 唯一真实的取消。 节点没有,所以它默认是假的 |
assetPath | 此模块的目录 | 地点 cfireants.js编号 :cfireants.wasm 从 |
threads | true | 仅限 CPU : false 部队 st;正整数封顶通过 --threads |
timeoutMs | 900000 (单位:千美元)mt编号 :gpu) (中文(简体) ) 1800000 (单位:千美元)st(中文(简体) ) | 放弃等待。 SYN是分钟,不是秒 |
onLog | —— 说 | 接收模块的输出线 |
signal | —— 说 | AbortSignal; 下节 worker: true 终止模块 |
args | —— 说 | 原文附在原文后 |
阶段
舞台是CLI自己的弦,通过未分出. 没有外壳, (中文(简体) ),
故你应当记录他们 SyN[0.1,0.5,1.0]永远 'SyN[0.1,0.5,1.0]' 与
引用字符串内的内容.
await register(fixed, moving, {
verbose: 2,
onLog: (line) => console.log(line),
stages: [
{ transform: 'Rigid[0.003]', metric: 'MI[32]', convergence: '[200x100x50,1e-6,10]', shrinkFactors: '4x2x1' },
{ transform: 'Affine[0.001]', metric: 'MI[32]', convergence: '[200x100x50,1e-6,10]', shrinkFactors: '4x2x1' },
{ transform: 'SyN[0.1,0.5,1.0]', metric: 'CC[5]', convergence: '[200x100x50,1e-6,10]', shrinkFactors: '4x2x1' },
],
})
metric 线性阶段默认为MI,可变形阶段默认为CC,
匹配可执行文件。 如果两个图像都是脑部提取的,通过 CC[5] 时间
换句话说,在这样一对舞台上,它既准确又快。 时 verbose: 2 模块将进度写入 stderr,
哪个 onLog 按行接收 :
SyN scale 2: 96x114x96
iter 50/100 loss=-0.789890
如果您想要进度栏, 请分析它; 原始行也被加入
result.log。 。 。 .
齐普
主题模块链接 无zlib - C读写简单 .nii 仅 --
因此所有压缩都发生在 TypeScript 中,通过 DecompressionStream 财务报告和审定财务报表
CompressionStream输入是由魔法字节而不是由文件名所嗅出,所以
.nii 这真的被咬了 仍然工作。 没有这些溪流的环境
获得一个 no-compression-streams 与其拒绝,不如拒绝.
线索
线状池的大小 navigator.hardwareConcurrency积极
整数封顶通过 CLI --threads 旗帜——14个核心是13.6 s
小2毫米对相机, threads: 4 是 29.8 s —— 仍然选择了线形构造,
因为单行本不能遵守任何价值,只能遵守1. threads: false
强迫单行道在孤立的一页上建立起来 这是值得的
当你宁愿离开核心 在页面.
节点豁免隔离规则:它拥有共享箭头缓冲器,不需要 头来使用它,然后以全宽运行线被构建.
炸弹
标记胶体在运行时由 URL 上载并定位它自己的 .wasm
b. 通过其本身 import.meta.url,所以这两个文件必须留下 邻接和
无污名。Vite和Rollup既不重写该 URL ,也不释放资产.
复制 cfireants-mt.js, (中文(简体) ), cfireants-mt.wasm, (中文(简体) ), cfireants.js, (中文(简体) ), cfireants.wasm, (中文(简体) ),
cfireants-gpu.js, (中文(简体) ), cfireants-gpu.wasm,以及 worker.js 离开这个包
dist/ 进入某处服务,和指点 assetPath 写着:
await register(fixed, moving, { assetPath: '/cfireants/' })
assetPath 必须是同源的: 它能提供动态 import() (单位:千美元)
new Worker(),否则其中任何一方会运行第三方的代码与
访问病人的卷.
图像大小和内存
峰值内存跟踪 已固定 图像,不是移动的。 SYN 分配其 移动场、选择性瞬间和相通性中间体 图像的网格,所以超大小的移动量只花费它自己的存储.
| 固定 | 移动 | 峰顶 | 14行长墙 |
|---|---|---|---|
| 182x218x182, 1mm 模板 | 182x218x182 (英语) | 1.80 GB 数字 | 46.7s (单位:千美元) |
| 182x218x182, 1mm 模板 | 256x256x256 (英语) | 1.92 GB 数字 | 56.3s (韩语) |
| 256x256x256 (英语) | 182x218x182 (英语) | 3.88 GB (英语) | 185.1s (单位:千美元) |
asm32在 4 GB 时封住堆积, 浏览器标签给出的比节点少, 所以
最后一行没有头室,更大的固定图像会失败。 登记册 改为 (单位:千美元)
1mm 的模板,然后通过大音量为 moving。 。 。 .
这个 gpu (英语) 建筑更紧:它的堆积是固定的 1 GiB,因为
标注的 WebGPU 端口不能与 ALLOW_MEMORY_GROWTH。它也会
需要适配器 maxStorageBufferBindingSize 适合最大的单
绑定:SyN的五道相关工作空间(144 MB用于1mm模板),
或三个贪婪和线性相(87 MB,128 MiB内部)的通道
基线)。 包装器要求适配器自己报告的尺寸限制,所以
有能力的GPU得到它们.
开始前,包装器从NIfTI两个标题读取 dim[1..3],工作
并对照
maxStorageBufferBindingSize 而上传最多的 maxBufferSize。 。 。 .
如果失败, 则指定需要的字节和拒绝的限度 .
这就是全部: 基线适配器随消息快速失效
行动,它没有获得运行1毫米SYN的能力. 铺平工作空间是
修补它,它不会写。 使用贪婪、 CPU 后端或 a
这种设备上的更小的固定图像 .
错误
每一次拒绝都会扔出一个 CfireantsError 带有 code 您可以在 :
| 代码 | 何时 |
|---|---|
bad-input | 不为矩阵缓冲/ 类型数组, 或为空 |
no-compression-streams | gzip 需要,但是 DecompressionStream编号 :CompressionStream 缺席 |
unsupported-environment | 没有网络大会。 一个没有交叉来源隔离的页面是 没有 错误 —— CPU 默默地获得单线段构建 |
no-webgpu | backend: 'webgpu' 请求,没有 navigator.gpu,没有适配器,也没有设备。 从未默默降级到CPU |
unsupported-option | 一个不好的选项, 一个跨源 assetPath,或 threads {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}不能尊重它的建筑 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}我对它感到骄傲 |
timeout | 模块未创建或未完成 timeoutMs |
registration-failed | 或未写入输出 |
aborted | 页:1 AbortSignal 发射 |
error.log 当失败来自内部时, 包含模块本身的输出
这个 没有任何退步:无声无息的登记
降级后,会还原出错的量.
大楼
npm install
npm run checkVersion
npm run build # build the wasm, stage it into dist/, emit types, bundle
npm run typecheck
npm run smokePackage -- . ../validate/small
npm run smokeWebgpu -- . # Chrome: packaged CPU/WebGPU Rigid→Affine→SyN parity
npm run build 运行 build-wasm.sh 首先,需要标注在 PATH
( 6. 0.2 是 CI 的指针) 并且从母库中的 C 源来构建. scripts/copy-wasm.mjs 然后是阶段
所有六件文物都出来了 js/wasm/ 输入 dist/; 设置 CFIREANTS_WASM_DIR
如果写在别的地方.
src/main.c, (中文(简体) ), package.json,在 package-lock.json, (中文(简体) ),
而释放标记必须带有相同的版本。 CI 检查这个而不是
重写释放元数据 。 调用请求和推 运行本地测试,建设,
和烟雾测试两种CPU变体 从包装的柏油球。 浏览器
CPU/WebGPU 本地对等检查 npm run smokeWebgpu。 。 。 .
出版
第一次出版需要一次性的靴子 因为Npm信任的出版商 从已有软件包的设置中配置 :
- 记录再分配审批并设置 GitHub 仓库变量
CFIREANTS_NPM_REDISTRIBUTION_APPROVED=true。 。 。 . - 添加颗粒 npm 发布令牌为 GitHub 动作密钥
NPM_TOKEN。 。 。 . - 提交版本为
src/main.c, (中文(简体) ),js/package.json,以及js/package-lock.json,标记以相同的v- 前缀版本, 并发布"GitHub"发行. - 在新软件包的 npm 设置中, 添加 GitHub 动作信任的发布器
页:1
neurolabusc/cfireants工作流程release-npm.yml直接npm publish允许。 然后删除NPM_TOKEN暗号.
该版本从源头构建,验证版本,运行原生和包装
WASM 烟雾测试,出版 @fireants/fireants 有出处,有随从
确切的柏油球加上它的SHA-256校验和到GitHub发行. 未来
以短寿命的 OIDC 证书向 npm 发布认证,不需要 npm
符号 .