全球执行的计算机断层扫描 (CT) 扫描次数超过 300M 次,仅在美国就有 85M 次。放射科医生正在寻找加快工作流程并生成准确报告的方法,因此拥有一个基础模型来分割所有器官和疾病会很有帮助。理想情况下,您可以通过优化的方式在生产中大规模运行此模型。
NVIDIA Research 创建了一个新的基础模型,用于分割全身 CT 图像,并将其打包到高度优化的容器中,以便在部署中进行扩展。在本文中,我们将讨论 NVIDIA VISTA-3D 基础模型, NVIDIA NIM,以及如何在数据上运行模型。
VISTA-3D
视觉基础模型的兴趣与日俱增。在医学影像分析领域,两个基本特征使这些模型特别实用:
- 对常见任务进行快速精确的推理
- 有效适应或零-shot 能力,以适应新任务
NVIDIA 一直专注于 3D CT 分割,最近开发了 VISTA-3D (Versatile Imaging SegmenTation and Annotation)。该模型已在超过 12,000 个体积上进行系统训练,涵盖 127 种人类解剖结构和各种病灶(肺结节、肝脏肿瘤、胰腺肿瘤、结肠肿瘤、骨病灶和肾肿瘤)。
它提供了精确的开箱即用分割,以及 state-of-the-art 的零样本交互式分割。新的模型设计和训练 recipe 代表了朝着开发多功能医学影像基础模型迈出的有希望的一步。
VISTA-3D 是一种领域专用的交互式基础模型,它将语义分割与交互性相结合,为医学成像的不同解剖学领域提供高精度和适应性。它具有以下核心工作流程:
- 分割一切:启用全身探索,这对于了解影响多个器官的复杂疾病和整体治疗规划至关重要。
- 使用类别的分割:根据特定类别提供详细的分割视图,对于目标疾病分析或器官映射,例如关键器官中的肿瘤识别。
- 片段点提示: 通过用户指导的基于单击的选择,提高了医疗影像分析中准确的真值数据创建的精度。这一种交互式方法加速了准确的真值数据的创建,这在医学影像分析中至关重要。
图 1 显示了 VISTA-3D 架构的高级图表,其中一个编码器层后跟两个并行解码器层。一个解码器用于自动分割,而另一个解码器用于点提示。
每个头部都会接收相应的输入作为类提示或点点击,由用户指导分割。
每个头部还会生成自己的分割结果,然后使用合并算法将这些结果合并到最终分割结果中。
有关该架构的更多信息,请参阅VISTA3D: Versatile Imaging Segmentation and Annotation model for 3D Computed Tomography研究论文。
VISTA-3D NIM 微服务
所有 NVIDIA NIM 微服务均托管在 NVIDIA API 目录 上,以便您测试不同微服务并了解其功能。
在 Healthcare 下找到 VISTA-3D,并使用样本数据对其进行测试。以 axial、coronal 或 sagittal 视图查看测试数据集。VISTA-3D 可以分割超过 100 个器官,也可以选择特定类别感兴趣的器官。
使用 NVIDIA 托管的 NIM 微服务
您可以使用 NVIDIA 托管的 NIM 微服务对数据运行 VISTA-3D。注册以获取个人密钥获取个人密钥。NVIDIA 为用户提供 1000 个免费信用来试用任何 NIM 微服务。
为您的个人密钥指定名称和到期日期。在随附的服务中包含 AI Foundation Models 和 Endpoints。您可以在所有 API 调用中使用此密钥。有关更多信息,请参阅 Optionally 生成 NGC 密钥。
要查看您的积分,请登录到NVIDIA API Catalog并查看您的个人资料。您的积分列在右上角。
要测试首次 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
值是否有效,并且您有足够的 credits,现在您可以使用自己的数据进行测试。
每次推理调用都使用一个信用,您的信用在所有 NIM 微服务中共享。
使用数据运行 VISTA-3D
要在自己的数据上查看 VISTA-3D 推理,您必须设置一个 FTP 服务器来提供医疗图像。
与接收可压缩的小型文本负载的 LLM 模型不同,医学影像通常很大。您无需在 API 负载中发送大型图像,而是将图像 URL 发送到 FTP 服务器。然后,VISTA-3D NIM 微服务从 FTP 服务器下载图像并运行推理,然后再发送推理结果(Figure 2)。
在 GitHub 上共享文件
分享样本数据的最简单、最快捷的方法是使用 GitHub:
- 登录您的 GitHub 帐户。
- 创建新项目并确保它是公开的。
- 选择“Upload file”(上传文件),并上传一些 NIfTI 文件,以 .nii 或 .nii.gz 为扩展名。确保每个文件的大小小于 25 MB。
- 选择您的 NIfTI 文件,右键单击Raw,然后选择Copy link address。
生成的 URL 应该类似于以下示例:
https://github.com/<your_user_name>/Nifti_samples/raw/main/filename.nii.gz
现在,您可以更改之前代码示例中的 URL,以指向您的文件并进行下载。
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>
您应该能够使用 http://serverIP:port/
从浏览器访问这些文件。
连接到之前创建的 FTP 服务器,并更改行以指向您的 HTTP 服务器。
filename="<file_on_http"
payload = {
"image": f"http://<your server ip:port /{filename}.nii.gz",
您会看到 HTTP 文件服务器响应了 NIM 请求,以下载图像文件,然后您将获得推理结果。
在本地运行 NIM 微服务
要开始在本地运行 NVIDIA NIM 微服务,请申请 NVIDIA NIM 访问权限。申请完成后,NVIDIA 团队将与您联系以安排入门会议。在申请许可证之前,请务必等待指示,因为您需要 NVIDIA 许可证或试用许可证。
完成这些步骤并获得批准后,您将获得对 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
您应该会看到一个输出,其中显示了系统上的 GPUs。
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 文件
文件:
运行推理调用
要确认您的设置是否正确,请运行以下 curl 命令:
curl http://localhost:8008/health/ready
此命令应返回 true,表明 VISTA-3D NIM 微服务已启动并运行。
要确认nginx
是否正确提供数据,请在浏览器上查看http://localhost:8009以查看您正在共享的文件夹和文件。
现在,您可以重复使用之前的相同代码进行推理,只需稍作更改,即指向nginx
以提供数据,而不是指向 NVIDIA 示例数据或您的 GitHub 上的示例文件。
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
值指向您的主机,且 headers 为空,因为您无需使用 NGC 密钥进行身份验证。
运行后,您应该拥有包含所有标签的 organs segmentation 文件。
安全提示
运行后,您可能不想让 NGINX 端口打开,以便向任何有主机访问权限的人提供数据。
改为限制对 VISTA-3D NIM 微服务的访问。编辑 docker-compose.yml
文件,并删除 ports: - 8009:8009
的行,以删除 nginx
的端口映射。
接下来,将 infer 调用更改为使用nim-nginx
而非localhost
,后者已不可访问。
"image":fhttps://nim-nginx:8809/{filename}.nii.gz
当 Docker Compose 将所有服务置于同一网络中时,NIM 可以访问内部名称 NIM-nginx
。
结束语
在本文中,我们介绍了新的 NVIDIA AI 基础模型 VISTA-3D,该模型可以在 CT 图像中分割超过 100 个器官和多种疾病。我们还向您展示了 NVIDIA NIM 如何简化使用这个模型的过程。
是否有兴趣增强您的 CT 影像分析? 申请访问 VISTA-3D NIM 微服务.获得批准后,您可以在自己的硬件上运行此功能强大的模型,从而提高分割准确性并简化工作流程。