@fireants/fireants

中文文档
0.1.20260913发布于 2026/09/14SEE LICENSE IN LICENSETypeScriptES Module零依赖近 30 天下载 7023

浏览器医疗图像注册 -- -- 刚性、外形、SYN和可变形的贪婪 -- -- 是一个主题模块,在页面被交叉原生隔离的地方被线接通。 一个C口的FireANTs.

中文使用文档
文档目录11 节
  1. 安装
  2. CPU 线程和 WebGPU
  3. API 密码
  4. 阶段
  5. 齐普
  6. 线索
  7. 炸弹
  8. 图像大小和内存
  9. 错误
  10. 大楼
  11. 出版

@ 消防员/ 消防员

浏览器中的医疗图像注册:僵硬、相亲、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 (英语)
gpunavigator.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
verbose00无声,一取一取一取一取二取入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入出出出入入入入入入入入入出出入入入入入入入入入入入入入入入入入入入入入入入出出出入入入入入出入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入. onLog 只看这发出什么
gzip匹配移动输入gzip 返回缓冲器
workertrue 地点 Worker 已存在运行在网络工作。 唯一真实的取消。 节点没有,所以它默认是假的
assetPath此模块的目录地点 cfireants.js编号 :cfireants.wasm 从
threadstrue仅限 CPU : false 部队 st;正整数封顶通过 --threads
timeoutMs900000 (单位:千美元)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-streamsgzip 需要,但是 DecompressionStream编号 :CompressionStream 缺席
unsupported-environment没有网络大会。 一个没有交叉来源隔离的页面是 没有 错误 —— CPU 默默地获得单线段构建
no-webgpubackend: '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信任的出版商 从已有软件包的设置中配置 :

  1. 记录再分配审批并设置 GitHub 仓库变量 CFIREANTS_NPM_REDISTRIBUTION_APPROVED=true。 。 。 .
  2. 添加颗粒 npm 发布令牌为 GitHub 动作密钥 NPM_TOKEN。 。 。 .
  3. 提交版本为 src/main.c, (中文(简体) ), js/package.json,以及 js/package-lock.json,标记以相同的 v- 前缀版本, 并发布"GitHub"发行.
  4. 在新软件包的 npm 设置中, 添加 GitHub 动作信任的发布器 页:1 neurolabusc/cfireants工作流程 release-npm.yml直接 npm publish 允许。 然后删除 NPM_TOKEN 暗号.

该版本从源头构建,验证版本,运行原生和包装 WASM 烟雾测试,出版 @fireants/fireants 有出处,有随从 确切的柏油球加上它的SHA-256校验和到GitHub发行. 未来 以短寿命的 OIDC 证书向 npm 发布认证,不需要 npm 符号 .

版本与发布记录

@fireants/fireants 共发布 1 个版本,首次发布于 2026/09/14;过去 12 个月发布了 1 个版本。

版本发布日期距今
0.1.20260913latest2026/09/142 个月前

关于 @fireants/fireants 的常见问题

@fireants/fireants 是什么?

浏览器医疗图像注册 -- -- 刚性、外形、SYN和可变形的贪婪 -- -- 是一个主题模块,在页面被交叉原生隔离的地方被线接通。 一个C口的FireANTs.

如何安装 @fireants/fireants?

在项目目录运行 npm install @fireants/fireants,或使用 pnpm add / yarn add / bun add。

@fireants/fireants 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@fireants/fireants 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@fireants/fireants 可以商用吗?

@fireants/fireants 使用 SEE LICENSE IN LICENSE 许可。许可条款写在包内的独立文件中,请阅读该文件确认可否商用。以上为概括,不构成法律意见,请以许可原文为准。

@fireants/fireants 的下载量有多少?

根据 npm 官方下载统计,@fireants/fireants 在 2026/10/15 – 2026/11/13 这 30 天内被下载 7,023 次,日均约 234 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@fireants/fireants 还在维护吗?

最新版本 0.1.20260913 发布于 2026/09/14(2 个月前);至今共发布 1 个版本,其中过去 12 个月发布了 1 个;首次发布于 2026/09/14。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。