@brainchop/ mindgrab (英语)
浏览器 WebGPU 上的 MeshNet 脑分裂, 有 WebGL2 和 有线- CPU
倒背:MindGrab头骨剥取,宽度为2个18等分
(单位:千美元)16chan18cls, (中文(简体) ), mindmap),以及104级德西克-克里尼地块
(单位:千美元)mindsnap),超过固定的2563格. 一个NIFTI ArrayBuffer 进去和a
北爱尔兰 ArrayBuffer 出来.
整个管道——符合、正常、13或25个MeshNet层,分类, 最大组件重排——运行在编译自 脑跳-c此软件包只拥有 该模块故意不做的: gzip, WebGPU 设备以及 WebGL2 上下文 收购 跨原产地隔离探测 以及拒绝的决定.
import { segment } from '@brainchop/mindgrab'
const input = await file.arrayBuffer() // .nii or .nii.gz
const { image, elapsedMs } = await segment(input, { model: 'mindgrab' })
// image is gzipped if the input was
MindMap现在过滤选中的组织类别并重新填充被压制的光谱
从幸存的相邻标签默认。 使用
{ model: 'mindmap', legacyCleanup: true } 仅限大脑原型
清净相. 这需要从与包装纸相同的修订版中重建原物资产.
分类原生-空间输出使用浏览器的八样多数投票,
包括源外的背景投票 和第一样本领带断裂.
面具仍然使用相近的邻居;连续的组织图使用线性再生.
无效、为空、填入95%以上或过于零散
结果失败 inference-failed 在清理之前可以掩盖失败.
连续组织图
import { segmentTissues } from '@brainchop/mindgrab'
const { tissues, backend } = await segmentTissues(input, {
model: 'mindmap', worker: true,
})
// tissues.gm, tissues.wm, tissues.csf and tissues.brain (GM + WM) are NIfTI
// ArrayBuffers. Native geometry and input gzip encoding are preserved by default.
tissues.brain0.5同位素是亚伏克赛尔平面,准备成网.
segmentTissues 支持 mindmap 财务报告和审定财务报表 16chan18cls 在WebGPU,WebGL2和CPU上.
GPU路径计算设备上的被分组的前缀、模糊和支持指向;
共享 C CAT-lite fitter 运行在 CPU 上. 使用MindMap 校正
两个模型的常数。 示范16 覆盖范围检查执行协议,
不是组织模型校正. saveConform 财务报告和审定财务报表 gzipOutput 工作情况
segment; 面罩,边框和遗留的断然清除选项被拒绝.
WebGL2模块保留了768个MiB为主机侧组织合位.
后端
auto (默认)尝试硬件 webgpu硬件 webgl2,则 cpu
报告(仅来自不同页面) result.backend, (中文(简体) ),
掷出 no-webgpu 如果没人能。 它从不选择一个被确认为
软件(SwiftShader、llvmpipe、熔岩管、WARP或WebGPU倒置适配器):
他们通过每个能力探测器 但运行MindGrab 在990 S对CPU
模块为~10 s. checkSupport() 财务报告和审定财务报表 checkWebgl2Support() 报告
software: true 为了他们。 无法识别被遮盖的 WebGL2 渲染器字符串
(单位:千美元)software: undefined),因此它只在 cpu 无法。 无论运行,一个
空的 MindGrab 口罩拒绝使用 inference-failed,如同空标签一样。 A 类
命名后端仍然运行一个软件,但超过默认值
timeoutMs。 。 。 .
MindGrab在M4 Pro上,当时间在相机模块内部,当什么是一个 segment()
电话实际成本。 不同之处在于这个包是自己的作品——取取和取
即时化模块, gzip 和 gunzip, 并复制音量入出
模块文件系统——而不是完全位于模块内部的分割
第一个数字 :
| 后端 | 需求 | 模块中 | 每个呼叫 |
|---|---|---|---|
'webgpu' | 使用 WebGPU 的网络 shader-f16, 512 MiB 缓冲器, 安全上下文 | 1.6 s (简体中文) | 2.4 对 |
'webgl2' | WebGL2 为 EXT_color_buffer_float | 3个s | 4.1 s, 它使用调用线程 worker: true |
'cpu' | (单位:千美元) 跨原生个体 页面(见下文)和可生长共享内存的~2.15 GB | ~10 s 在14个核心 | ~12.6 s (韩语) |
CPU一行 2.6 s 的包装时间大约为 3x GPU一行 0.7–0.8 s,即 不是一个算术滑动:它是一个单独的、更大的模块,而且瞬间 每一个核心都有一个工人.
WebGL2 是Linux Firefox 和 Chrome 今天所拍摄的, 因为两者都不启用 WebGPU 默认的;这些堆栈已知运行正确,但从未被定时, 所以上面的数字是macOS。 明确命名后端使不支持 选择错误而不是沉默的下调。 CPU 模块是运行的命令行可执行文件的同名 fp32 C 已经 位点精确 与之相伴; 二个 GPU 路径为 fp16并携带 voxel 准确性预算.
CPU 后退需要两个标题
它是一个线粒体构建,所以它导入了共享内存,以及一个不是 跨原生隔离无法即时解脱——模块挂起而不是 失败, 因此在取回之前先检查它 。 服务于 顶级文档 改为:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
把他们放在 .wasm 反之则无所作为:孤立是一种
属性。 注意费用,这是部署的通常原因
再次关闭隔离: 下 require-corp 每一个交叉来源
子资源 页面加载 —— 图像、 字体、 分析、 嵌入 —— 必须自己发送
Cross-Origin-Resource-Policy 或适当的CORS, 或将被屏蔽。 然后说:
import { checkCpuSupport } from '@brainchop/mindgrab'
const cpu = checkCpuSupport()
if (!cpu.supported) console.warn(cpu.reasons.join('\n'))
Playwright的补丁Firefox Nightly 运行这个模块的速度比 Chromium, 但安装的 Firefox 153.0.1 运行了相同的位精确模型 16 在 7.6 s. 夜生结果作为牵引/编译异常保留,而不是a 警告 Firefox 用户一般.
所需资源
对于 WebGPU 路径: 带有 WebGPU 的 WebGPU shader-f16 特性, maxStorageBufferBindingSize 财务报告和审定财务报表
maxBufferSize 至少为 512个小米B (一个f16活化缓冲器)和a
安全环境 —— 说 https 或者说 localhost。 。 。 . about:blank 财务报告和审定财务报表 file:// 没有
安全环境,以及那里 navigator.gpu 是未定义的, 它看起来是准确的
像浏览器,完全没有WebGPU.
在向用户提供按钮之前询问 :
import { checkSupport } from '@brainchop/mindgrab'
const report = await checkSupport()
if (!report.supported) console.warn(report.reasons.join('\n'))
模型
model | 已经 | 产出 |
|---|---|---|
'mindgrab' | 在任何模式中剥取头骨 | 带有非大脑花瓶的输入图像 |
'16chan18cls' | 18级脑分裂 | 标签音量 |
'mindmap' | 18级脑分裂(24道) | 标签音量 |
'mindsnap' | 104级 Desikan-Killiani地块 | 标签音量 |
每个模块都是单独的相片模块,其分量被编译入,只有在 你问它。 选项是按型号选取的,不匹配的选取在之前被拒绝 任何内容都被下载,因为一个可执行文件 从来没有广告它会是什么 缩放 :
await segment(buf, { model: 'mindgrab', saveConform: true })
// BrainchopError: mindgrab does not support `saveConform`: its output is the
// input image with non-brain voxels floored, so it is inherently in the input space
每个 MODELS 条目(和 listModels()载体 colormap数字 : { R, G, B, labels }, (中文(简体) ),
每个输出值一个条目,索引 0 背景(用于 mindgrab页:1 mask) (中文(简体) ). 这个
模特儿自己来的 colormap.json,像NiiVue这样的观众
直接 : nv.setColormapLabel(1, MODELS.mindsnap.colormap)。 。 。 .
选项
segment(input: ArrayBuffer | ArrayBufferView, options: SegmentOptions)
| 选项 | 模型 | 含义 |
|---|---|---|
model | 全部四个 | 所需经费他们之间没有合理的违约 |
ct | 全部四个 | 输入为 CT; 将 Hounsfield 转换为 Cormack 单位 |
comply | 全部四个 | 在合规前插入合规转换 |
saveConform | 16chan18cls, (中文(简体) ), mindmap, (中文(简体) ), mindsnap | 返回符合要求的 2563 个体积而不是重写到输入网格 |
mask | mindgrab | 还原二进制脑罩 result.mask |
borderMm | mindgrab | 将口罩边框加长为毫米;暗指 mask |
gzipOutput | 全部四个 | 覆盖与输入匹配的默认值 |
worker | 全部四个 | 在 Web Worker 中运行整个分区. 建议,并且是保持页面响应在 webgl2 运行, 同步 |
device | 全部四个 | 重复使用 a GPUDevice 你已经拥有 |
glContext | 全部四个 | 重复使用 a WebGL2RenderingContext 您已经拥有; 暗示 webgl2 |
assetPath | 全部四个 | 工人和模型的基础 URL .js编号 :.wasm 服务从,当主机服务 dist/ 本身; 捆绑者不需要, 见下文 |
timeoutMs | 全部四个 | 推断限度(默认为 120 000;900 000) cpu,用于 auto 下级 worker: true,在计时器被武装后选择后端). 模块装入/证实有其自身的限度: timeoutMs 和两分钟,所以一个被停滞的线粒体启动不能伪装成慢的CPU运行. 丢失的 GPU 设备否则永远不会结算; 只有 worker: true 实际取消 |
onLog | 全部四个 | 接收模块输出行 |
输出在 默认输入图像的自有空间每个模型。 这个 反转脑-cli,其中符合的网格是默认的.
--crop 财务报告和审定财务报表 --export-classes,这是当地可执行文件提供的
故意缺席 两者都强迫CPU引擎 gPU 模块内,哪个
编译时没有线程,每卷需要141至266 s;接受
将两秒钟的呼叫变成四分钟的一次,没有警告。 这个 cpu
后端是一个不同的模块,不会改变这个模块.
炸弹
没有复制和没有 assetPath:工人和每个型号的胶被导入
字数 new URL('./worker.js', import.meta.url) 财务报告和审定财务报表 import('./<glue>.js')
说明器,每根胶水都定位它 .wasm 同样的方式,所以维特,滚出和
网包放出他们所有的 (hashed) 一个呼叫者仍然只下载模型和
后端它运行。 Vite 需要两个设置: worker.format: 'es' 页:1 vite build (默认)
iife 工人的顶级等待不能进行) optimizeDeps.exclude 页:1 vite dev (单位:千美元)
dev 预绑定器将软件包移动到 .vite/deps/,其中工人URL 404s:
// vite.config.js
export default {
optimizeDeps: { exclude: ['@brainchop/mindgrab'] },
worker: { format: 'es' },
}
捆绑者发出每个模块,所以 @brainchop/mindgrab 全部部署
十二(~10 MB). 一个运行一个模型的输入的宿主
相反,它具有相同的API,只部署其三个模块(MindGrab:
~ 2.6 MB 在 vite build:
import { segment } from '@brainchop/mindgrab/mindgrab' // or /16chan18cls, /mindmap, /mindsnap
listModels() 返回一个模型( q)MODELS 仍然描述所有四个,
并且拒绝任何其他型号
与 unsupported-option (除非 assetPath 设置,由 URL 负载.
建设和网络包装也跟随进口,但不要固定节点
node:* 导入 CPU 模块( 也在节点下运行) : 标记它们
外部(esbuild --external:'node:*'网络包装 externals: /^node:/) 建设
不发射 new URL() 资产,所以一个重建主机也设置 assetPath。 。 。 .
assetPath 给服务宿主的遗物 dist/ 复制工人和
这个模型的 .js 财务报告和审定财务报表 .wasm 某处服务并指向 assetPath 临Τ 它必须
是同源的; 它能提供动态 import()。 。 。 .
错误
每个软件包出错都会丢出一个 BrainchopError 带有 code 您可以在 :
no-webgpu, (中文(简体) ), no-adapter, (中文(简体) ), device-too-small, (中文(简体) ), no-f16, (中文(简体) ), unsupported-option, (中文(简体) ),
bad-input, (中文(简体) ), initialization-failed, (中文(简体) ), inference-failed。 。 。 . initialization-failed
表示模块从未启动,因此重试可以有意义; inference-failed
意味着它开始而没有完成。 有一个 无后退 他们中的任何一个,
根据决定,沉默地降级比拒绝更糟糕. auto
在后端中选择并非例外: 它发生在任何事情之前
找到的 只有在你没有表达任何倾向时.
no-webgpu 这也是什么 cpu 拒绝报告——"本页并非跨源
被隔离的"根据代码而不是第四个到达, 所以读一下消息,
或打电话 checkCpuSupport() 先说.
准确性
这个 cpu 后端为零相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相去相相去相去相去相去相去相相去相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相.
模型16 本地-空间多数定点有一个单独的主题参考:
原已存在的符合原样/原样的标签差异通过新投票进行抽样.
是从未经修改的合并主机和新的固定装置独立复制的
对照浏览器的投票功能进行校验。 见
参考来源。 。 。 .
两个GPU
路径为fp16,与项目的金属一样,按每伏xel预算计算
后端而不是比特精确度。 历史近邻结果
项目的固定装置,作为16.7M(2毫米,1.6M)的活氧化物:
| 大小写 | 预算 | 网络gpu | 网络gl2 |
|---|---|---|---|
| 脑袋 | 64国道 | 页:1 | 33个 |
| 18级(16道) | 第1024号 | 682 (英语) | 710号 |
| 18级(16个频道),本土2毫米 | 256号 | 88国道 | 94国道 |
| 心电图(24道,18等) | 第1024号 | 564 (韩语) | 610个 |
| 原生2毫米心电图 | 256号 | 88国道 | 86 (简体中文) |
| mainnap (104- way argmax) (英语) | 2048 (英语) | 1280号 | 1219号 |
| 土生土长2毫米 | 512号 | 198 (韩语) | 184 (韩语) |
目前的多数投票制检查保留了这些预算。 组织图保留
现有 2/255 RMSE门在非零结合 和准确的NIfTI几何.
大楼
npm install
npm run build # build all three backends' modules, stage into dist/, types, bundle
npm test # drives the built package in a real browser
测试开始 标题 macOS上的无头铬没有GPU,需要一种
安装了剧作家的退出( u)BC_PLAYWRIGHT_ROOT) (中文(简体) ).