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

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.mzph.cn/news/717012.shtml

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

相关文章

Docker 命令详解:容器、镜像、网络和数据卷管理

文章目录 1. docker run2. docker pull3. docker images4. docker ps5. docker stop6. docker rm7. docker commit8. docker exec9. docker logs10. docker network11. docker volume12. docker save13. docker load14. docker tag15. docker search16. docker diff17. docker …

sql注入之sqli-labs/less-3 单引号加括号闭合

输入单引号试探&#xff1a; id1 报错信息里面出现 ) 说明闭合符合里面还有个 ) 再次试探&#xff1a;id1 ) order by 3 -- 查看回显位置&#xff1a; id-1%20%27)%20union%20select%201,2,3%20-- 查看数据库&#xff1a; id-1%20%27)%20union%20select%201,2,database()%2…

Kerberos协议攻防之黄金票据控制整个公司电脑

&#x1f449;重点内容&#xff1a; 1、网络认证、本地认证、域认证的优略势 2、域认证之Kerberos协议的认证流程详解 3、TGT、Krbtgt、KDC、TGS搞懂这些绕口的概念 4、深入理解黄金票据攻击Golden Ticket Attack 5、实战&#xff01;通过黄金票据控制内网中所有的电脑

DC-2靶机详解

写写自己打DC-2的过程 使用工具 kali DC-2的靶机下载地址为&#xff1a;https://www.vulnhub.com/entry/dc-2,311/ 环境配置。 Kali和DC-2都设置为NAT模式&#xff0c;都为仅主机模式也可以。 信息收集 arp-scan -l nmap -sn 192.168.236.0/24 获取靶机ip&#xff1a;192.16…

基于springboot+vue的工厂车间管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

【Linux】输入系统应用

# 前置知识 (1)输入子系统分为三层&#xff0c;分别是事件处理层、核心层、设备驱动层&#xff1b; (2)鼠标移动、键盘按键按下等输入事件都需要通过设备驱动层→核心层→事件处理层→用户空间&#xff0c;层层上报&#xff0c;直到应用程序; 事件处理层 (1)事情处理层主要是负…

【八】【SQL】子查询和where

显示与SMITH同一部门的员工 mysql> select *from emp where enameSMITH; ----------------------------------------------------------------------- | empno | ename | job | mgr | hiredate | sal | comm | deptno | --------------------------------…

Python调用C,python call c,pybind11

文章目录 前言1.将pybind11 clone至当前项目下的extern目录下2.在CmakeLists.txt中将pybind11项目包含3.接口cpp文件格式4.编译5.导入Python使用6.性能比较pybind11项目地址 前言 通过https://github.com/pybind/pybind11项目实现Python调用C/C代码 实现步骤 1.将pybind11 cl…

腾讯云4核8G服务器申请费用多少?性能如何?支持几个人?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

大数据报告检测到风险等级太高是怎么回事呢?

随着金融风控越来越多元化&#xff0c;大数据作为新兴的技术被运用到贷前风控中去了&#xff0c;不少人也了解过自己的大数据&#xff0c;但是由于相关知识不足&#xff0c;看不懂报告&#xff0c;在常见的问题中&#xff0c;大数据检测到风险等级太高是怎么回事呢?小易大数据…

《javascript高级程序设计》学习笔记 | 21.2.错误处理

关注[前端小讴]&#xff0c;阅读更多原创技术文章 错误处理 相关代码 → try/catch 语句 ES3 新增了try/catch语句&#xff0c;基本语法与 Java 中的 try/catch 一样 try {// 可能出错的代码const a 3;a 4; } catch (error) {// 出错时执行的代码console.log("An er…

vsomeip源码剖析--00环境搭建

环境 Win11 WSL2 Ubuntu22.04安装依赖 sudo apt-get install cmake sudo apt-get install libboost-system1.71-dev libboost-thread1.71-dev libboost-log1.71-dev源码编译 获取源码 https://github.com/COVESA/vsomeip.git编译 cd vsomeip mkdir build cd build// 一般…

漫漫数学之旅035

文章目录 经典格言数学习题古今评注名人小传 - 黎勒•笛卡尔 经典格言 完美的数和完美的人是同样罕见的。——黎勒•笛卡尔&#xff08;Ren Descrates&#xff09; 完美的数和完美的人都是极为罕见的。这句话表达了一个哲学观点&#xff0c;即无论是在数学领域还是人类自身&am…

Spring框架相关问题

RabbitMQ相关问题 Spring框架相关问题 一、Spring容器中的Bean是线程安全的吗&#xff1f;二、如何保证Spring容器中的Bean是线程安全的呢&#xff1f;三、什么情况下会触发Spring事务回滚&#xff1f;四、如果事务方法抛出IOException&#xff0c;是否会触发Spring事务回滚&a…

Zookeeper学习2:原理、常用脚本、选举机制、监听器

文章目录 原理选举机制&#xff08;重点&#xff09;情况1&#xff1a;正常启动集群情况2&#xff1a;集群启动完&#xff0c;中途有机器挂了 监听器客户端向服务端写入数据客户端向服务端Leader节点写入客户端向服务端Follower节点写入 Paxos算法&#xff08;每个节点都可以提…

AMDGPU KFD Test 编译使用

ROCT-Thunk-Interface是一个用于在ROCm软件堆栈中提供设备无关性的层。它是ROCm的一部分,允许不同的硬件平台(如AMD GPU和Intel CPU)使用相同的API进行计算。 要安装ROCT-Thunk-Interface,首先需要创建一个新的目录,并进入该目录: mkdir rocm-build cd rocm-build然后,…

ng : 无法将ng项识别为 cmdlet、函数、脚本文件或可运行程序的名称

ng : 无法将“ng”项识别为 cmdlet、函数、脚本文件或可运行程序的名称”&#xff0c;出现这种错误&#xff0c;那说明你angular-cli没有下载所以环境变量里没有相应的东西 1、需要在cmd里输入npm install -g angular/cli 2、之后运行angular命令时还可能出现这种错误 “ng : …

ruoyi 图片等文件资源读取

老是忘&#xff0c;记录一下 ResourcesConfig 文件下 /** 本地文件上传路径 */ registry.addResourceHandler(Constants.RESOURCE_PREFIX "/**").addResourceLocations("file:" RuoYiConfig.getProfile() "/"); /*** 资源映射路径 前缀*/ …

kafka消费者重平衡是什么?怎么避免?

消费者重平衡是指主题下的分区怎么分配给消费者的过程。下面这个图可以看出该过程&#xff1a;原来有2个消费者&#xff0c;3个分区&#xff0c;其中一个消费者肯定就的处理2个分区了。那么当新加入消费者时&#xff0c;则每个消费者就只处理一个分区了。处理这个分区过程的叫协…

详解Nacos注册中心的使用

文章目录 1、安装2、服务注册2.1、引入依赖2.2、配置nacos地址2.3、重启 3、服务分级存储模型3.1、给user-service配置集群3.2、同集群优先的负载均衡 4、权重配置5、环境隔离5.1、创建namespace5.2、配置namespace 6、Nacos与Eureka的区别7、代码免费分享 ​&#x1f343;作者…