CLIP图文多模态模型onnxruntime和tensorrt推理

news2024/11/25 6:53:28

首先下载github项目:https://github.com/Lednik7/CLIP-ONNX
修改clip_onnx/utils.py第61行opset_version=12为opset_version=15 , 运行测试脚本:

import clip
from PIL import Image
import numpy as np

# ONNX不支持CUDA
model, preprocess = clip.load("ViT-B/32", device="cpu", jit=False)

# 批量优先
image = preprocess(Image.open("CLIP.png")).unsqueeze(0).cpu()  # [1, 3, 224, 224]
image_onnx = image.detach().cpu().numpy().astype(np.float32)

# 批量优先
text = clip.tokenize(["a diagram", "a dog", "a cat"]).cpu()  # [3, 77]
text_onnx = text.detach().cpu().numpy().astype(np.int32)


from clip_onnx import clip_onnx

onnx_model = clip_onnx(model, visual_path="clip_visual.onnx", textual_path="clip_textual.onnx")
onnx_model.convert2onnx(image, text, verbose=True)
onnx_model.start_sessions(providers=["CPUExecutionProvider"])  # CPU模式

image_features = onnx_model.encode_image(image_onnx)
text_features = onnx_model.encode_text(text_onnx)

logits_per_image, logits_per_text = onnx_model(image_onnx, text_onnx)
probs = logits_per_image.softmax(dim=-1).detach().cpu().numpy()
print("标签概率:", probs)

onnx_model = clip_onnx(None)
onnx_model.load_onnx(visual_path="clip_visual.onnx", textual_path="clip_textual.onnx", logit_scale=100.0000)  # model.logit_scale.exp()
onnx_model.start_sessions(providers=["CPUExecutionProvider"])
image_features = onnx_model.encode_image(image_onnx)
text_features = onnx_model.encode_text(text_onnx)

logits_per_image, logits_per_text = onnx_model(image_onnx, text_onnx)
probs = logits_per_image.softmax(dim=-1).detach().cpu().numpy()
print("标签概率:", probs)

onnxruntime推理

import clip
from PIL import Image
import numpy as np
import onnxruntime


model, preprocess = clip.load("ViT-B/32", device="cpu", jit=False)
image = preprocess(Image.open("CLIP.png")).unsqueeze(0).cpu()  # [1, 3, 224, 224]
image_input = image.detach().cpu().numpy().astype(np.float32)
text = clip.tokenize(["a diagram", "a dog", "a cat"]).cpu()  # [3, 77]
text_input = text.detach().cpu().numpy().astype(np.int32)


class clip_onnx:
    def __init__(self, model=None, visual_path: str = "clip_visual.onnx", textual_path: str = "clip_textual.onnx", logit_scale=None):
        self.model = model
        self.visual_path = visual_path
        self.textual_path = textual_path
        self.logit_scale = logit_scale

    def start_sessions(self, providers=['TensorrtExecutionProvider', 'CUDAExecutionProvider', 'CPUExecutionProvider']):
        self.visual_session = onnxruntime.InferenceSession(self.visual_path, providers=providers)
        self.textual_session = onnxruntime.InferenceSession(self.textual_path, providers=providers)

    def __call__(self, image, text, device: str = "cpu"):
        onnx_input_image = {self.visual_session.get_inputs()[0].name: image}
        image_features, = self.visual_session.run(None, onnx_input_image)
        onnx_input_text = {self.textual_session.get_inputs()[0].name: text}
        text_features, = self.textual_session.run(None, onnx_input_text)
        image_features = image_features /np.linalg.norm(image_features, axis=-1, keepdims=True)
        text_features = text_features / np.linalg.norm(text_features, axis=-1, keepdims=True)
        logits_per_image = self.logit_scale * image_features @ text_features.T
        logits_per_text = logits_per_image.T
        return logits_per_image, logits_per_text


onnx_model = clip_onnx(visual_path="clip_visual.onnx", textual_path="clip_textual.onnx", logit_scale=100.0000)  
onnx_model.start_sessions(providers=["CPUExecutionProvider"])
logits_per_image, logits_per_text = onnx_model(image_input, text_input)

def softmax(x, axis=-1):
    e_x = np.exp(x - np.max(x, axis=axis, keepdims=True))
    return e_x / np.sum(e_x, axis=axis, keepdims=True)

probs = softmax(logits_per_image)
print("标签概率:", probs)

tensorrt推理

要使得tensorrt正常推理还需注释掉clip_onnx/utils.py第63行的dynamic_axes,再生成onnx模型。
通过trtexec 转换onnx模型得到engine文件:

/docker_share/TensorRT-8.6.1.6/bin/trtexec --onnx=./clip_textual.onnx --saveEngine=./clip_textual.engine 
/docker_share/TensorRT-8.6.1.6/bin/trtexec --onnx=./clip_visual.onnx --saveEngine=./clip_visual.engine
import clip
from PIL import Image
import numpy as np
import tensorrt as trt
import pycuda.autoinit 
import pycuda.driver as cuda 


model, preprocess = clip.load("ViT-B/32", device="cpu", jit=False)
image = preprocess(Image.open("CLIP.png")).unsqueeze(0).cpu()  # [1, 3, 224, 224]
image_input = image.detach().cpu().numpy().astype(np.float32)
text = clip.tokenize(["a diagram", "a dog", "a cat"]).cpu()  # [3, 77]
text_input = text.detach().cpu().numpy().astype(np.int32)


class clip_tensorrt:
    def __init__(self, model=None, visual_path: str = "clip_visual.engine", textual_path: str = "clip_textual.engine", logit_scale=None):
        self.model = model
        self.visual_path = visual_path
        self.textual_path = textual_path
        self.logit_scale = logit_scale

    def start_engines(self, providers=['CUDAExecutionProvider', 'CPUExecutionProvider']):
        logger = trt.Logger(trt.Logger.WARNING)
        with open(self.visual_path, "rb") as f, trt.Runtime(logger) as runtime:
            self.visual_engine = runtime.deserialize_cuda_engine(f.read())
        self.visual_context = self.visual_engine.create_execution_context()
        self.visual_inputs_host = cuda.pagelocked_empty(trt.volume(self.visual_context.get_binding_shape(0)), dtype=np.float32)
        self.visual_outputs_host = cuda.pagelocked_empty(trt.volume(self.visual_context.get_binding_shape(1)), dtype=np.float32)
        self.visual_inputs_device = cuda.mem_alloc(self.visual_inputs_host.nbytes)
        self.visual_outputs_device = cuda.mem_alloc(self.visual_outputs_host.nbytes)
        self.visual_stream = cuda.Stream()

        with open(self.textual_path, "rb") as f, trt.Runtime(logger) as runtime:
            self.textual_engine = runtime.deserialize_cuda_engine(f.read())
        self.textual_context = self.textual_engine.create_execution_context()
        self.textual_inputs_host = cuda.pagelocked_empty(trt.volume(self.textual_context.get_binding_shape(0)), dtype=np.int32)
        self.textual_outputs_host = cuda.pagelocked_empty(trt.volume(self.textual_context.get_binding_shape(1)), dtype=np.float32)
        self.textual_inputs_device = cuda.mem_alloc(self.textual_inputs_host.nbytes)
        self.textual_outputs_device = cuda.mem_alloc(self.textual_outputs_host.nbytes)
        self.textual_stream = cuda.Stream()
        
    def __call__(self, image, text):
        np.copyto(self.visual_inputs_host, image.ravel())
        with self.visual_engine.create_execution_context() as context:
            cuda.memcpy_htod_async(self.visual_inputs_device, self.visual_inputs_host, self.visual_stream)
            context.execute_async_v2(bindings=[int(self.visual_inputs_device), int(self.visual_outputs_device)], stream_handle=self.visual_stream.handle)
            cuda.memcpy_dtoh_async(self.visual_outputs_host, self.visual_outputs_device, self.visual_stream)
            self.visual_stream.synchronize()  

        np.copyto(self.textual_inputs_host, text.ravel())
        with self.textual_engine.create_execution_context() as context:
            cuda.memcpy_htod_async(self.textual_inputs_device, self.textual_inputs_host, self.textual_stream)
            context.execute_async_v2(bindings=[int(self.textual_inputs_device), int(self.textual_outputs_device)], stream_handle=self.textual_stream.handle)
            cuda.memcpy_dtoh_async(self.textual_outputs_host, self.textual_outputs_device, self.textual_stream)
            self.textual_stream.synchronize()  
        
        image_features = self.visual_outputs_host.reshape(1,512)
        text_features = self.textual_outputs_host.reshape(3,512)
        image_features = image_features /np.linalg.norm(image_features, axis=-1, keepdims=True)
        text_features = text_features / np.linalg.norm(text_features, axis=-1, keepdims=True)
        logits_per_image = self.logit_scale * image_features @ text_features.T
        logits_per_text = logits_per_image.T
        return logits_per_image, logits_per_text


onnx_model = clip_tensorrt(visual_path="clip_visual.engine", textual_path="clip_textual.engine", logit_scale=100.0000)  
onnx_model.start_engines()
logits_per_image, logits_per_text = onnx_model(image_input, text_input)

def softmax(x, axis=-1):
    e_x = np.exp(x - np.max(x, axis=axis, keepdims=True))
    return e_x / np.sum(e_x, axis=axis, keepdims=True)

probs = softmax(logits_per_image)
print("标签概率:", probs)

CLIP.png
在这里插入图片描述

正常运行得到结果

标签概率: [[0.9927926  0.00421789 0.00298956]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2208580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FFmpeg的简单使用【Windows】--- 视频倒叙播放

实现功能 点击【选择文件】按钮可以选择视频,当点击【开始处理】按钮之后,会先将视频上传到服务器,然后开始进行视频倒叙播放的处理,当视频处理完毕之后会将输出的文件路径返回,同时在页面中将处理好的视频展示出来。…

SpringBoot Data JPA基本使用

一、项目起步 1.1 pom配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency><dependency><groupId>org.springframework.boot</groupId><…

基于ssm的美妆分享网站的设计与实现

文未可获取一份本项目的java源码和数据库参考。 经济的快速发展&#xff0c;人均可支配收入提高&#xff0c;多数年轻人化妆理念都已经改变。在化妆品消费渗透率不断提升、核心化妆人口持续扩散因素的多重影响下&#xff0c;化妆品行业持续高速增长&#xff0c;但是我们对美妆的…

C++题 十进制转二进制

文章目录 1. 使用C20 std::format2. 使用 std::bitset 类3. 手动实现十进制到二进制的转换反过来&#xff0c;手动二进制到十进制 VisualStudio2022使用C&#xff0c;进行十进制到二进制的转换&#xff0c;常见的实现方式 1. 使用C20 std::format 需要将VisualStudio默认的标准…

信息学奥赛复赛复习16-CSP-J2022-01乘方-循环特判、pow函数、快速幂

PDF文档回复:20241012 此前解析题&#xff0c;P8813 [CSP-J 2022] 乘方&#xff0c;给出了循环的解题思路&#xff0c;当时在洛谷提交是通过的&#xff0c;后台收到留言&#xff0c;a1,b1e9会炸吧&#xff1f;&#xff0c;确实啊整除要求1s内循环次数最大可以到10^7,现在测试数…

微信自动化工具,让多微管理更轻松更高效!

对于多个微信账号的管理&#xff0c;往往会让人感到繁琐和耗时。 这时&#xff0c;通过个微管理系统实现微信自动化设置&#xff0c;将大大提升我们的管理效率。 1、批量自动加好友 只需将客户号码一次性导入系统&#xff0c;设置好加好友规则&#xff0c;系统便会自动发送加…

PS文件保存后突然消失?别急,这里有7种解决方案!

咨询&#xff1a;“我刚做完的PS文件&#xff0c;保存得好好的&#xff0c;怎么就突然消失了呢&#xff1f;连回收站里都没有&#xff0c;这可怎么办才好。” 面对PS&#xff08;Photoshop&#xff09;文件在保存后突然消失的情况&#xff0c;许多设计师和图像处理爱好者可能会…

List的实现类

1.ArrayList&#xff08;数组&#xff09; &#xff08;1&#xff09;代码 新建学生类&#xff1a; package com.collection;public class Student {private String name;private int age;//添加构造方法 都是使用altenter快捷键public Student() {this.name name;this.age…

OCR经典神经网络(二)文本检测算法DBNet算法原理及其在icdar15数据集上的应用

OCR经典神经网络(二)文本检测算法DBNet算法原理及其在icdar15数据集上的应用 场景文本检测任务&#xff0c;一直以来是OCR整个任务中最为重要的一环。虽然有一些相关工作是端对端的&#xff0c;但是从工业界来看&#xff0c;相关落地应用较为困难。因此&#xff0c;两阶段的OC…

RUM性能优化之图片加载

作者&#xff1a;三石 在现代Web开发中&#xff0c;图片作为内容表达的核心元素&#xff0c;其加载效率直接影响到页面的整体性能和用户体验。随着高清大图和动态图像的普及&#xff0c;优化图片加载变得尤为重要。RUM作为一种主动监测技术&#xff0c;能够帮助开发者从真实用户…

【Linux-基础IO】软硬链接+动静态库

一、软硬链接 见一见 软连接 硬连接 通过观察我们发现以下几点&#xff1a; 1.ll - i后&#xff0c;软连接形成的文件有指向&#xff0c;并且软连接的Inode编号与对应文件的Inode编号不一样 2.ll - i后&#xff0c;硬连接形成的文件与对应的文件Inode编号一样 3.软连接…

贪心+dfs,CF 1975D - Paint the Tree

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1975D - Paint the Tree 二、解题报告 1、思路分析 我们从树中一点出发&…

【uni-app】HBuilderX安装uni-ui组件

目录 1、官网找到入口 2、登录帐号 3、打开HuilderX 4、选择要应用的项目 5、查看是否安装完成 6、按需安装 7、安装完毕要重启 8、应用 前言&#xff1a;uniapp项目使用uni-ui组件方式很多&#xff0c;有npm安装等&#xff0c;或直接创建uni-ui项目&#xff0c;使用un…

汽车免拆诊断案例 | 2013款宝马116i车偶尔加速不良

故障现象  一辆2013款宝马116i车&#xff0c;搭载N13B16A 发动机&#xff0c;累计行驶里程约为12.1万km。车主反映&#xff0c;该车行驶中偶尔加速无反应&#xff0c;且发动机故障灯异常点亮。 故障诊断 接车后试车&#xff0c;故障现象无法再现。用故障检测仪检测&#xff…

[论文阅读] MoAI: Mixture of All Intelligence for Large Language and Vision Models

原文链接&#xff1a;http://arxiv.org/abs/2403.07508 源码链接&#xff1a;https://github.com/ByungKwanLee/MoAI 启发&#xff1a;这篇文章提供一个比较新奇的思路&#xff0c;将传统CV小模型的输出进行语言化&#xff0c;转换成统一格式&#xff0c;传入到后续的模型中&…

8. Control Station Studio控制站开发平台概述

更多内容见CSDN博客专栏&#xff1a;无人机飞控 相关资源&#xff1a;https://gitee.com/ss15/ph47 8.1. 概述 Ground Control Station&#xff08;CSS&#xff09;是一个地面站软件开发平台&#xff0c;通过对控制站工程的设计搭建&#xff0c;从而开发出面向各种不同用途&a…

【软件测试】基本知识2

一、能对穷举场景设计测试点——等价类划分法 说明&#xff1a;在所有测试数据中&#xff0c;具有某种共同特征的数据集合进行划分 分类 有效等价类&#xff1a;满足需求的数据集合无效等价类&#xff1a;不满足需求的数据集合 步骤 明确需求确定有效和无效等价类提取数据编写…

linux使用xhell连接特别慢

linux使用xhell连接特别慢 在此记录一下 1.vi /etc/ssh/sshd_config&#xff0c;修改如下配置 GSSAPIAuthentication yes 修改 no UseDNS yes 修改 no 2.重新启动sshd服务 systemctl restart sshd

从混乱到卓越:六西格玛是如何助力企业摆脱困境的

六西格玛&#xff0c;这一源自摩托罗拉、发扬于通用电气的管理方法&#xff0c;以其严谨的数据分析、持续改进的理念&#xff0c;成为了企业转型升级的利器。它不仅仅是一套工具和方法论&#xff0c;更是一种追求卓越的文化和思维方式。在六西格玛的视角下&#xff0c;企业的一…

基于yolov8、yolov5的鸟类检测系统(含UI界面、数据集、训练好的模型、Python代码)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 &#xff0c; 直接提供最少两个训练好的模型。模型十分重要&#xff0c;因为有些同学的电脑没有 GPU&#xff0…