计算机视觉/视频分析

利用 NVIDIA VISTA-3D NIM 微服务实现计算机断层扫描器官和疾病自动分割

全球执行的计算机断层扫描 (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研究论文。

Diagram shows that the input image goes through an encoder and then two different decoders, one for automatic segmentation and the other for point segmentation.
图 1. VISTA-3D 的高级网络架构

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)。

Diagram shows that the LLM NIM takes the text directly in the payload, while the VISTA-3D NIM takes the URL to the image so it is downloaded from the HTTP server.
Figure 2. LLM 和 VISTA-3D NIM 微服务之间的差异

在 GitHub 上共享文件

分享样本数据的最简单、最快捷的方法是使用 GitHub:

  1. 登录您的 GitHub 帐户。
  2. 创建新项目并确保它是公开的。
  3. 选择“Upload file”(上传文件),并上传一些 NIfTI 文件,以 .nii 或 .nii.gz 为扩展名。确保每个文件的大小小于 25 MB。
  4. 选择您的 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 微服务.获得批准后,您可以在自己的硬件上运行此功能强大的模型,从而提高分割准确性并简化工作流程。

 

Tags