利用 NVIDIA VISTA-3D NIM 微服务实现计算机断层扫描器官和疾病分割
全球计算机断层扫描(CT)次数已突破 3 亿。放射科医生正在想方设法加快工作流并生成准确报告,因此拥有一个可对所有器官和疾病进行分割的基础模型会很有帮助,并且最好有一种经过优化的方法,能在生产中大规模运行这一模型。
NVIDIA Research 已经开发出一种新模型,用于分割全身 CT 图像,并将其封装到一个高度优化的容器中,该容器可以在部署时进行扩展。本文将讨论 VISTA-3D 基础模型 NVIDIA NIM 微服务,以及如何在数据上运行该模型。
VISTA-3D
视觉基础模型越来越受到关注。有两个基本特征使这些模型在医学图像分析领域特别实用:
- 对常见任务的快速、精准推理
- 对新任务的有效适应或零样本能力
NVIDIA 一直专注于研究 3D CT 分割,并在最近开发出了 VISTA-3D(多功能图像分割和注释)。该模型在超过 12,000 个数据卷上系统训练而成,这些数据卷涵盖了 127 种人体解剖结构和各种病变(包括肺结节、肝肿瘤、胰腺肿瘤、结肠肿瘤、骨病变和肾肿瘤)。
该模型提供了精准的框外分割与最先进的零样本交互式分割。这一新型模型设计和训练策略为开发多功能医学图像基础模型带来了希望。
VISTA-3D 是一种特定领域的交互式基础模型。通过将语义分割与交互性相结合,该模型在各个医学图像解剖领域具有高度的准确性和适应性。该模型的核心工作流如下:
- 分割全身:实现全身探索,这对于了解影响多个器官的复杂疾病和制定整体治疗计划至关重要。
- 按类分割:根据特定类别提供详细的切面视图,该视图对于有针对性的疾病分析或器官绘图(如关键器官的肿瘤识别等)必不可少。
- 分割点提示:通过用户指示的点击选择提高分割精度。这种交互方法可加速创建进行医学图像分析所必需的准确基准真相数据。
图 1 显示了 VISTA-3D 架构的高层示意图,其中包括一个编码器层和两个并行的解码器层。一个解码器用于自动分割,另一个解码器用于点提示。
每个头接收相应的输入作为类提示或用户点击点来引导分割,每个头还会产生各自的分割结果,然后使用合并算法,将这些结果合并成最终的分割结果。
有关该架构的更多信息,请参见研究论文《VISTA3D:适用于 3D 计算机断层扫描的多功能图像分割和注释模型》:
https://arxiv.org/abs/2406.05285
VISTA-3D NIM 微服务
所有 NVIDIA NIM 微服务都托管在 NVIDIA API 目录中,您可以测试不同的微服务并了解其功能。
在 Healthcare 下找到 VISTA-3D,并使用示例数据对其进行测试。以轴向和冠状或矢状视图查看测试数据集。VISTA-3D 可以分割 100 多个器官,您也可以选择感兴趣的特定类别。
使用 NVIDIA 托管的 NIM 微服务
您可以使用 NVIDIA 托管的 NIM 微服务在您的数据上运行 VISTA-3D。注册后即可获得个人密钥。NVIDIA 为用户提供 1,000 个免费兑换点数,供其试用任何 NIM 微型服务。
命名您的个人密钥并注明有效期。在包含的服务中加入 AI Foundation 模型和端点。您可以使用此密钥调用所有 API。更多信息,请参见选择生成一个 NGC 密钥:
https://docs.nvidia.com/launchpad/ai/base-command-coe/latest/bc-coe-docker-basics-step-02.html#optionally-generate-an-ngc-key
如要查看您的兑换点数,请登录 NVIDIA API 目录并访问您的个人资料。您的兑换点数位于右上角。
如要测试您的首个 VISTA-3D NIM 微服务调用,请复制您最喜欢语言(shell 脚本、Python 或 Node.JS)的代码,并使用最近生成的 API_KEY 值在您在 NVIDIA AI 解决方案页面上使用的同一个样本上运行推理,类似于下面的 Python 示例。
import requests
invoke_url = "https://health.api.nvidia.com/v1/medicalimaging/nvidia/vista-3d"
headers = {"Authorization": "Bearer <place you key here it should start with nvapi-> ",}
filename="example-1"
payload = {
"image": f"https://assets.ngc.nvidia.com/products/api-catalog/vista3d/{filename}.nii.gz",
"output": {"extension": ".nii.gz","dtype": "uint8"}}
session = requests.Session()
response = session.post(invoke_url, headers=headers, json=payload)
response.raise_for_status()
file_name=f"{filename}_seg.nii.gz"
with open(file_name, "wb") as file:
file.write(response.content)
print("File downloaded successfully!")
您由此在样本数据上运行了第一个 VISTA-3D NIM 微服务调用,这也证实了您的 API_KEY 值有效,而且您有足够的兑换点数,所以您现在可以使用自己的数据进行测试了。
每次推理调用消耗一个兑换点数,所有 NIM 微服务共享您的兑换点数。
使用您的数据运行 VISTA-3D
要在自己的数据上查看 VISTA-3D 推理,您必须设置一个 FTP 服务器来提供您的医学图像。
LLM 模型采用可压缩的小文本有效载荷,而医学图像通常都很大。您不必在 API 有效载荷中发送大图像,而是可以将图像 URL 发送到 FTP 服务器。然后,VISTA-3D NIM 微服务会从 FTP 服务器下载图像并运行推理,再将推理结果发送回来(图 2)。
在 GitHub 上共享文件
共享示例数据最简便快捷的方法是使用 GitHub:
- 登录您的 GitHub 帐户。
- 创建一个新项目,并确保它是公开的。
- 选择上传文件,上传一些带有 .nii 或 .nii.gz 的 NIfTI 文件。确保每个文件小于 25 MB。
- 选择 NIfTI 文件,右键单击 Raw,然后选择复制链接地址。
生成的 URL 应与下面的示例相似:
https://github.com/<your_user_name>/Nifti_samples/raw/main/filename.nii.gz
现在您可以更改先前代码示例中的 URL,使其指向您的文件,然后 VISTA-3D 就会下载它。
payload = {
"image": f"https://github.com/<your_user_name>/Nifti_samples/raw/main/filename.nii.gz",
"output": {"extension": ".nii.gz","dtype": "uint8"}}
在云中共享您的示例数据
如果云中已有一些数据,则可以公开少量 NIfTI 图像来测试 VISTA-3D。在这种情况下,可以从本地文件系统目录启动一个简单的 NGINX 服务器或简单的 Python HTTP 服务器。这必须是一个可公开访问的服务器或端口,以便 NVIDIA 托管的 VISTA-3D 微服务可以下载数据。
首先,使用 SSH 连接到服务器,移动一些示例数据,然后启动一个简单的 Python HTTP 文件服务器:
python -m http.server <port>
您可以通过浏览器使用 htttp://serverIP:port/ 来访问文件。
连接到之前创建的 FTP 服务器,并修改行以指向 HTTP 服务器。
filename="<file_on_http"
payload = {
"image": f"http://<your server ip:port /{filename}.nii.gz",
您应该会看到 HTTP 文件服务器响应 NIM 请求并下载图像文件,然后就会得到推理结果。
在本地运行 NIM 微服务
要开始在本地运行 NIM 微服务,请先申请 NVIDIA NIM 访问权限。申请后,NVIDIA 将与您联系并安排新用户引导会议。您需要一个 NVAIE 许可证或试用许可证,但务必在申请许可证前等待说明。
在完成这些步骤并获得批准后,您就可以访问 VISTA-3D NIM 微服务 Docker 容器,并在首选的本地或云端硬件上运行微服务。
在下面的章节中,我们将向您展示一个使用 Docker Compose 进行设置的示例,以帮助您快速启动和运行。
前提条件
您应该先已安装 Docker、Docker Compose 和 NVIDIA 驱动程序。如要进行检查,请运行以下命令,该命令会提取最新 CUDA 版本的小型镜像。启动 Docker 容器,然后检查是否可以从容器内访问 GPU。
docker run --rm --gpus all nvidia/cuda: 12.5.0-base-ubuntu20.04 nvidia-smi
您将会看到一个输出结果,显示您的系统上所搭载的 GPU。
Docker Compose 文件
Docker Compose 代码示例启动了两个容器:
- 用于运行推理的 nim-vista
- 用于提供图像的 nim-nginx
# docker-compose.yml
version: "3.9"
services:
nim:
container_name: nim-vista
image: nvcr.io/nvidia/nim/medical_imaging_vista3d:24.03
ports:
- 8008:8008
##############################
nginx:
container_name: nim-nginx
image: nginx:1.19-alpine-perl
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- <local/folder/containing/nifti/files>:/files
ports:
- 8009:8009
将目录改为 <local/folder/containing/nifti/files>。
Nginx 基本配置
在同个文件夹中创建 nginx.conf 文件:
worker_processes auto;
pid /etc/nginx/.nginx.pid;
events {
worker_connections 768;
}
http {
server {
listen 8009; # internal port
root /files; # Static file directory
autoindex on; # Enable directory listing
location / {
try_files $uri $uri/ = 404;
}
}
}
运行推理调用
要确认您的设置正确与否,请运行以下 curl 命令:
curl http://localhost:8008/health/ready
此命令应返回 true,表明 VISTA-3D NIM 微服务已启动并运行。
要确认 nginx 是否正在正常提供数据,可使用浏览器访问 http://localhost:8009,查看您正在共享的文件夹和文件。
现在,您可以重复使用之前的代码来进行推理,只需稍作改动,即从指向 NVIDIA 示例数据或 GitHub 上的示例文件改为指向 nginx 来提供数据。
import requests
invoke_url = “http://localhost:8008/vista3d/inference”
headers = {}
filename="test_w_nginx"
payload = {
"image": f"https://localhost:8809/<file Path as you it shows in nginx webpage>.nii.gz",
"output": {"extension": ".nii.gz","dtype": "uint8"}}
session = requests.Session()
response = session.post(invoke_url, headers=headers, json=payload)
response.raise_for_status()
file_name=f"{filename}_seg.nii.gz"
with open(file_name, "wb") as file:
file.write(response.content)
print("File downloaded successfully!")
invoke_url 值现在指向您的主机,并且由于您不需要使用 NGC 密钥进行身份验证,因此头信息为空。
该运行完成后,您就可以得到带有所有标签的器官分割文件了。
安全提示
运行此程序后,您可能不希望 NGINX 端口向任何可以访问主机的人开放数据。
您可能反而希望限制对 VISTA-3D NIM 微服务的访问。编辑 docker-compose.yml 文件,删除 nginx 的端口映射,删除端口的行数:ports: - 8009:8009。
接下来,将推理调用改为使用 nim-nginx,而不是已经无法访问的 localhost。
"image":fhttps://nim-nginx:8809/{filename}.nii.gz
由于 Docker Compose 将所有服务都放在同一个网络中,因此 NIM 可以访问内部名称 nim-nginx 。
总结
本文介绍了全新 NVIDIA AI Foundation模型 VISTA-3D,该模型可以对 CT 图像中的 100 多个器官和多种疾病进行分割。本文还展示了 NVIDIA NIM 如何简化该模型的使用。
想要增强您的 CT 图像分析能力吗?请先申请 VISTA-3D NIM 微服务的访问权限。获得批准后,您就可以在自己的硬件上运行这个功能强大的模型,提高分割准确性并简化工作流。