【2023 · CANN训练营第一季】进阶班 应用开发深入讲解→DVPP

news2024/11/24 13:07:37

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/552870.html

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

相关文章

pytest-编写插件

pytest 0 、文档1、钩子函数分类1.4 测试运行钩子 2、本地编写插件:conftest.py3、外部插件:setuptools4、实战 0 、文档 官方文档 中文文档 1、钩子函数分类 pytest中的钩子函数按功能一共分为6类:引导钩子,初始化钩子、用例收…

rtl仿真器-incisive安装和测试

需要的文件 安装文件 incisive : http://pan.baidu.com/s/1dFC9KZn 提取码 k3cb path: license: IScape: 安装的图形界面 IScape下载链接: https://pan.baidu.com/s/1FvpOto5fAIRjQARcbMbjZQ 密码: k1cb 目录结构 需要四个目录 安装目录:INCISIVE151 path 存放解密工具 l…

强化学习路线规划之深度强化学习

学到如今,我实在明白了一个至关重要的东西,那就是目标很重要,有了清晰的目标我们就知道该做什么,不至于迷茫,否则每天都在寻找道路。所以我一直在规划这样一条道路,让想学习的人可以抛下不知道该怎么做的顾…

在Notion AI 中轻松打造您的AI私人助理,提供卓越的工作体验(二)

大家好,我是瓜叔。 notion AI在工作和生活场景中的应用 我们先来看"总结"功能。 这边有一篇文章叫做学习编码的好处。导入到nation https://www.likecs.com/show-203992587.html 导入方法详见上一篇文章:在Notion AI 中轻松打造您的AI私人助理…

VMware快照:简化虚拟化环境管理与数据保护

引言: 在虚拟化环境中,数据保护和灵活性是至关重要的。VMware快照作为一项强大的功能,为虚拟机管理者提供了便利和安全性。本文将介绍VMware快照的使用,以及它为用户带来的几个关键优势。 VMware快照是一项重要的功能&#xff0c…

Threejs进阶之十五:在Thereejs 使用自定义shader

目录 最终效果什么是 ShaderShaderMaterial类常用属性uniforms属性vertexShader属性fragmentShader属性 代码实现新建ShaderView.vue文件并引入Threejs定义初始化函数创建initMesh函数实例化ShaderMaterial类实例化TextureLoader()定义uniforms 全局变量定义vertexShader顶点着…

ad18学习笔记二:绘图工具栏、活动栏

在画原理图库的时候会经常用到顶上的绘图工具栏(官方文档里叫做活动栏): 版本不同,上面的命令是不同的 ad如何自定义绘图工具栏? 网上介绍工具栏和设置的文章还挺多的,但是没有看到ad18是怎么增减绘图工具…

LeetCode高频算法刷题记录7

文章目录 1. 下一个排列【中等】1.1 题目描述1.2 解题思路1.3 代码实现 2. 两数相加【中等】2.1 题目描述2.2 解题思路2.3 代码实现 3. 括号生成【中等】3.1 题目描述3.2 解题思路3.3 代码实现 4. 滑动窗口最大值【困难】4.1 题目描述4.2 解题思路4.3 代码实现 5. 最小覆盖子串…

c++boost库学习-07-Message Queue

一、前言 boost中的消息队列(Message Queue)是进程间通信的一种机制,实际上是其内部也是采用共享内存的方式来达到进程间通信的目的。这也就意味这Message Queue有其局限性:只有处在同一台计算机中的不同进程才能使用消息队列进行…

在原有机械硬盘的基础上集装固态硬盘并装操作系统

1、加装固态硬盘 我的电脑出场自带的是机械硬盘(即右边那个白色长方形,上面有类似于锡纸一样的东西),左边的这个光滑的正方形里面是内存条,可以拆开这个光滑的盖进行安装,而我们的固态硬盘装在左下角这个长…

性能测试——性能统计工具

性能统计工具 一、io监控命令1、io监控命令iostat2、io指标监控命令df 二、cpu监控命令1、cpu指标监控命令uptime2、cpu指标监控命令 cat /proc/cpuinfo3、cpu 指标监控命令 mpstat4、cpu指标监控命令 sar 三、mem指标监控命令1、mem指标监控命令 cat /proc/meminfo2、mem指标监…

KVM虚拟化(二)

文章目录 4.7 kvm虚拟机克隆4.7.1 完整克隆4.7.2 链接克隆 4.8 kvm虚拟机的桥接网络4.8.1 创建桥接网卡4.8.2 新虚拟机使用桥接模式4.8.3 将已有虚拟机网络修改为桥接模式 4.9 热添加技术4.9.1 kvm热添加硬盘4.9.2 kvm虚拟机在线热添加网卡4.9.3 kvm虚拟机在线热添加内存4.9.4 …

自动化测试技术解析:Appium、Sikuli与MonkeyTalk

目录 前言: 一、Appium自动化测试框架 它的优点是: 二、Sikuli自动化测试工具 它的优点是: 三、MonkeyTalk自动化测试工具 它的优点是: 四、代码样例 总结: 前言: 随着移动应用的普及,…

手把手教你通过PaddleHub快速实现输入中/英文本生成图像(Stable Diffusion)

近来,基于Diffusion的文图生成模型比较火,用户输入一句话,模型就可以生成一副对应的图像,还是很有意思的。本文记录了通过PaddleHub快速实现上述任务的过程,以供参考。 1、安装PaddlePaddle PaddleHub底层依赖于百度…

ChatGPT工作提效之生成开发需求和报价单并转为Excel格式

ChatGPT工作提效之生成开发需求和报价单并转为Excel格式 一、提出需求如何撰写百度地图标注开发的需求文档 二、针对性地连续提问推荐下一下百度地图标注文档的详细需求列表如何撰写百度地图标注开发的技术规范如何确定百度地图标注开发后的部署计划... 三、生成报价单四、运营…

【2023 · CANN训练营第一季】进阶班 应用开发深入讲解→模型推理

1 模型离线推理 各步要解析如下: Host&Device内存管理与数据传输: Host&Device上的内存申请与释放,内存间的相互拷贝;模型加载:将离线的om文件加载到Device上;在样例的资源初始化模块中进行。模型输入输出准备∶根据禹线om的输入输出,在Device…

微信小程序富文本组件mp-html

功能介绍 支持在多个主流的小程序平台和 uni-app 中使用支持丰富的标签(包括 table、video、svg 等)支持丰富的事件效果(自动预览图片、链接处理等)支持设置占位图(加载中、出错时、预览时)支持锚点跳转、…

【Linux】在Linux操作系统下对于权限的理解

目录 ❤️前言 正文 Linux下的不同用户 Linux的权限管理 文件访问者的分类 文件类型和访问权限 文件访问权限的修改方法 默认权限 目录权限 粘滞位 🍀结语 ❤️前言 大家好!今天这篇文章主要是关于Linux操作系统下对于各种权限的理解问题&#…

AI人工智能预处理数据的方法和技术有哪些?

AI人工智能 预处理数据 在人工智能(Artificial Intelligence,简称AI)领域中,数据预处理是非常重要的一环。它是在将数据输入到模型之前对数据进行处理和清洗的过程。数据预处理可以提高模型的准确性、可靠性和可解释性。 本文将…

Springboot +spring security,基于多种方式配置登录用户:memory、jdbc、MyBatis

一.简介 前面章节所有的用户信息(用户名和密码)都是基于配置文件配置的,这篇文章学习基于多种方式配置登录用户,比如: memory(内存)jdbcMyBatis 二.创建项目 如何创建一个SpringSecurity项目,前面文章已…