【CANN训练营0基础赢满分秘籍】应用开发深入讲解→DVPP

news2025/1/11 2:15:35

1 数据预处理概述

1.1 典型使用场景

受网络结构和训练方式等因素的影响,绝大多数神经网络模型对输入数据都有格式上的限制。在计算视觉领域,这个限制大多体现在图像的尺寸、色域、归一化参数等。如果源图或视频的尺寸、格式等与网络模型的要求不—致时,我们需要将源图或视频处理成符合模型要求的图或视频。
image.png

1.2 多种处理方式

CANN提供了两套专门用于数据预处理的方式:AIPP和DVPP。AIPP、DVPP可以分开独立使用,也可以组合使用。组合使用场景下,一般先使用DVPP对图片/视频进行解码、抠图、缩放等基本处理,但由于DVPP硬件上的约束,DVPP处理后的图片格式、分辨率有可能不满足模型的要求,因此还需要再经过AIPP进一步做色域转换、抠图、填充等处理。

1.2.1 AIPP

AIPP (Artificial Intelligence Pre-Processing)人工智能预处理,在Al Core上完成数据预处理。主要功能包括改变图像尺寸(抠图、填充等)、色域转换(转换图像格式)﹒减均值/乘系数(改变图像像素等。
AIPP区分为静态AIPP和动态AIPP。您只能选择静态AIPP或动态AIPP方式来处理图片,不能同时配置静态AIPP和动态AIPP两种方式。

  • 静态AIPP:模型转换时设置AIPP模式为静态,同时设置AIPP参数,模型生成后,AIPP参数值被保存在线模型(*.om)中,每次模型推理过程采用固定的AIPP预处理参数(无法修改)。如果使用静态AIPP方式。多Batch情兄下共用同一份AIPP参数。
  • 动态AIPP:模型转换时仅设置AIPP模式为动态,每次模型推理前,根据需求,在执行模型前设置动态AIPP参数值,然后在模型执行时可使用不同的AIPP参数。如果使用动态AIPP方式,多Batch可使用不同的AIPP参数。

1.2.2 DVPP

DVPP(Digital Video Pre-Processing)是昇腾AI处理器内置的图像处理单元,通过AscendCL媒体数据处理接口提供强大的媒体处理硬加速能力,主要功能包括缩放、抠图、格式转换、图片编解码、视频编解码等。

1.3 在开发应用中的位置

示例场景说明:输入一张JPEG的图片文件(源图格式为YUV420),经过JPEGD+VPC后,输出一张YUV420SP格式的图片,再通过AIPP将图片格式转换为RGB,同时进行归一化配置,最后将图片送给模型进行推理。
image.png

2 DVPP接口概述

2.1 关键功能的性能规格

image.png

2.2 不同功能模块支持的格式转换

昇腾Al处理器内置图像处理单元DVPP (Digital Video Pre-Processor),提供强大的媒体处理硬加速能力。同时,异构计算架构CANN提供了使用图像处理硬件算力的入口:AscendCL接口,开发者可通过接口来进行图像处理,以便利用昇腾AI处理器的算力。
image.png

2.3 接口对齐

由于硬件对图片宽、高对齐的要求,DVPP数据预处理中存在宽stride和高stride两个概念,分别用于表示对齐后的宽、对齐后的高,DVPP中的不同功能,对不同格式的输入或输出图片的宽、高对齐要求也不同,在使用DVPP中的多个功能串接(例如JPEGD+vPC)时,需特别注意接口文档中的对齐说明。
image.png

2.4 AscendCL的同步VS异步

在AscendCL中当提及“同步&异步”的时候,都是站在调用者.执行者的角度来看的。

  • 同步:当前线程发起一个方法调用。然后阻塞在调用点等待被调用方法执行完毕返回,再继续向下走。
    image.png
  • 异步:调用者向执行者下发一个任务之后,不等待任务执行完,而是立即返回往下走,暂且不管这个任务是否执行完毕。
aclError aclrtSynchronizeStream(aclrtStream stream)

image.png

2.5 DVPP 接口

2.5.1 内存申请与释放

acldvppMalloc

  • 函数功能:
    该接口主要用于分配内存给Device侧媒体数据处理时使用,申请的大页内存满足数据处理的要求(例如,内存首地址128对齐),同步接口。
  • 约束说明:
  1. 频繁调用acldvppMalloc及acldvppFree接口操作内存,会损耗性能,建议用户提前做内存预先分配或二次管理,避免频繁申请/释放内存。〉
  2. 调用该接口申请内存会对输入的size向上对齐成32整数倍后再加32字节申请。如用户使用该接口申请大块内存并自行管理内存,需管理n张大小为len字节图片的内存,应按照n*(ALIGN_UP[len]+32字节)大小管理,每张图片的内存地址按(ALIGN_UP[len]+32字节)为单位偏移。
    ALIGN_UP表示向上按32字节对齐:((len-1)/32+1)*32。
  3. 调用该接口申请大页内存失败,仅表示系统内的大页内存不够;调用该接口申请内存后,必须使用acldvppFree接口释放内存。
  • 函数原型:

aclError acldvppMalloc(void **devPtr, size_t size)

acldvppFree

  • 函数原型

aclError acldvppFree (void *devPtr)

2.5.2 通道创建与释放

acldvppCreateChannelDes

  • 函数功能:

创建acldvppChannelDesc类型的数据,表示创建图片数据处理通道时的通道描述信息。同步接口。

  • 函数原型:

acldvppChannelDesc *acldvppCreateChannelDesc)

  • 返回值说明:

返回acldvppChannelDesc类型,表示成功。
返回null,表示失败。

acldvppDestroyChannelDesc

  • 函数功能:

销毁acldvppChannelDesc类型的数据,只能销毁通过acldvppCreateChannelDesc接口创建的acldvppChannelDesc类型。该接口为同步接口。
必须在调用acldvppDestroyChannel接口销毁channel通道之后再调用acldvppDestroyChannelDesc接口释放acld
数据,否则报错。

  • 函数原型:

aclError acldvppDestroyChannelDesc(acldvppChannelDesc*channelDesc)

acldvppCreateChannel

  • 函数功能:创建图片数据处理的通道,同一个通道可以重复使用,销毁后不再可用,同步接口。
  • 约束说明:

通道为非线程安全,即不同线程要求创建不同的通道;同一个通道不能同时在多个Stream中并发使用。

  • 函数原型:

aclError acldvppCreateChannel(acldvppChannelDesc *channelDesc)

acldvppDestroyChannel

·函数原型:

aclError acldvppDestroyChannel(acldvppChannelDesc *channelDesc)

  • 约束说明:

如果在调用该接口销毁通道前,已调用acldvppDestroyChannelDesc接口销毁了通道描述信息,那么在调用该接口销毁通道时会报错。

2.5.3 图片描述信息创建与销毁

acldvppCreatePicDesc

  • 函数功能:

创建图片描述信息。同步接口。

  • 函数原型:

acldvppPicDesc *acldvppCreatePicDesc)

  • 返回值说明:

返回acldvppPicDesc类型,表示成功。
返回null,表示失败。

acldvppDestroyPicDesc

  • 函数功能:

销毁图片描述信息,只能销毁通过acldvppCreatePicDesc接口创建的图片描述信息。

  • 函数原型:

aclError acldvppDestroyPicDesc(acldvppPicDesc*picDesc)
acldvppDestroyChannel

  • 函数原型:

aclError acldvppDestroyChannel(acldvppChannelDesc*channelDesc)

2.5.4 图片描述参数设置

acldvppSetPicDesc系列接口

  • 函数功能:设置图片描述参数,同步接口。
  • 函数原型:

aclError acldvppSetPicDescData(acldvppPicDesc *picDesc, void *dataDev);

aclError acldvppSetPicDescSize(acldvppPicDesc*picDesc, uint32_t size);

aclError acldvppSetPicDescFormat(acldvppPicDesc *picDesc, acldvppPixelFormat format);

aclError acldvppSetPicDescWidth(acldvppPicDesc *picDesc, uint32_t width);

aclError acldvppSetPicDescHeight(acldvppPicDesc *picDesc, uint32_t height);

aclError acldvppSetPicDescWidthStride(acldvppPicDesc *picDesc, uint32_t widthStride);

aclError acldvppSetPicDescHeightStride(acldvppPicDesc *picDesc, uint32_t heightStride);

aclError acldvppSetPicDescRetCode(acldvppPicDesc *picDesc,uint32_t retCode)

  • 返回值说明:

返回0表示成功,返回其它值表示失败。

3 JPEGD图片解码

3.1 功能

JPEGD (JPEG Decoder)实现jpg、 jpeg、.JPG、.JPEG图片文件的解码。针对不同的源图编码格式,解码后,输出如下格式的图片:

  • jpeg(YUV444SP) -> YUV444SP、YVU444 SP、YUV420SP NV12 、YUV420SP NV21。
  • jpeg(YUV422SP) -> YVU422SP 、 YUV422SP、 YUV420SP NV12、 YUV420SP NV21。
  • jpeg(YUV420SP)-> YUV420SP NV12、YUV420SP NV21。
  • jpeg(YUV400) -> YUV420SP,UV数据采用0 x 80填充。
  • jpeg(YUV440)-> YVU440SP.YUV440SP、 YUV420SP NV12、YUV420SP NV21。

3.2 约束

  • 关于输入图片的约束
    最大分辨率:81928192,最小分辨率:3232;只支持Huffman编码,码流的colorspace为YUV,码流的subsample为444/422/420/400;不支持算术编码;不支持渐进JPEC格式;不支持JPEG2000格式;
  • 关于输出图片的宽高对齐要求
    输出图片的widthStride (对齐后的宽度),对齐到128;输出图片的heightStride(对齐后的高度),对齐到16.
  • 关于输出内存大小
    输出内存大小与图片数据的格式相关,计算公式如下:
    YUV420SP: widthStrideheightStride3/2
    YUV422SP: widthStrideheightStride2YUV444SP: widthStrideheightStride3
  • 关于硬件约束
    最多支持4张Huffman表,其中包括2张DC(直流)表和2张AC(交流)表;最多支持3张量化表;只支持8bit采样精度;只支持对顺序式编码的图片进行解码;只支持基于DCT (Discrete Cosine Transform)变换的JPEC格式解码;
    只支持一个Sos (Start of Scan)标志的图片解码。
    -** 关于软件约束**
    支持3个sOS标志的图片解码;
    支持mcu (Minimum Coded Unit)数据不足的异常图片解码。

3.3 调用流程

image.png

3.4 接口

acldvppJpegDecodeAsync

  • 函数功能:

解码.jpg…jpeg…JPG、.JPEG图片,异步接口。

  • 函数原型:

aclError acldvppJpegDecodeAsync(acldvppChannelDesc *channelDesc, const void datauint32 t size, acldvppPicDescoutputDesc, aclrtStream stream)

acldvppJpegGetlmagelnfo

  • 函数功能

从Host上存放JPEG图片数据的内存中读取JPEG图片的宽、高。同步接口。

  • 函数原型

aclError acldvppJpegGetlmagelnfo(const void 'data,uint32 t size.uint32 t *width,uint32 t *height,int32 t *components)·参数说明:参数名

acldvppJpegPredictDecSize

  • 函数功能

根据Host上存放JPEG图片数据的内存计算出JPEG图片解码后所需的输出内存的大小。同步接口。

  • 函数原型

acError acldvpplpegPredictDecSize(const void data,uint32 t dataSize,acldvppPixelFormat outputPixelFormatuint32,tdecSize)

4 VPC视觉预处理

4.1 功能

  1. 抠图
    从输入图片中抠出需要用的图片区域。
  2. 缩放
    ◆针对不同分辨率的图像,当前支持8K及非8K缩放。
    ◆可分为单图裁剪缩放((支持非压缩格式)、一图多框裁剪缩放(支持非压缩格式)。
    ◆其它缩放方式,如:原图缩放、等比例缩放(缩放前后图片的宽高比例相同)。
  3. 叠加
  4. 从输入图片中抠出来的图,对抠出的图进行缩放后,放在用户输出图片的指定区域,输出图片可以是空白图片(由用户申请的空输出内存产生的),也可以是已有图片(由用户申请输出内存后将已有图片读入输出内存),只有当输出图片是已有图片时,才表示叠加.
  5. 拼接,从输入图片中抠多张图片,对抠出的图进行缩放后,放到输出图片的指定区域。
  6. 格式转换,支持RGB格式、YUV格式之间的格式转换。
  7. 图像灰度化,将彩色图像转化为灰度图像。需注意,输入为灰度图像、输出只能为灰度图像。

4.2 调用流程

image.png

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

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

相关文章

生命游戏的简单实现(c++代码)

今天上数模课,本来一如既往准备自习,但是,生命游戏——从前就在“人工智能”的书上看到过,今天一讲,发现如此简单。课上30min实现了一份简单的生命游戏代码/ 目录 前言 一、生命游戏 生命游戏的基本设置 生命游戏的规则…

WIN提权

win提权分为web和本地提权 web提权就是getshell后,权限是网站权限,要进行提权 本地提权是本地用户进行提权 本地用户的权限大于网站权限,所以本地提权成功概率比web提权概率大 因为我们做渗透测试,一般都是从网站入侵。所以大…

提高电商团队效率:必备的协作工具盘点

随着电商行业的快速发展,电商团队的规模和任务不断增加。然而,文件管理和文件协作方面的问题也随之出现。 电商行业可能存在的问题: 文件传输效率低下:电商团队需要频繁地共享和传输大量的文件,这会导致文件传输效率低…

快速上手,使用关键字驱动测试框架作为Web应用程序的自动化测试武器

目录 前言: 一、预备知识 二、关键字驱动测试框架 三、关键字驱动测试脚本 四、总结 前言: 自动化测试是软件测试中的重要环节之一,它可以帮助开发人员提高测试效率,节省时间和人力成本。随着互联网的发展,Web应…

互联网医院牌照申请|互联网医院申请流程

互联网医院牌照申请需要哪些资料和条件 随着互联网医疗的发展,越来越多的医疗机构开始申请互联网医院牌照。那么,互联网医院牌照的申请需要哪些资料和条件呢?以下是相关介绍。 申请资料 一、法定代表人身份证、执业医师资格证明 二、机构…

分布式事务解决方案Stata 整合 Spring Cloud + Nacos

1. 简介 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 2. Docker 安装 Seata 2.1 下载镜像 docker pull seataio/se…

js 如何定义类和引用

前言 JS是弱定义语言,最适合用于前端的数据处理。因为前端是数据的终点,用完就抛弃,所以前端一般都只是处理简单的业务逻辑。 但是有时候我们希望前端能进行一些复杂的处理,比如SqlLite本地缓存数据库,或者前端处理一…

低代码开发平台:打破IT与业务壁垒,实现高效协作

我们生活在一个离不开应用程序的世界:无论是个人消费者,还是企业运营,应用程序往往是最终的解决方案,它们可以是模块化的,也可以是一个整体,将数据、信息都链接起来,以提高生产生活的效率。 从企…

Fiora二次元Web在线聊天室源码搭建教程|详细

安卓客户端体验:fiora点击下载 网页版体验:fiora网页版 使用的系统是Linux Centos7.6 注意: 512M内存vps可能还需要先加一点虚拟内存,不然构建过程会失败。 开始安装 命令行安装方法 一、安装Nodejs curl -sL https://rpm.nodesource.com/…

chatgpt赋能Python-python_land

Python Land: 探索Python世界的终极指南 Python是一种具有广泛用途的高级编程语言,具有简单易学的特点,因此而备受青睐。Python Land是一个编程社区,该社区专注于提供Python编程有关的资源,以帮助有兴趣的人通过学习Python语言提…

HTTP中 Connection: keep-Alive与TCP中中keepalive有什么区别?

有小伙伴不明白keep-Alive和keepalive有什么区别?今天写这篇文章详细讲清楚! HTTP是请求响应模型也就是客户端发起了请求,服务端才会返回响应,一来一回。 由于 HTTP 是基于 TCP 传输协议实现的,客户端与服务端要进行 H…

【中阳期货】国际期货与股票的区别

摘要:“股票之后就是期货”这句话生动地揭示了股票交易与期货交易的内在联系。期货交易的重要功能首先是有利于增强商品价格的预期性,为商业活动的顺利进行创造良好的条件。期货借助市场功能可以找到商品真正的市场价格,有利于制造厂商和生产者确定产品成本产品生产费用,以便顺…

ubuntu下使用python进行简单的UDP通信

目录 一、参考链接二、主要工作1.查看本机ip2.下载Ubuntu下网络调试助手 NetAssist3.编写一个python脚本测试UDP通信4.测试简单的UDP通信 一、参考链接 Ubuntu下网络调试助手 NetAssist 使用python实现UDP通信 python代码实现简单的udp通信 二、主要工作 1.查看本机ip #下载…

如何压缩过大的H2数据库文件

平台自带的H2数据库在使用过程中会随着数据量的增加而增长,但是并不会在删除数据后自动缩小。所以O2OA提供了数据库压缩命令用于缩小数据库占用的空间。 一、先决条件 1、O2Server服务器正常运行,系统安装部署请参考文档《如何在服务器上安装部署O2OA》…

微软收购暴雪战未结束;迪士尼流失 4 百万用户;苹果 iPhone 销量增长;国际旅行回暖机票订单火爆;美国年通胀率再次下降 | 经济学人第 20 周

文章目录 苹果 iPhone 销量增长,但总体收入下降微软收购暴雪战未结束迪士尼流失 4 百万用户美国年通胀率再次下降国际旅行回暖,机票订单火爆瑞银认命首席执行官,完成对瑞士信贷的最终收购最后 苹果 iPhone 销量增长,但总体收入下降…

【Linux环境基础开发工具】编辑器-vim

写在前面 vim是一个编辑器,是在Linux下编程的常用工具,如果要学习在Linux下的编程, 那学会使用vim是一个必修课,今天我就来讲解如何使用vim编辑器。 目录 写在前面 什么是vim vim的常用命令 (1)gg&a…

C++之堆排

堆排的原理和结构: 堆排序是一种常见的排序算法,基于堆这种数据结构实现。堆是一种特殊的树形数据结构,它满足以下两个条件: 堆是一棵完全二叉树。 堆的任意节点的值,都必须大于等于(或小于等于&#xff0…

平板第三方电容笔怎么样?apple pencil一代平替笔推荐

我是一位数码产品的爱好者,所以我对电容笔也有一定的了解。我认为,苹果的原装电容笔和一般的电容笔的区别,在于它们所能产生的压感效果不同。由于苹果的电容笔具有独特的“重力压感”,因此,这款画笔能让我们快速地在画…

搜索二维矩阵 II——力扣240

文章目录 题目描述法一)二分查找法二)抽象二叉搜索树BST法三)直接查找 题目描述 法一)二分查找 与搜索二维矩阵——力扣74不同,本题没有保证「每行的第一个整数大于前一行的最后一个整数」,因此无法采取「两…

CentOS安装过程笔记

以前弄过一个ls的版本是直接虚拟机带起的。是系统都是别人给设置好调好的win系统的。后来发现问题,自己也不会搞,所以那个平台就一直扔在那里也没用过。 这次自己搞就想从0试一下吧。一直以为服务器必须Linux才行,所以就想安个CentOS&#x…