Yolov8部署——segmentation部署以及批量推理

Yolov8部署——segmentation部署以及批量推理

参考:在windows上部署Yolov8主要参考下面两个仓库,https://github.com/xunzixunzi/tensorrt-cpp-api和https://github.com/xunzixunzi/YOLOv8-TensorRT-CPP,代码说是适合批量处理,但是代码中是以batchsize=1为例,所以需要修改一下。
具体修改:我需要的batchsize=6,是要将一张大图,切分成小图,之后以batchsize=6进行推理,主要修改bool YoloV8::infer(const cv::cuda::GpuMat& inputImage, std::vector<InferenceObject>& inferenceObjects)void YoloV8::preprocess(const cv::cuda::GpuMat& gpuImg, std::vector<std::vector<cv::cuda::GpuMat>>& inputs)这个函数,我是把这两个函数合起来进行批量推断修改如下:

// 处理输入图片std::vector<std::vector<cv::cuda::GpuMat>> inputs;   //二维向量const auto& inputDims = m_trtEngine->getInputDims();int imgWidth = gpuImage.cols;int imgHeight = gpuImage.rows;int numCols = imgWidth / blockWidth;int numRows = imgHeight / blockHeight;const int totalBlocks = numCols * numRows;//总的张数int blockCounter = 0;//分割并存储每个图像块到 input 向量中std::vector<cv::cuda::GpuMat> input;for (int y = 0; y < numRows; ++y) {for (int x = 0; x < numCols; ++x) {cv::Rect roi(x * blockWidth, y * blockHeight, blockWidth, blockHeight);cv::cuda::GpuMat block(gpuImage(roi));cv::cuda::GpuMat rgbMat;cv::cuda::cvtColor(block, rgbMat, cv::COLOR_BGR2RGB);if (rgbMat.rows != inputDims[0].d[1] || rgbMat.cols != inputDims[0].d[2]) {throw std::runtime_error("Error:图片尺寸不对.");}else {input.emplace_back(rgbMat);}blockCounter++;if (input.size() == 6 || (input.size() != 6 && blockCounter == totalBlocks)) {while (input.size() < 6) {// 如果不足六张图像,则用全黑的图像补全cv::cuda::GpuMat blackImage(blockHeight, blockWidth, CV_8UC3, cv::Scalar(0, 0, 0));input.emplace_back(blackImage);}inputs.emplace_back(std::move(input));std::vector<std::vector<std::vector<float>>> featureVector;auto succ = m_trtEngine->runInference(inputs, featureVector);if (!succ) {throw std::runtime_error("Error: Unable to run inference.");}input.clear();inputs.clear();featureVectors.insert(featureVectors.end(), std::make_move_iterator(featureVector.begin()), std::make_move_iterator(featureVector.end()));}}}

之后模型后处理拼接推断结果:

// 后处理阶段需要用m_imgHeight = static_cast<float>(blockWidth);m_imgWidth = static_cast<float>(blockHeight);m_ratio = 1.f / std::min(inputDims[0].d[2] / static_cast<float>(blockWidth), inputDims[0].d[1] / static_cast<float>(blockHeight));int numColsl = gpuImage.cols / blockWidth;int numRowsl = gpuImage.rows / blockHeight;cv::Mat fullMask = cv::Mat::zeros(gpuImage.size(), CV_8UC1);int cnt = 0;for (int i = 0; i < numRowsl; ++i) {for (int j = 0; j < numColsl; ++j) {std::vector<std::vector<float>> batch;batch = featureVectors[cnt];postprocessSegmentation(batch, inferenceObjects);if (!inferenceObjects.empty()) {for (int k = 0; k < inferenceObjects.size(); ++k) {auto& object = inferenceObjects[k];std::vector<int> objectInfo;objectInfo.push_back(object.label); // 假设id是int类型objectInfo.push_back(object.rect.x + j * 640); // x值objectInfo.push_back(object.rect.y + i * 640); // y值objectInfo.push_back(object.rect.width); // 宽度wobjectInfo.push_back(object.rect.height); // 高度h// 将objectInfo添加到Result向量中Result.push_back(objectInfo);if (!object.boxMask.empty()) {// 对对象的rect位置进行操作object.rect.x += j * 640;object.rect.y += i * 640;// 在fullMask上根据修改后的对象的rect位置放置掩码cv::Mat roi = fullMask(object.rect);cv::Mat resizedMask;cv::resize(object.boxMask, resizedMask, object.rect.size());resizedMask.copyTo(roi, resizedMask);}fullMask.copyTo(BinMat);}}cnt += 1;inferenceObjects.clear();}}

最后得到Result(里面存储分割并分类的标签、x、y、height和width)和一个分割的掩码二值化图。

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

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

相关文章

bootstrap5实现的在线商城网站Parlo

一、需求分析 在线商城网站是指基于互联网技术搭建的电子商务平台&#xff0c;通过网站提供商品和服务的展示、销售和交易功能。它的主要作用包括以下几个方面&#xff1a; 商品展示和销售&#xff1a;在线商城网站是商家展示商品的平台&#xff0c;可以通过图片、文字、视频等…

水经微图IOS版APP正式上线!

水经微图APP&#xff08;简称“微图APP”&#xff09;IOS版已正式上线&#xff01; 微图IOS版APP下载安装 节后上班第一天&#xff0c;同事说微图APP通过了苹果应用商店审核&#xff0c;已经上线了。 于是迫不及待地打开 App Store 搜索“水经微图”&#xff0c;但并没有搜索…

uniapp中组件库的Radio 单选框丰富的使用方法

目录 #平台差异说明 #基本使用 #自定义形状 #禁用radio #是否禁止点击提示语选中复选框 #自定义颜色 #横向排列形式 #横向两端排列形式 API #Radio Props #radioGroup Props #radio Event #radioGroup Event 单选框用于有一个选择&#xff0c;用户只能选择其中一个…

复试 || 就业day06(2024.01.01)算法篇

文章目录 前言分糖果最长和谐子序列两个列表的最小索引总和错误的集合两数之和 IV - 输入二叉搜索树 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考研复试或就业 &#x1f4ab;文章题目大多来自于 leetcode&#xff0c;当然也可能来自洛谷或其他刷题…

C++ DAY6 作业

1.用模板类写顺序表 #include <iostream>using namespace std;#define MAXSIZE 10 template <typename T> class Arr {T *data NULL;int len 0; public://构造函数Arr():data(new T){}Arr(T a,int len):data(new T(a)),len(len){}//析构函数~Arr(){delete data;}…

【elfboard linux开发板】4. 文件点灯与创建多进程

ps&#xff1a;提升效率的小tips&#xff1a; 灵活运用vim操作命令&#xff0c;gg快速跳转到文件开头&#xff0c;G跳转到结尾 多行操作 ctrl V shift i 插入修改内容 esc退出编辑 sudo vi /etc/vim/vimrc 在文件中添加如下内容省略重复工作&#xff1a; autocmd BufNewFile …

霹雳吧啦Wz《pytorch图像分类》-p3VGG网络

《pytorch图像分类》p3VGG网络详解及感受野的计算 一、零碎知识点1.nn.Sequential2.**kwargs 二、VGG网络模型详解1.感受野2.模型手算 三、代码1.module.py2.train.py3.predict.py 一、零碎知识点 论文连接&#xff1a;VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAG…

结算时间和可组合性助力Sui上DeFi蓬勃发展

结算时间是基于Sui交易处理模型的度量标准&#xff0c;确保DeFi用户几乎立即看到交易结果。可组合性则是深深融入Sui的编程环境&#xff0c;扩展了其对对象和智能合约的影响。Sui深度的可组合性赋予DeFi构建者引入创新产品的能力&#xff0c;使其在其他区块链上的DeFi应用中独树…

基于Java校园招待所管理系统

基于Java校园招待所管理系统 功能需求 1、客房管理&#xff1a;系统需要管理招待所的客房信息&#xff0c;包括房间类型、数量、价格、状态等&#xff0c;并能够实时更新客房状态。 2、客人管理&#xff1a;系统需要记录客人的基本信息&#xff0c;包括姓名、性别、年龄、联…

Crypto的简单应用-前后端加密传输

最近遇到一个数据脱敏处理的需求&#xff0c;想要用一种轻量级的技术实现&#xff0c;必须足够简单并且适用于所有场合如前后端加密传输、路由加密、数据脱敏等。抽时间研究了一下Crypto加密库的一些API&#xff0c;发现完全符合上述需求&#xff0c;扩展也比较容易。 1、前端加…

[C#]使用onnxruntime部署Detic检测2万1千种类别的物体

【源码地址】 github地址&#xff1a;https://github.com/facebookresearch/Detic/tree/main 【算法介绍】 Detic论文&#xff1a;https://arxiv.org/abs/2201.02605v3 项目源码&#xff1a;https://github.com/facebookresearch/Detic 在Detic论文中&#xff0c;Detic提到…

2023.12.27 关于 Redis 数据类型 List 常用命令

目录 List 类型基本概念 List 类型特点 List 操作命令 LPUSH LPUSHX RPUSH RPUSHX LRANGE LPOP RPOP LINDEX LINSERT LREM LTRIM LSET 阻塞版本的命令 阻塞版本 和 非阻塞版本的区别 BLPOP & BRPOP List 类型基本概念 Redis 中的列表&#xff08;list&am…

定时器PWM控制RGB彩灯案例

1.脉冲宽度调制PWM PWM&#xff08;Pulse Width Modulation&#xff09;简称脉宽调制&#xff0c;是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术&#xff0c;广泛应用在测量、通信、工控等方面。   PWM的一个优点是从处理器到​​ ​被控系统​​​信号…

x-cmd pkg | bit - 实验性的现代化 git CLI

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 bit&#xff0c;由 Chris Walz 于 2020 年使用 Go 语言开发&#xff0c;提供直观的命令行补全提示和建立在 git 命令之上的封装命令&#xff0c;旨在建立完全兼容 git 命令的现代化 CLI。 首次用户 使用 x bit 即可自…

flutter获取本地图片高度、宽度

/*获取本地图片宽度* */getLocalImageWidth(String path){int width;Completer<int> completer new Completer<int>();Image image Image.file(File.fromUri(Uri.parse(path)));// 预先获取图片信息image.image.resolve(new ImageConfiguration()).addListener(n…

test ui-03-cypress 入门介绍

cypress 是什么&#xff1f; 简而言之&#xff0c;Cypress 是一款专为现代Web构建的下一代前端测试工具。我们解决了开发人员和质量保证工程师在测试现代应用程序时面临的关键问题。 我们使以下操作成为可能&#xff1a; 设置测试编写测试运行测试调试测试 Cypress经常与Se…

使用宝塔在Linux面板搭建网站,并实现公网远程访问

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板&#xff0c;它支持Linux/Windows系统&#xff0c;我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)处理任务队列中的任务

一、处理任务队列中的任务 &#xff08;1&#xff09;EventLoop启动 EventLoop初始化和启动 // 启动反应堆模型 int eventLoopRun(struct EventLoop* evLoop) {assert(evLoop ! NULL);// 取出事件分发和检测模型struct Dispatcher* dispatcher evLoop->dispatcher;// 比较…

2024阿里云Alibaba Cloud Linux 3镜像版本大全说明

Alibaba Cloud Linux阿里云打造的Linux服务器操作系统发行版&#xff0c;Alibaba Cloud Linux完全兼容完全兼容CentOS/RHEL生态和操作方式&#xff0c;目前已经推出Alibaba Cloud Linux 3&#xff0c;阿里云百科aliyunbaike.com分享Alibaba Cloud Linux 3版本特性说明&#xff…

面试算法83:没有重复元素集合的全排列

题目 给定一个没有重复数字的集合&#xff0c;请找出它的所有全排列。例如&#xff0c;集合[1&#xff0c;2&#xff0c;3]有6个全排列&#xff0c;分别是[1&#xff0c;2&#xff0c;3]、[1&#xff0c;3&#xff0c;2]、[2&#xff0c;1&#xff0c;3]、[2&#xff0c;3&…