VTM工程配置libtorch环境

2023-10-10 02:10

本文主要是介绍VTM工程配置libtorch环境,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VTM配置libtorch

首先下载libtorch库,可以百度搜索下载地址.下载完成之后将其解压到文件夹中,如下图所示,

 其中include文件夹下是libtorch库的头文件;
lib文件夹下是libtorch库的静态库(lib)和动态链接库(dll);
share文件夹下有之后cmake配置时要find的.cmake文件,用于在cmake时让项目链接到libtorch库;

之后配置环境变量,如下图所示,将如下几个目录加入到环境变量中

 配置完成之后,就可以在VTM工程中的CMakeLists.txt中添加如下语句,用于cmake时链接到libtorch库

find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")

 最后使用cmake进行编译即可。

问题:

在编译完成后,打开VTM工程,运行时会出现重定义的错误,这是由于在libtorch库和VTM中存在几个相同名称的变量,可以将VTM中同名称的变量重命名,或者可以将libtorch中同名的变量注释掉(亲测可用)。

libtorch的简单使用:

1. 加载模型

定义torch::jit::script::Module类型的变量用于加载模型

  torch::jit::script::Module m_lumaModuleISlice[3];torch::jit::script::Module m_chromaModuleISlice[3];torch::jit::script::Module m_lumaModuleBSlice[5];torch::jit::script::Module m_chromaModuleBSlice[5];

 通过torch::jit::load函数加载模型

void CNNFilter::initISlice(int qp)
{if (m_modelInitFlagISlice)return;at::set_num_threads(1);at::set_num_interop_threads(1);for (int i = 0; i < 3; i++){std::string sLumaModelName = "E:/VTM/models/JVET_W_EE_LumaCNNFilter_IntraSlice_qp" + sQp[i] + ".pt";std::string sChromaModelName = "E:/VTM/models/JVET_W_EE_ChromaCNNFilter_IntraSlice_qp" + sQp[i] + ".pt";m_lumaModuleISlice[i] = torch::jit::load(sLumaModelName); // 加载模型m_chromaModuleISlice[i] = torch::jit::load(sChromaModelName);}}

2. 创建模型的输入

 torch::Tensor张量类型,libtorch和pytorch中许多api一致,以产生全1张量为例,通过torch::ones({1, 1, blockSizeVer, blockSizeHor})产生尺寸为{1, 1, blockSizeVer, blockSizeHor}的四维张量,注意libtorch是使用{}表示尺寸。

定义好张量以后,可以通过调用data_ptr()函数获得指针,通过指针直接修改数据。

  torch::NoGradGuard no_grad_guard用于不计算梯度,和pytorch中的with torch.no_grad()等效

  torch::Tensor imageBatch = torch::ones({1, 1, blockSizeVer, blockSizeHor});float *pImageBatch = imageBatch.data_ptr<float>(); // 指向imageBatch的指针torch::Tensor predBatch = torch::ones({1, 1, blockSizeVer, blockSizeHor});float *pPredBatch = predBatch.data_ptr<float>(); // 指向predBatch 的指针// Create a vector of inputs. 创建vector用于模型输入std::vector<torch::jit::IValue> input; input.push_back(imageBatch);input.push_back(predBatch);int idx = 0;int blockSize = blockSizeVer * blockSizeHor;torch::NoGradGuard no_grad_guard;torch::globalContext().setFlushDenormal(true);//at::init_num_threads();for (int yy = 0; yy < blockSizeVer; yy++){for (int xx = 0; xx < blockSizeHor; xx++){// 通过指针给tensor赋值idx = yy * strideRec + xx;pImageBatch[yy*blockSizeHor+xx] = pRec[idx] / maxValue;  idx = yy * stridePred + xx;pPredBatch[yy*blockSizeHor+xx] = pPred[idx] / maxValue;}}

3. 模型推理

module->forward(): 模型前向传播的函数,输入值建议使用vector类型

  // Execute the model and turn its output into a tensor. 推理模型并将输出转换为tensorat::Tensor output = m_lumaModuleISlice[modelIdx].forward(input).toTensor();float *pOutput = output.data_ptr<float>(); // 输出tensor的指针

模型返回值

如果模型只有一个返回值,那么常用如下语句toTensor转换成张量

at::Tensor result = module.forward({tensor_image}).toTensor();

如果模型有多个返回值,那么则需要转换成Tuple.

auto result = module.forward({tensor_image}).toTuple();
at::Tensor loc= result->elements()[0].toTensor();
at::Tensor conf = result->elements()[1].toTensor();


 

这篇关于VTM工程配置libtorch环境的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/177188

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

安装nodejs环境

本文介绍了如何通过nvm(NodeVersionManager)安装和管理Node.js及npm的不同版本,包括下载安装脚本、检查版本并安装特定版本的方法。 1、安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 2、查看nvm版本 nvm --version 3、安装

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联