如何基于香橙派AIpro对视频/图像数据进行预处理

背景介绍

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

昇腾AI硬件内置专门用于图像预处理的硬件单元,开发者通过其上层软件栈CANN能够更加便捷地发挥出硬件强大的媒体处理硬加速能力。香橙派AIpro开发板是香橙派联合昇腾打造的高性能AI开发板,开发者可以基于此,对不满足神经网络模型输入要求的数据进行预处理,从而更好地完成AI推理计算。

01 昇腾CANN数据预处理方式简介

昇腾CANN提供了两种专门用于数据预处理的方式:AIPP和DVPP。

  • AIPP(Artificial Intelligence Pre-Processing)在AI Core上完成数据预处理,主要功能包括改变图像尺寸(抠图、填充等)、色域转换(转换图像格式)、减均值/乘系数(改变图像像素)等。AIPP区分为静态AIPP和动态AIPP,您只能选择其中一种方式,不支持两种方式同时配置。
    • 静态AIPP:模型转换时设置AIPP模式为静态,同时设置AIPP参数,模型生成后,AIPP参数值被保存在离线模型(*.om)中,每次模型推理过程采用固定的AIPP预处理参数,无法修改。
    • 动态AIPP:模型转换时仅设置AIPP模式为动态,每次模型推理前,根据需求,在执行模型前设置动态AIPP参数值,然后在模型执行时可使用不同的AIPP参数。
  • DVPP(Digital Vision Pre-Processing)是昇腾AI处理器内置的图像处理单元,通过AscendCL媒体数据处理接口提供强大的媒体处理硬加速能力,主要功能包括缩放、抠图、色域转换、图片编解码、视频编解码等。

总结一下,虽然都是数据预处理,但AIPP与DVPP的功能范围不同(比如DVPP可以做图像编解码、视频编解码,AIPP可以做归一化配置),处理数据的计算单元也不同,AIPP用的AI Core计算加速单元,DVPP就是用的专门的图像处理单元。

AIPP、DVPP可以分开独立使用,也可以组合使用。组合使用场景下,一般先使用DVPP对图片/视频进行解码、抠图、缩放等基本处理,再使用AIPP进行色域转换、归一化等处理。

02 如何使用AIPP功能

下文以此为例:测试图片分辨率为250*250、图片格式为YUV420SP,模型对图片的要求为分辨率224*224、图片格式为RGB,因此需要通过AIPP实现抠图、图片格式转换2个功能。关于各种格式转换,其色域转换系数都有模板,可从ATC工具使用指南中获取,请参见“昇腾文档中心”。

1、静态AIPP

(1)构造AIPP配置文件*.cfg。

  • 抠图:有效数据区域从左上角(0, 0)像素开始,抠图宽*高为224*224。
  • 图片格式转换:输入图片格式为YUV420SP_U8,输出图片格式通过色域转换系数控制。

aipp_op {

       aipp_mode : static             # AIPP配置模式

       input_format : YUV420SP_U8  # 输入给AIPP的原始图片格式

       src_image_size_w : 250        # 输入给AIPP的原始图片宽高

       src_image_size_h : 250

       crop: true                    # 抠图开关,用于改变图片尺寸

       load_start_pos_h: 0            # 抠图起始位置水平、垂直方向坐标

       load_start_pos_w: 0

       crop_size_w: 224             # 抠宽、高

crop_size_h: 224

       csc_switch : true              # 色域转换开关

       matrix_r0c0 : 256             # 色域转换系数

       matrix_r0c1 : 0

       matrix_r0c2 : 359

       matrix_r1c0 : 256

       matrix_r1c1 : -88

       matrix_r1c2 : -183

       matrix_r2c0 : 256

       matrix_r2c1 : 454

       matrix_r2c2 : 0

       input_bias_0 : 0

       input_bias_1 : 128

       input_bias_2 : 128

}

(2)使能静态AIPP。 

使用ATC工具转换模型时,可将AIPP配置文件通过insert_op_conf参数传入,将其配置参数保存在模型文件中。

atc --framework=3 --soc_version=${soc_version}

--model= $HOME/module/resnet50_tensorflow.pb

--insert_op_conf=$HOME/module/insert_op.cfg

--output=$HOME/module/out/tf_resnet50

参数解释如下:

  • --framework:原始网络模型框架类型,3表示TensorFlow框架。
  • --soc_version:指定模型转换时昇腾AI处理器的版本,可执行npu-smi info命令进行查询,在查询到的“Name”前增加Ascend信息,例如“Name”对应取值为xxxyy。
  • --model:原始网络模型文件路径,含文件名。
  • --insert_op_conf:AIPP预处理配置文件路径,含文件名。
  • --output:转换后的*.om模型文件路径,含文件名,转换成功后,模型文件名自动以.om后缀结尾。

(3)调用AscendCL接口加载模型,执行推理,具体可参见如何基于香橙派AIpro开发AI推理应用。

2、动态AIPP

(1)构造AIPP配置文件*.cfg。

aipp_op

{

aipp_mode: dynamic

max_src_image_size: 752640  # 输入图像最大内存大小,需根据实际情况调整

}

(2)使能动态AIPP。

使用ATC工具转换模型时,可将AIPP配置文件通过insert_op_conf参数传入,将其配置参数保存在模型文件中。

atc --framework=3 --soc_version=${soc_version}

--model= $HOME/module/resnet50_tensorflow.pb

--insert_op_conf=$HOME/module/insert_op.cfg

--output=$HOME/module/out/tf_resnet50

参数解释如下:

  • --framework:原始网络模型框架类型,3表示TensorFlow框架。
  • --soc_version:指定模型转换时昇腾AI处理器的版本。
  • --model:原始网络模型文件路径,含文件名。
  • --insert_op_conf:AIPP预处理配置文件路径,含文件名。
  • --output:转换后的*.om模型文件路径,含文件名,转换成功后,模型文件名自动以.om后缀结尾。

(3)调用AscendCL接口加载模型,设置AIPP参数后,再执行推理,具体可参见如何基于香橙派AIpro开发AI推理应用。

调用AscendCL接口设置AIPP参数的代码示例如下:

aclmdlAIPP *aippDynamicSet = aclmdlCreateAIPP(batchNumber);

aclmdlSetAIPPSrcImageSize(aippDynamicSet, 250, 250);

aclmdlSetAIPPInputFormat(aippDynamicSet, ACL_YUV420SP_U8);

aclmdlSetAIPPCscParams(aippDynamicSet, 1, 256, 0, 359, 256, -88, -183, 256, 454, 0, 0, 0, 0, 0, 128, 128);

aclmdlSetAIPPCropParams(aippDynamicSet, 1, 2, 2, 224, 224, 0);

aclmdlSetInputAIPP(modelId, input, index, aippDynamicSet);    

aclmdlDestroyAIPP(aippDynamicSet);

03 如何使用DVPP功能

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

DVPP内的功能模块如下表所示。

功能模块

描述

VPC(Vision Preprocessing Core)

处理YUV、RGB等格式的图片,包括缩放、抠图、色域转换、直方图统计等。

JPEGD(JPEG Decoder)

JPEG压缩格式-->YUV格式的图片解码。

JPEGE(JPEG Encoder)

YUV格式-->JPEG压缩格式的图片编码。

VDEC(Video Decoder)

H264/H265格式-->YUV/RGB格式的视频码流解码。

VENC(Video Encoder)

YUV420SP格式-->H264/H265格式的视频码流编码。

PNGD(PNG decoder)

PNG格式-->RGB格式的图片解码。

此处就以JPEGD图片解码+VPC图片缩放为例来说明如何使用DVPP功能。这里先通过一张图总览接口调用流程,包括资源初始化&去初始化、通道创建与销毁、解码、缩放、等待任务完成、释放内存资源等。

 总览接口调用流程后,接下来我们以开发者更熟悉的方式“代码”来展示JPEGD图片解码+VPC图片缩放功能的关键代码逻辑。

// 创建通道

acldvppChannelDesc dvppChannelDesc = acldvppCreateChannelDesc();

acldvppCreateChannel(dvppChannelDesc);

// 在JPEGD图片解码前,准备其输入输出

// ……

// 创建解码输出图片描述信息,设置图片的宽、高、图片格式、内存地址等

acldvppPicDesc decodeOutputDesc = acldvppCreatePicDesc();

acldvppSetPicDescData(decodeOutputDesc, decodeOutputBuffer));

acldvppSetPicDescWidth(decodeOutputDesc, decodeOutputWidth);

acldvppSetPicDescHeight(decodeOutputDesc, decodeOutputHeight);

// 此处省略其它set接口……

// 执行JPEGD图片解码

acldvppJpegDecodeAsync(dvppChannelDesc, decodeInputBuffer, decodeInputBufferSize, decodeOutputDesc, stream);

// 5. 在VPC图片缩放前,准备其输入、输出

// 创建缩放输入图片的描述信息,并设置各属性值解码的输出作为缩放的输入

acldvppPicDesc resizeInputDesc = acldvppCreatePicDesc();

acldvppSetPicDescData(resizeInputDesc, decodeOutputBuffer);

acldvppSetPicDescWidth(resizeInputDesc, resizeInputWidth);

acldvppSetPicDescHeight(resizeInputDesc, resizeInputHeight);

// 此处省略其它set接口……

// 创建缩放输出图片的描述信息,并设置各属性值

acldvppPicDesc resizeOutputDesc = acldvppCreatePicDesc();

acldvppSetPicDescData(resizeOutputDesc, resizeOutputBuffer);

acldvppSetPicDescWidth(resizeOutputDesc, resizeOutputWidth);

acldvppSetPicDescHeight(resizeOutputDesc, resizeOutputHeight);

// 此处省略其它set接口……

// 6. 执行VPC图片缩放

acldvppVpcResizeAsync(dvppChannelDesc, resizeInputDesc,

                     resizeOutputDesc, resizeConfig, stream);

// 7. JPEGD图片解码、VPC图片缩放都是异步任务,调用以下接口阻塞程序运行,直到指定Stream中的所有任务都完成

aclrtSynchronizeStream(stream);

 

04 更多学习资源

更多学习资源,欢迎登录昇腾社区查阅:

[1]昇腾文档中心:昇腾社区-官网丨昇腾万里 让智能无所不及

[2]香橙派AIpro开源样例代码:Ascend/EdgeAndRobotics

[3]香橙派AIpro学习资源一站式导航:https://www.hiascend.com/forum/thread-0285140173361311056-1-1.html

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

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

相关文章

软件杯 深度学习图像修复算法 - opencv python 机器视觉

文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步:将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…

通义千问:官方开放API开发基础

目录 一、模型介绍 1.1主要模型 1.2 计费单价 二、前置条件 2.1 开通DashScope并创建API-KEY 2.2 设置API-KEY 三、基于DashScope SDK开发 3.1 Maven引入SDK 3.2 代码实现 3.3 运行代码 一、模型介绍 通义千问是由阿里云自主研发的大语言模型,用于理解和分…

App Inventor 2 如何预览PDF文档?

预览PDF文档的方式 你可以使用Activity启动器查看已存储在你的设备上的 pdf 文档,也可以使用Web客户端通过网址URL打开 pdf 文档。 App Inventor 2 可以使用 .pdf 扩展名从程序包资产中查看 pdf 文件,不再需要外部 pdf 查看器! 代码如下&a…

无线网络安全之WiFi Pineapple初探

背景 WiFi Pineapple(大菠萝)是由国外无线安全审计公司Hak5开发并售卖的一款无线安全测试神器。集合了一些功能强大的模块,基本可以还原钓鱼攻击的全过程。在学习无线安全时也是一个不错的工具,本文主要讲WiFi Pineapple基础配置…

超越GPT-4V,苹果多模态大模型上新,神经网络形态加速MLLM(一)

4月8日,苹果发布了其最新的多模态大语言模型(MLLM )——Ferret-UI,能够更有效地理解和与屏幕信息进行交互,在所有基本UI任务上都超过了GPT-4V! 苹果开发的多模态模型Ferret-UI增强了对屏幕的理解和交互&am…

vivado 在硬件管理器中调试 AXI 接口

在硬件管理器中调试 AXI 接口 IP integrator 中的 System ILA IP 支持您在 FPGA 上对设计执行系统内调试。在 Versal 器件上 , System ILA 核已被废 弃。现在 , 在含 AXIS 接口的标准 ILA 中支持接口调试。如需监控 IP integrator 块设计中的…

“手撕“数组一些简单的习题

目录 1.数组转字符串 2.数组拷贝 3.求数组中元素的平均值 4.查找数组中指定元素(顺序查找) 5.查找数组中指定元素(二分查找) 6.数组排序(冒泡排序) 7.数组逆序 1.数组转字符串 先让我们看看为什么要转字符串: int[] arr {1,2,3,4,5,6}; System.out.printl…

03-JAVA设计模式-迭代器模式

迭代器模式 什么是迭代器模式 迭代器模式(demo1.Iterator Pattern)是Java中一种常用的设计模式,它提供了一种顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示的方法。迭代器模式将遍历逻辑从聚合对象中分离出来…

如何用flutter写一个好的登录页面

编写一个好的登录页面是构建用户友好且安全的移动应用的重要一步。下面是使用Flutter编写一个好的登录页面的一些建议和步骤: 1. 设计用户界面 1.简洁明了的布局:确保界面简洁明了,不要过分复杂,避免用户感到困惑。 2.清晰的输入框…

部队营区无线广播-部队营区无线广播音频智能管理播控系统建设浅析

部队营区无线广播音频智能管理播控系统技术方案 由北京海特伟业科技任洪卓发布于 2024年4月16日 一、部队营区无线广播音频智能管理播控系统建设要求 为了响应上级关于恢复播放作息号的指示精神,提升广播系统在部队营区管理中的重要性和可塑性,某部营区…

Docker Container (容器) 常见命令

Docker 容器的生命周期 什么是容器? 通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容 器有初建、运行、停止、暂停和删除…

Python中的设计模式与最佳实践【第166篇—设计模式】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的设计模式与最佳实践 在软件开发中,设计模式是一种解决常见问题的经过…