昇腾ACL应用开发之硬件编解码dvpp

news2024/9/28 0:35:29

1.前言

        在我们进行实际的应用开发时,都会随着对一款产品或者AI芯片的了解加深,大家都会想到有什么可以加速预处理啊或者后处理的手段?常见的不同厂家对于应用开发的时候,都会提供一个硬件解码和硬件编码的能力,这也是抛弃了传统的opencv或者pl等在cpu上话费多的时间进行视频解码和编码,而对于昇腾产品,310一系列产品来说,他也会有自己的数据媒体处理单元,如下图所示:参考学习链接:

昇腾社区-官网丨昇腾万里 让智能无所不及

        

硬件产品结构示意图,内置的有dvpp模块用于数据预处理,AI core用于矩阵、向量等计算;不会占用cpu的资源,刚了解昇腾框架的伙伴可能会用下面的开发顺序进行编写代码:

(1)首先输入视频源的选择:rtsp流、视频、图片等

(2)直接使用opencv的api进行读取,也就是解码,其实opencv读取视频还是蛮快的,读取rtsp确实有一些慢,而且还占用cpu的资源,

(3)使用opencv解码出来之后的图片是,bgr,uint8,NHWC格式的图片,对于不同的模型输入,需要进行转换为模型需要的输入,比如resize缩放图片指定大小,数据格式转换从uint8 到float32 16\以及通道的变换,这一步也是大家的预处理。

(4)送入模型进行推理,大家可以做int8量化之类的操作

(5)模型后处理,对输出的数据进行筛选,获取最终的目标。

(6)opencv直接显示或者数据编码使用ffmpeg或者其他工具进行推流

以下是使用ACL我在整个端到端应用开发时总结的比较优选方案:

(1)使用dvpp进行rtsp和视频的解码,dvpp解码之后的数据为yuv420sp,是在device中的数据,无需内存拷贝,这个过程是将h264/h265的码流解码为yuv的数据,这一过程会在npu硬件执行,但是底层的实现是先通过ffmpeg进行解封装,再进行dvpp解码,内部实现了多线程:参考样例如下:

cplusplus/level2_simple_inference/2_object_detection/YOLOV3_coco_detection_video_DVPP_with_AIPP/src/sample_process.cpp · Ascend/samples - Gitee.com

g_cap_ = new AclLiteVideoProc(g_streamName_);stream是视频路径或者rtsp
ImageData testPic;
AclLiteError ret = g_cap_->Read(testPic);

将解码数据传送到testpic结构体中:

这个ImageDATA 结构体如下:

struct ImageData {
    acldvppPixelFormat format;
    uint32_t width = 0;
    uint32_t height = 0;
    uint32_t alignWidth = 0;
    uint32_t alignHeight = 0;
    uint32_t size = 0;
    std::shared_ptr<uint8_t> data = nullptr;
};

(2)解码之后通过VPC进行图像缩放,由于dvpp解码之后的数据为YUV格式,所以模型转换的时候需要配合aipp,将模型的输入改为yuv输入与模型对齐。

        ImageData resizedImage;
        ret = g_dvpp_.Resize(resizedImage, testPic, g_modelInputWidth, g_modelInputHeight);

(3)将数据直接存入模型中进行推理:

(4)模型的后处理,怎么和原图进行画框,可以将原始的yuv图片转换为opencv的图片进行画框,或者使用frretype直接在yuv上进行画框,参考案例如下:

方法一:将device的原图拷贝到cpu测转换为cv::mat类型进行画框:

        ImageData yuvImage;
        ret = CopyImageToLocal(yuvImage, testPic, g_runMode_);
        if (ret == ACLLITE_ERROR) {
            ACLLITE_LOG_ERROR("Copy image to host failed");
            return ACLLITE_ERROR;
        }
        cv::Mat yuvimg(yuvImage.height * 3 / 2, yuvImage.width, CV_8UC1, yuvImage.data.get());
        cv::Mat origImage;
        cv::cvtColor(yuvimg, origImage, CV_YUV2BGR_NV12);

方法二;直接在yuv上进行绘制目标框图:参考案例如下:

samples: CANN Samples - Gitee.com

(5)将画框后的数据硬件编码为h264文件用于ffmpeg进行推流,编码代码流程参考案例:

samples: CANN Samples - Gitee.com

由于ACL仅支持编码yuv的图片到h264/265所以建议大家可以使用第二种方法进行编码,不需要再次使用ffmpeg进行软件编码,大大可以节约时间。

整个流程可以在原来的软件编码情况下快1.5倍左右。关于ffmpeg推流可以加我学习群或者网上找一些简单的源码推流工具,如果大家有兴趣可以加入a群:855986726

下一章我们继续讲解如何进行多模型串联推理,

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

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

相关文章

【C++干货基地】揭秘C++11常用特性:内联函数 | 范围for | auto自动识别 | nullptr指针空值

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

基于springboot实现校园爱心捐赠互助管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校园爱心捐赠互助管理系统演示 摘要 随着互联网及电子商务平台的飞速发展&#xff0c;利用在线平台实现的二手商品交易以及在线捐赠已经非常普遍&#xff0c;很多高校目前还存在贫困生需要通过爱心人士的捐助来完成学业&#xff0c;同时很多高校的大学生也希…

【C++】STL学习之旅——初识STL,认识string类

string类 1 STL 简介2 STL怎么学习3 STL缺陷4 string4.1 初识 string4.2 初步使用构造函数成员函数 5 小试牛刀Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 1 STL 简介 …

PyCharm如何添加python库

1.使用pip命令在国内源下载需要的库 下面使用清华源&#xff0c;在cmd中输入如下命令就可以了 pip install i https://pypi.tuna.tsinghua.edu.cn/simple 包名版本号2.如果出现报错信息&#xff0c;Cannot unpack file…这种情况&#xff0c;比如下面这种 ERROR: Cannot unpa…

考研复试指南

1. 记住&#xff0c;复试的本质不是考试&#xff0c;而是一场自我展示。 考研复试并非简单的知识考察&#xff0c;更是一场展示自我能力和潜力的机会。除了学科知识&#xff0c;考官更关注你的综合素质、学术兴趣和未来发展规划。因此&#xff0c;要保持自信&#xff0c;用更全…

前端canvas项目实战——简历制作网站(五):右侧属性栏(字体、字号、行间距)

目录 前言一、效果展示二、实现步骤1. 优化代码&#xff0c;提取常量2. 实现3个编辑模块3. 实现updateFontProperty方法4. 一个常见的用法&#xff1a;仅更新当前选中文字的样式 三、Show u the code后记 前言 上一篇博文中&#xff0c;我们扩充了线条对象&#xff08;fabric.…

带你快速初步了解Python字典

1.字典 定义多个数据一般使用列表&#xff0c;但是列表也存在一定的缺陷 若列表中有多个元素&#xff0c;想访问其中某个元素&#xff0c;比较不方便 定义字典的语法&#xff1a;{key1:value1, key2:value2, key3:value3......} 字典和列表习惯的使用场景&#xff1a; &qu…

(3)(3.1) FlightDeck FrSky发射器应用程序

文章目录 前言 1 概述 2 Turnkey Packages 3 参数说明 前言 ​Craft and Theory 的 FlightDeck 可让你轻松查看飞行模式、高度、速度、姿态和关键系统警报&#xff0c;包括故障保护和电池错误&#xff0c;如电池不平衡警告和发射机低电量警报。 1 概述 Craft and Theory 的…

Jmeter 安装

JMeter是Java的框架&#xff0c;因此在安装Jmeter前需要先安装JDK&#xff0c;此处安装以Windows版为例 1. 安装jdk&#xff1a;Java Downloads | Oracle 安装完成后设置环境变量 将环境变量JAVA_HOME设置为 C:\Program Files\Java\jdk1.7.0_25 在系统变量Path中添加 C:\Pro…

【NR 定位】3GPP NR Positioning 5G定位标准解读(一)

目录 前言 1. 3GPP规划下的5G技术演进 2. 5G NR定位技术的发展 2.1 Rel-16首次对基于5G的定位技术进行标准化 2.2 Rel-17进一步提升5G定位技术的性能 3. Rel-18 关于5G定位技术的新方向、新进展 3.1 Sidelink高精度定位功能 3.2 针对上述不同用例&#xff0c;3GPP考虑按…

JAVAEE初阶 JVM(二)

垃圾回收和双亲委派模型 1.双亲委派模型2.垃圾回收机制(1) 识别垃圾1.引用计数2.可达性分析 (2) 销毁垃圾1.标记清除2.复制算法3.标记整理 3.分代回收 1.双亲委派模型 描述了如何查找.class文件的策略. 同时JVM中有专门进行类加载的操作,有一个模块,叫做类加载器. 上述就是为了…

安装Realtek Audio Driver失败[Error Code:-0001]

安装Realtek Audio Driver失败[Error Code&#xff1a;-0001] 首先来看一下我们遇到的问题GPT4的推荐解决方法&#xff08;流水账&#xff09;笔者自己真实有效的解决办法 首先来看一下我们遇到的问题 描述&#xff1a;在笔记本更新完电脑之后&#xff0c;没有自带声音驱动。然…

实例:NX二次开发收集关于Open C的计时信息

目录 一、概述 二、实现的功能 三、代码实现以及详细解析 一、概述 在NX二次开发过程中&#xff0c;我们为了效率经常会进行Open C的计时统计&#xff0c;这个实例可用于收集关于Open C的计时信息程序&#xff0c;并且在计时测试中很有用。该实例通过UF_begin_timer启动一个…

Pyglet图形界面版2048游戏——详尽实现教程(上)

目录 Pyglet图形界面版2048游戏 一、色块展示 二、绘制标题 三、方阵色块 四、界面布局 五、键鼠操作 Pyglet图形界面版2048游戏 一、色块展示 准备好游戏数字的背景颜色&#xff0c;如以下12种&#xff1a; COLOR ((206, 194, 180, 255), (237, 229, 218, 255), (23…

首例以“冠状病毒”为主题的勒索病毒,篡改系统MBR

前言概述 2020年勒索病毒攻击仍然是网络安全的最大威胁&#xff0c;在短短三个月的时间里&#xff0c;已经出现了多款新型的勒索病毒&#xff0c;关于2020年勒索病毒攻击新趋势&#xff0c;可以阅读笔者写的上一篇文章&#xff0c;里面有详细的分析&#xff0c;从目前观察到的…

深入解剖指针(4)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 目录 回调函数 qsort使用举例 使用qsort函数排序整型数据 使用qsort排序结构数据 qsort函数的模拟实现 回调函数 回调函数就是一个通过函数指…

java-幂等性

幂等性 1.1幂等性定义&#xff1a; 在计算机领域中&#xff0c;幂等&#xff08;Idempotence&#xff09;是指任意一个操作的多次执行总是能获得相同的结果&#xff0c;不会对系统状态产生额外影响。在Java后端开发中&#xff0c;幂等性的实现通常通过确保方法或服务调用的结…

68-解构赋值,迭代器,生成器函数,Symbol

1.解构赋值(针对数组array&#xff0c;字符串String及对象object以) 结构赋值是一种特殊的语法&#xff0c;通过将各种结构中的元素复制到变量中达到"解构"的目的&#xff0c;但是数组本身没有改变 1.1解构单层数组 <script>let arr [1,2,3,4,5];//获取数组…

C++之queue和deque

1、queue queue&#xff08;队列&#xff09;&#xff0c;一种数据结构&#xff0c;可以让某些数据结构的操作变得简单。队列&#xff08;queue&#xff09;最大的特点就是先进先出。就是说先放入queue容器的元素一定是要先出队列之后&#xff0c;比它后进入队列的元素才能够出…

【python】遵守 robots.txt 规则的数据爬虫程序

程序1 编写一个遵守 robots.txt 规则的数据爬虫程序涉及到多个步骤&#xff0c;包括请求网页、解析 robots.txt 文件、扫描网页内容、存储数据以及处理异常。由于编程语言众多&#xff0c;且每种语言编写爬虫程序的方式可能有所不同&#xff0c;以下将使用 Python 语言举例&am…