模型推理后处理C++代码优化案例

news2024/11/27 11:49:49

文章目录

  • 项目场景:
  • 问题描述
  • 原因分析:
  • 解决方案:
  • 小结

项目场景:

经过推理的后处理运行时间的优化。

先来看下优化前后的时间对比:
优化前:
在这里插入图片描述
优化后:

提升还是很大的。


问题描述

模型推理后得到的数据后处理操作之前时间开销很大。

auto outputsf = pRealEngine->sampleProcess->outData;
    //postprogress

std::vector<float> outputvtemp; 
std::vector<std::vector<BoundingBox>> preds(pRealEngine->num_class); //class-bboxes
BoundingBox temp;
auto n = pRealEngine->modelout_len*pRealEngine->nc;
// int c=0;
for(auto i=0;i<n;i++){
    outputvtemp.push_back(outputsf[i]);
    if((i+1)%pRealEngine->nc==0) {
        if(outputvtemp[4]>pRealEngine->confidence_threshold){
            auto cx = outputvtemp[0];
            auto cy = outputvtemp[1];
            auto w = outputvtemp[2];
            auto h = outputvtemp[3];
            temp.x = std::max(int((cx-w/2)),0);
            temp.y = std::max(int((cy-h/2)),0);
            temp.w = std::min(int(w),int(pImgInfo->i32Width-temp.x));
            temp.h = std::min(int(h),int(pImgInfo->i32Height-temp.y));
            temp.cx = int((cx-w/2));
            temp.cy = int((cx-w/2));
            temp.confidence =  outputvtemp[4];
            temp.classid = getfclassid(outputvtemp);

            preds[temp.classid].push_back(temp);
        }
        outputvtemp.clear();
    } 
}	

原因分析:

不必要的数据复制:原始代码中使用 outputvtemp.push_back(outputsf[i])outputsf[i] 添加到 outputvtemp 向量中。这将涉及内存的重新分配和数据复制。为了避免这种开销,可以直接在循环中访问 outputsf 数组,而无需使用额外的向量。

重复计算:循环中计算的值 cx - w/2cy - h/2 在多个地方重复使用。可以将这些计算移动到条件判断的外部,以避免重复计算。

复杂的条件判断: 在循环中有一些条件判断,例如if (outputvtemp[4] > pRealEngine->confidence_threshold),这些条件判断可能会增加运行时间。确保这些条件判断是必要的,如果可能的话,尽量减少不必要的条件判断。


解决方案:

auto outputsf = pRealEngine->sampleProcess->outData;
std::vector<std::vector<BoundingBox>> preds(pRealEngine->num_class); //class-bboxes
BoundingBox temp;
auto n = pRealEngine->modelout_len * pRealEngine->nc;
// int elements_per_output = 5; // 每个输出元素包含 5 个值

for (auto i = 0; i < n; i +=pRealEngine->nc)// elements_per_output) 
{
    float confidence = outputsf[i + 4];

    if (confidence > pRealEngine->confidence_threshold) 
    {
        auto cx = outputsf[i];
        auto cy = outputsf[i + 1];
        auto w = outputsf[i + 2];
        auto h = outputsf[i + 3];
        temp.x = std::max(int((cx - w / 2)), 0);
        temp.y = std::max(int((cy - h / 2)), 0);
        temp.w = std::min(int(w), int(pImgInfo->i32Width - temp.x));
        temp.h = std::min(int(h), int(pImgInfo->i32Height - temp.y));
        temp.cx = int((cx - w / 2));
        temp.cy = int((cy - h / 2));
        temp.confidence = confidence;
        // 将数组转换为 std::vector<float>
        std::vector<float> outputvtemp(outputsf + i, outputsf + i + pRealEngine->nc);
        
        // 调用 getfclassid 函数,并传递起始和结束索引
         temp.classid = getfclassid(outputvtemp); // 传递起始和结束索引

        preds[temp.classid].push_back(temp);
    }
}

小结

本文是自己项目中遇到的实际问题,由于刚刚上手C++相关的项目,特此记录!!!
C++任重而道远呀,加油呀!!!
2023年9月9日15:33:36

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

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

相关文章

mybatis-plus 数据字段进行加解密入库,且加密字段支持模糊搜索

mybatis-plus 数据进行字段加解密入库&#xff0c;加密字段支持模糊搜索 前提介绍 &#xff08;开发环境需求&#xff09; 1. 开发框架、环境 springbootmybatis-plusmysql5.7&#xff08;oracle应该也是可以的&#xff0c;没有测试&#xff0c;但实现思路是都可以满足&…

CSP 202206-1 归一化处理

答题 #include<iostream> #include<cmath> using namespace std;int main() {int n;double variance0,average0;cin>>n;double a[n];for(int i0;i<n;i){cin>>a[i];averagea[i];}averageaverage/n;for(int i0;i<n;i){variance(a[i]-average)*(a[…

Redis事务的理解

介绍 Redis通过MULTI、EXEC、WATCH等命令来实现事务功能。 事务提供了一种将多个命令请求打包&#xff0c;然后一次性、按照顺序地执行多个命令的机制&#xff0c;并且在事务执行期间&#xff0c;服务器不会因为其他客户端请求而中断事务的执行功能&#xff0c;他会将事务中的…

nvidia-smi 命令详解

nvidia-smi 命令详解 1. nvidia-smi 面板解析2. 显存与GPU的区别 Reference: nvidia-smi命令详解 相关文章&#xff1a; nvidia-smi nvcc -V 及 CUDA、cuDNN 安装 nvidia-smi(NVIDIA System Management Interface) 是一种命令行实用程序&#xff0c;用于监控和管理 NVIDIA G…

Jetsonnano B01 笔记3:GPIO上拉下拉-输入输出读取

今日继续我的jetsonnano学习之路&#xff0c;今日学习的是GPIO的上拉下拉&#xff0c;输入输出的读取&#xff0c;文章贴出完整操作步骤过程&#xff0c;贴出源码。 目录 Linux常用文件命令&#xff1a; ls&#xff08;list&#xff09;列表&#xff1a; man&#xff1a; …

系统报错“由于找不到msvcp140.dll无法继续执行代码”的处理方法

我在使用电脑时&#xff0c;突然发现了一个错误提示&#xff1a;“无法启动程序&#xff0c;因为找不到msvcp140.dll文件”。这让我非常困惑&#xff0c;因为我确定这个文件应该存在于我的电脑上。但是电脑依然报错“由于找不到msvcp140.dll无法继续执行代码”&#xff0c;这个…

apache-activemq-5.17.1一键安装安装

下载 安装 双击InstallService.bat脚本 查看是否安装完成

C# Solidworks二次开发:创建草图文本和创建草图中心线API详解

今天要介绍的是关于如何创建草图文本的API以及创建草图中心线的API&#xff0c;同时把一些连带的API也会和大家介绍一下&#xff0c;依然是满满的干货。 &#xff08;1&#xff09;创建草图文本API&#xff0c;InsertSketchText() 这个API的输入参数如下图所示&#xff1a; 一…

SD、SDIO和MMC接口基础和规范介绍

在MMC规范发展的过程中出现了很多的名词&#xff0c;如SDHC、SDIO、SDXC等&#xff0c;每次看到这些不同的规范都有点懵&#xff0c;也很容易搞混&#xff0c;所以本篇文章就来介绍一下MMC规范发展过程中出现的一些新的规范&#xff0c;并详细地理解一下SD和SDIO。 文章目录 1 …

Postman接口测试流程

一、工具安装 ● 安装Postman有中文版和英文版&#xff0c;可以选择自己喜欢的版本即可。安装时重新选择一下安装路径&#xff08;也可以默认路径&#xff09;&#xff0c;一直下一步安装完成即可。&#xff08;本文档采用英文版本&#xff09;安装文件网盘路径链接&#xff1…

哈希的应用——布隆过滤器

文章目录 前言1. 布隆过滤器提出2. 布隆过滤器概念3. 布隆过滤器的插入多哈希函数映射减少冲突结构定义及set&#xff08;插入&#xff09;函数实现 4. 布隆过滤器的查找test&#xff08;查找&#xff09;函数实现布隆过滤器允许误判 5. 布隆过滤器的适用场景6. 如何选择布隆过…

AOI软件之 CAD图纸导入功能

在这里&#xff0c;我不过多的解释AOI&#xff0c;半导体检测行业内的小伙伴自然会懂&#xff1b;我也不会过多解释何为diemap或者wafer-layout。因为我们本文的核心场景仅仅是cad图纸的解析和基本绘图的二次开发。而且我们紧紧是面向行业内的场景需求来说明此功能。 无图我说…

强大的JTAG边界扫描(4):STM32边界扫描应用

文章目录 1. 获取芯片的BSDL文件2. 硬件连接3. 边界扫描测试4. 总结 试想这样一个场景&#xff0c;我们新设计了一款集成了很多芯片的板卡&#xff0c;包括BGA封装的微控制器&#xff0c;如FPGA/MCU&#xff0c;还有LED、按键、串口、传感器、ADC等基本外设。 我们需要测试一下…

时序分解 | MATLAB实现基于EWT经验小波变换的信号分解分量可视化

时序分解 | MATLAB实现基于EWT经验小波变换的信号分解分量可视化 目录 时序分解 | MATLAB实现基于EWT经验小波变换的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 EWT经验小波变换 包含频谱相关系数 可直接运行 Matlab代码 1.可自由设置分量个数&…

【uni-app】—2.必备软件安装

一、Node.js 安装流程 二、微信开发者工具 1.选择自己系统对应安装包下载 2. 安装 设置安装路径 三、HBuilderx 1. 根据系统下载安装包 2. 解压安装包&#xff08;自定义解压路径&#xff09; 3. 运行 四、安卓模拟器&#xff08;夜神&#xff09; 1. 下载安装包 2…

eclipse链接MySQL数据库

在MySQL官网下载驱动 MySQLhttps://www.mysql.com/cn/点击下载&#xff1a; 页面滚动到最下方选择社区版&#xff1a; 选择Java版本: 接下来&#xff0c;需要选择操作系统&#xff0c;我们选择平台独立&#xff1a; eclipse 接下来&#xff0c;我们打开eclipse&#xff0c;新建…

【C语言】异或(^)

一.简介 异或&#xff0c;英文为exclusive OR&#xff0c;缩写成xor 异或&#xff08;xor&#xff09;是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”&#xff0c;计算机符号为“xor”。其运算法则为&#xff1a; a⊕b (a ∧ b) ∨ (a ∧b) 如果a、b两个值不…

2023国赛 C题论文 蔬菜类商品自动定价与补货策略

因为一些不可抗力&#xff0c;下面仅展示小部分论文&#xff0c;其余看文末 一、问题重述 在生鲜超市管理领域&#xff0c;涉及一系列复杂问题&#xff0c;包括供应链管理、定价策略以及市场需求分析等方面。以蔬菜类商品为案例&#xff0c;这些商品在生鲜商超中具有较短的保…

升降压芯片

型号&#xff1a; SC8815 升降压电路基于SC8815实现的可调电源 2-36V连续可调&#xff0c;0.3-6A可调限流 原理图参考 可以观察到控制使用i2c就可以 使用参考链接 【小米120W协议转换器】私有协议转换器2.0_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1qu4y1y72F…

无人机通信协议MAVLink简介

Micro Air Vehicle Link(简称MAVLink)用于无人系统(例如,机器人、无人机、无人车、无人船和无人潜航器)。它定义了一组无人系统和地面站之间的消息交换规则。此协议广泛用于无人驾驶系统中,特别是ArduPilot和PX4无人驾驶系统,MAVLink协议提供了强大的功能,不仅用于监视…