视频输入c++ 调用 libtorch推理

1、支持GPU情况

libtorch 支持GPU情况比较奇怪,目前2.3 版本需要在链接器里面加上以下命令,否则不会支持gpu

-INCLUDE:?ignore_this_library_placeholder@@YAHXZ
在这里插入图片描述

2 探测是否支持

加一个函数看你是否支持torch,不然不清楚,看到支持gpu才行

void IsSupportCuda()
{if (torch::cuda::is_available()){std::cout << "支持GPU" << std::endl;}else{std::cout << "不支持GPU" << std::endl;}torch::Tensor tensor = torch::rand({ 5,3 });torch::Device device1(torch::kCUDA);tensor.to(device1);std::cout << tensor <<"--"<< tensor.options() << std::endl;
};int main() {IsSupportCuda();return 0;
}

转化

在这里插入图片描述
使用命令转,如下图所示

yolo export model=yolov8s.pt imgsz=640 format=torchscript

在这里插入图片描述
成功以后在目录下面生成文件yolov8s.torchscript

c++ 调用

int main() {//IsSupportCuda();//return 0;// Devicetorch::Device device(torch::cuda::is_available() ? torch::kCUDA : torch::kCPU);// Note that in this example the classes are hard-codedstd::vector<std::string> classes{ "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light", "fire hydrant","stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra","giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite","baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup", "fork", "knife","spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair","couch", "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone","microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush" };try {// Load the model (e.g. yolov8s.torchscript)std::string model_path = "./yolov8s.torchscript";torch::jit::script::Module yolo_model;yolo_model = torch::jit::load(model_path);yolo_model.eval();yolo_model.to(device, torch::kFloat32);// Load image and preprocesscv::Mat image = cv::imread("d:/bus.jpg");cv::Mat input_image;letterbox(image, input_image, { 640, 640 });torch::Tensor image_tensor = torch::from_blob(input_image.data, { input_image.rows, input_image.cols, 3 }, torch::kByte).to(device);//auto image_tensor_float = image_tensor.to(torch::kFloat32);//image_tensor_float /= 255.0;image_tensor = image_tensor.toType(torch::kFloat32).div(255);image_tensor = image_tensor.permute({ 2, 0, 1 });image_tensor = image_tensor.unsqueeze(0);std::vector<torch::jit::IValue> inputs{ image_tensor };// Inferencetorch::Tensor output = yolo_model.forward(inputs).toTensor().cpu();// NMSauto keep = non_max_suppression(output)[0];auto boxes = keep.index({ Slice(), Slice(None, 4) });keep.index_put_({ Slice(), Slice(None, 4) }, scale_boxes({ input_image.rows, input_image.cols }, boxes, { image.rows, image.cols }));// Show the resultsfor (int i = 0; i < keep.size(0); i++) {int x1 = keep[i][0].item().toFloat();int y1 = keep[i][1].item().toFloat();int x2 = keep[i][2].item().toFloat();int y2 = keep[i][3].item().toFloat();float conf = keep[i][4].item().toFloat();int cls = keep[i][5].item().toInt();std::cout << "Rect: [" << x1 << "," << y1 << "," << x2 << "," << y2 << "]  Conf: " << conf << "  Class: " << classes[cls] << std::endl;}getchar();}catch (const c10::Error& e) {std::cout << e.msg() << std::endl;}return 0;
}

解码后视频帧调用

先使用opencv,同时使用硬件加速,使用硬件解码,新版本的使用方法已经不一样了,以下先举个例子,指定使用ffmpeg


int main() {// 创建一个 VideoCapture 对象,并指定使用 FFmpeg 作为后端  cv::ocl::setUseOpenCL(true);if (!cv::ocl::haveOpenCL()) {std::cerr << "OpenCL is not available.\n";return -1;}else {std::cout << cv::ocl::Device().getDefault().name() << std::endl;}cv::VideoCapture cap1("rtsp://127.0.0.1/99-640.mkv", cv::CAP_FFMPEG, {cv::CAP_PROP_HW_ACCELERATION,(int)cv::VIDEO_ACCELERATION_D3D11,cv::CAP_PROP_HW_DEVICE, 0});// cv::VideoCapture cap2("d:/8k.mp4", cv::CAP_FFMPEG);// 检查是否成功打开视频文件  if (!cap1.isOpened()) {std::cerr << "Error opening video file" << std::endl;return -1;}// 检查是否支持硬件加速double hw1 = cap1.get(cv::CAP_PROP_HW_ACCELERATION);// double hw2 = cap2.get(cv::CAP_PROP_HW_ACCELERATION);if (hw1 >= cv::VIDEO_ACCELERATION_ANY ) {// 支持硬件加速,尝试启用//cap.set(cv::CAP_PROP_HW_ACCELERATION, cv::VIDEO_ACCELERATION_ANY);std::cout << "Hardware acceleration enabled" << std::endl;}else {std::cout << "Hardware acceleration not supported or not available" << std::endl;}// 设置硬件加速(如果支持的话)  // 注意:不是所有的平台和驱动程序都支持硬件加速  // cap.set(cv::CAP_PROP_HW_ACCELERATION, cv::VIDEO_ACCELERATION_ANY);  cv::UMat uFrame,Frame; // GPU 上的 UMat 对象,用于直接接收解码后的数据  // 读取并处理视频帧  while (true) {// 尝试直接从 VideoCapture 读取帧到 UMat  cv::UMat m;bool ret = cap1.read(m);if (!ret) {std::cout << "End of video" << std::endl;break;}int w = m.cols;int h = m.rows;//m.copyTo(uFrame);//uFrame = m.getUMat(cv::ACCESS_READ);cv::UMat m1,m2,m3,m4,m5;//视频矫正rectify_umat(m, w, h, default_K0, default_D0, m1);//cv::Mat m1, m2, m3,m4;//放大增强cv::resize(m1, m2, cv::Size(w*2, h*2),0,0,cv::INTER_CUBIC);letterbox(m2, input_image, { 640, 640 });torch::Tensor image_tensor = torch::from_blob(input_image.data, { input_image.rows, input_image.cols, 3 }, torch::kByte).to(device);//auto image_tensor_float = image_tensor.to(torch::kFloat32);//image_tensor_float /= 255.0;image_tensor = image_tensor.toType(torch::kFloat32).div(255);image_tensor = image_tensor.permute({ 2, 0, 1 });image_tensor = image_tensor.unsqueeze(0);std::vector<torch::jit::IValue> inputs{ image_tensor };// Inferencetorch::Tensor output = yolo_model.forward(inputs).toTensor().cpu();// NMSauto keep = non_max_suppression(output)[0];auto boxes = keep.index({ Slice(), Slice(None, 4) });keep.index_put_({ Slice(), Slice(None, 4) }, scale_boxes({ input_image.rows, input_image.cols }, boxes, { image.rows, image.cols }));// Show the resultsfor (int i = 0; i < keep.size(0); i++) {int x1 = keep[i][0].item().toFloat();int y1 = keep[i][1].item().toFloat();int x2 = keep[i][2].item().toFloat();int y2 = keep[i][3].item().toFloat();float conf = keep[i][4].item().toFloat();int cls = keep[i][5].item().toInt();std::cout << "Rect: [" << x1 << "," << y1 << "," << x2 << "," << y2 << "]  Conf: " << conf << "  Class: " << classes[cls] << std::endl;}func_3_umat(m2, m3);func_1_umat(m3, m4);func_0_umat(m4, m5);cv::imshow("m", m);cv::imshow("m2", m2);cv::imshow("res", m5);if (cv::waitKey(10) == 'q') {break;}}// 释放资源  cap1.release();//cap2.release();cv::destroyAllWindows();return 0;
}

改进

未完待续。。。

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

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

相关文章

Hive函数详解

Hive 是一个建立在 Hadoop 上的数据仓库基础架构&#xff0c;它提供了类似于 SQL 的查询语言&#xff0c;称为 HiveQL&#xff0c;用于对存储在 Hadoop 分布式文件系统中的数据进行查询和分析。 1.函数简介 Hive会将常用的逻辑封装成函数给用户进行使用&#xff0c;类似于Jav…

Web前端开发 小实训(一) 成绩分类统计

用于学生web前端开发课程实训练习&#xff0c;掌握基本语法和数据类型 实训目的 使用分支语句&#xff0c;完成分数统计与等级对比,通过输入框输入分数&#xff0c;可以根据分数多少划分等级。 参考思路&#xff1a; 分析题目&#xff1a;根据输入分数进行等级划分。 操作过…

springboot如何使用RedisTemplate

第一步&#xff1a;创建一个spring boot项目 第二步&#xff1a;pom导入redis相关依赖 <!--reids依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </depen…

Go语言中的goroutine调度是如何实现的?

文章目录 一、M:N调度模型二、GMP模型三、调度过程四、调度优化五、示例代码 在Go语言中&#xff0c;goroutine是一种轻量级的线程&#xff0c;它使得并发编程变得更加简单和高效。而goroutine的调度则是Go运行时&#xff08;runtime&#xff09;系统负责的一个核心任务&#x…

std::remove_if

template <class ForwardIterator, class UnaryPredicate>ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,UnaryPredicate pred);std::remove_if函数删除容器中满足pred的元素&#xff0c;返回最后一个没被移除的元素后面一个迭代器&#xff0…

阿米巴经营之深入解读

目录 什么是阿米巴&#xff1f; 一、阿米巴经营的来历 二、阿米巴经营的三大好处和运作方式 三、阿米巴经营常见的两大问题与解决方案 稻盛和夫被誉为日本的经营之神。上个世纪&#xff0c;他创办经营的京瓷公司、KDDI公司等&#xff0c;先后成为了世界500强企业。2010年&…

Postman,一个功能强大的API开发和测试工具

最近有小伙伴说在找 postman 的使用教程&#xff0c;案例等文章。 那么今天我就来写一个。 Postman 是一个功能强大的 API 开发和测试工具&#xff0c;它提供了丰富的功能&#xff0c;帮助开发人员更好地管理、测试和文档化 API。无论是单独开发还是团队协作&#xff0c;Postma…

[1688]jsp工资投放管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 工资投放管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

Java读取网址信息

Java读取网址信息 今天的需求是根据接口获取JSON数据并存入&#xff0c;之前只会前端用Ajax或者Axios去处理显示出来没想过后端也要拿&#xff0c;没有思路于是查找&#xff0c;发现都是基础以前用的还是太少了&#xff0c;特此总结&#xff0c;后续有需要再补充。 1.读取get请…

vue都有那些指令?

Vue的指令是用于在HTML模板中添加特定功能的特殊属性。Vue提供了一些内置的指令&#xff0c;同时也支持自定义指令。以下是一些常用的Vue指令&#xff1a; v-bind&#xff1a;用于动态绑定HTML元素的属性。可以将Vue实例中的数据绑定到HTML元素的属性上&#xff0c;实现数据的动…

黑马面试篇

课程地址&#xff1a;新版Java面试专题视频教程&#xff0c;java八股文面试全套真题深度详解&#xff08;含大厂高频面试真题&#xff09;_哔哩哔哩_bilibili 课程名称&#xff1a;新版Java面试专题视频教程&#xff0c;java八股文面试全套真题深度详解&#xff08;含大厂高频…

【Kotlin】Flow简介

1 前言 Flow 是 Kotlin 标准库中的一个新的异步流处理框架&#xff0c;旨在简化异步数据流的操作和处理&#xff0c;它提供了一种声明式的方式来处理数据流。 Flow 中一些接口调用有些类似 Sequence&#xff08;详见 → Sequence简介&#xff09;&#xff0c;协程的使用详见 →…

Flutter - 折叠面板

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 flutter 自定义折叠组件 支持三种类型和两种展示效果可自定义title和被折叠的内容 效果图 示例 import package:flutter/material.dart; import /jh_common/widge…

K8s: 从集群外部访问Service

从集群外部访问 Service 1 &#xff09;概述 在前面我们一直实践的是在集群内部访问 Service&#xff0c;之前有2种方法 方法1&#xff1a;在一个node节点上&#xff0c;通过对创建的的时候&#xff0c;对port进行一个环境变量的注册来保证Service能够正确对 不同的pod 访问到…

基于SNAP使用SAR数据做变化检测change detection

基于SNAP使用SAR数据做变化检测change detection 1. 前言2. 步骤2.1 添加数据2.2 辐射定标--散斑过滤--地形矫正2.3 裁剪2.4 变化检测 3.查看变化检测结果 1. 前言 在SNAP中&#xff0c;change detection主要通过Stack工具来完成。 SAR数据&#xff1a;Radarsat-2 SLC 其他数据…

基于FastGPT搭建知识库问答系统

什么是 FastGPT &#xff1f; FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01; FastGPT 允许用户构建本地知识库&#xff0c;…

conda创建新环境

&#xff11;、创建虚拟环境&#xff1a; Anaconda创建环境&#xff1a;比如&#xff0c;创建pyhon&#xff1d;3.6的版本环境取名叫 name conda create -n name python3.6 2、删除虚拟环境操作&#xff1a;&#xff08;谨慎操作&#xff09; conda remove -n name --all &am…

MQTT数据传输Payload的常见格式介绍

使用MQTT client过程中看到常见的数据格式&#xff1a; 下面是介绍 Plaintext&#xff08;纯文本&#xff09; 介绍&#xff1a;纯文本编码是最基本的编码形式&#xff0c;它使用标准的ASCII或Unicode字符来表示数据。这种编码格式是人类可读的&#xff0c;因为它直接表示文本信…

(成品论文22页)24深圳杯数学建模A题1-4问完整代码+参考论文重磅更新!!!!

论文如下&#xff1a; 基于三球定位的多个火箭残骸的准确定位 针对问题一&#xff1a;为了进行单个残骸的精确定位&#xff0c;确定单个火箭残骸发生音爆 时的精确位置和时间&#xff0c;本文基于三球定位模型&#xff0c;考虑到解的存在性和唯一性&#xff0c; 选取了四个监测…

洛谷 B3969 [GESP202403 五级] B-smooth 数 题解

思路 我们只要求出每个数的最大质因数&#xff0c;再一个个判断是否满足要求即可。 如何找到每个数的最大质因数呢&#xff1f;其实&#xff0c;我们可以在埃氏筛法的基础上进行改进&#xff0c;从而达到算出最大质因数的目的。 让我们先来了解一下埃氏筛法&#xff0c;知道…