在NVIDIA Jetson上部署OpenAI的CLIP模型

在本文中,将探讨如何在NVIDIA Jetson系列边缘AI设备上,通过优化推理服务器来实现最佳性能。这包括针对其CPU和GPU架构特别定制的驱动程序、库和二进制文件。

CLIP模型简介

CLIP是由OpenAI开发的开源视觉模型,它能够生成文本和图像嵌入。这些嵌入编码了文本和图像的语义信息,可以用于多种计算机视觉任务。以下是一些可以使用CLIP模型完成的任务:

  • 识别两个图像或视频帧之间的相似性;
  • 识别文本提示和图像之间的相似性(例如,判断“火车轨道”是否代表图像内容);
  • 为图像分类模型自动标记图像;
  • 构建语义图像搜索引擎;
  • 收集与指定文本提示相似的图像,用于训练模型;
  • 等等!

通过在Jetson上部署CLIP,可以在边缘为应用程序需求使用CLIP。

Jetson设备的初始化

确保Jetson设备已使用Jetpack 5.1.1进行刷机。首先,从下载Jetson Orin Nano开发者套件SD卡镜像,然后按照NVIDIA的指导将镜像写入microSD卡。

一旦Jetson Nano开机并启动,可以使用以下代码库检查是否已安装Jetpack 5.1.1:

git clone https://github.com/jetsonhacks/jetsonUtilities.git cd jetsonUtilities python jetsonInfo.py

运行Roboflow推理Docker容器

Roboflow推理提供了针对多种设备和环境的Docker配置。有一个特别为NVIDIA Jetsons设计的Docker容器。可以在中了解更多关于Roboflow推理Docker镜像的构建、拉取和运行。

按照以下步骤运行Jetson Orin Docker容器:

git clone https://github.com/roboflow/inference docker build -f dockerfiles/Dockerfile.onnx.jetson.5.1.1 -t roboflow/roboflow-inference-server-trt-jetson-5.1.1 sudo docker run --privileged --net=host --runtime=nvidia --mount source=roboflow,target=/tmp/cache -e NUM_WORKERS=1 roboflow/roboflow-inference-server-trt-jetson-5.1.1:latest

在Roboflow推理服务器上使用CLIP

以下代码通过向边缘的OpenAI CLIP模型发送POST请求并返回图像的嵌入向量。传入图像URL、Roboflow API密钥和连接到运行Jetpack 5.1.1的Docker容器的基础URL(默认为http://localhost:9001):

import requests dataset_id = "soccer-players-5fuqs" version_id = "1" image_url = "https://source.roboflow.com/pwYAXv9BTpqLyFfgQoPZ/u48G0UpWfk8giSw7wrU8/original.jpg" # 替换为Roboflow API密钥 api_key = "ROBOFLOW_API_KEY" # 定义请求负载 infer_clip_payload = { # 图像可以作为URL提供,也可以作为base64编码的字符串提供 "image": { "type": "url", "value": image_url, }, } # 定义推理服务器URL(localhost:9001, infer.roboflow.com等) base_url = f"http://localhost:9001" # 定义Roboflow API密钥 api_key = "YOUR_API_KEY_HERE" res = requests.post( f"{base_url}/clip/embed_image?api_key={api_key}", json=infer_clip_payload, ) embeddings = res.json()['embeddings'] print(embeddings)

使用CLIP嵌入计算图像相似性

在为多张图像创建嵌入向量后,可以计算嵌入向量的余弦相似性并返回相似性分数:

# 计算嵌入向量之间相似性的函数 def calculate_similarity(embedding1, embedding2): # 在此处定义相似性度量标准 # 可以使用余弦相似性、欧几里得距离等 cosine_similarity = np.dot(embedding1, embedding2) / (np.linalg.norm(embedding1) * np.linalg.norm(embedding2)) similarity_percentage = (cosine_similarity + 1) / 2 * 100 return similarity_percentage # 计算嵌入向量的相似性 embedding_similarity = calculate_similarity(embedding1, embedding2)

有了CLIP在边缘,可以嵌入图像、文本并计算相似性分数!

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485