欢迎光临散文网 会员登陆 & 注册

【2023 · CANN训练营第一季】数据预处理-VPC图片缩放

2023-05-14 22:26 作者:白子不摆烂版  | 我要投稿

文档参考:CANN文档社区版: 6.0.RC1.alpha001

一、VPC相关接口简介

ACL接口中的VPC相关接口:主要负责图像处理功能,支持对图片做抠图、缩放、叠加、拼接、格式转换等操作

还是和JPEGD一样,我们在使用过程中,简单了解功能后,最先注意的应该是其性能指标,以保证我们不会在非正常指标的情况下进行相关代码设计,等无法满足使用的时候才发现并不能达到需要的使用的性能,浪费我们的项目时间。

性能指标:

以下性能数据,是基于一个stream上下发10个异步媒体数据处理任务后,执行一次aclrtSynchronizeStream接口。

  • 对于非8K图像,单个Device的基本场景性能指标参考如下(1路对应一个通道,一个通道对应一个线程):

对于1080p的图像,若存在Host->Device的图片数据拷贝,由于拷贝带宽限制,最大总帧率约为1000fps。

对于4K的图像,若存在Host->Device的图片数据拷贝,由于拷贝带宽限制,最大总帧率约为250fps。

对于8K图像,单个Device的典型场景性能指标参考如下(1路对应一个通道,一个通道对应一个线程):

note:

  • VPC处理性能与处理过程中的图像分辨率强相关,以输入图像和输出图像中的最大分辨率作为基准分辨率,基准分辨率越大,处理耗时越久,性能越低。

  • 调用VPC批处理接口(接口命名中包含Batch,例如acldvppVpcBatchCropAsync接口)时,由于图像处理单元DVPP(Digital Video Pre-Processing)内部多个VPC硬件单元会并行处理图片任务,因此单路就可以达到最大总帧率。

图片分辨率约束:

  • 输入图片分辨率:支持如下分辨率的输入图片:

    非8K:宽x高在10x6~4096x4096范围内,包括4096。

    8K:宽或高在4096~8192,不包括4096。

  • 输出图片分辨率:10x6~4096x4096

输出的宽高对齐:

这里我仅写出了我们下方代码输出的yuv420SP(NV12 8bit)的情况:

输入图片:

宽stride为宽16对齐后的值。

高stride为高2对齐后的值。

内存大小(单位Byte)≥ 宽stride * 高stride * 3/2

输出图片:

宽stride为宽16对齐后的值。

高stride为高2对齐后的值。

内存大小(单位Byte)≥ 宽stride * 高stride * 3/2

功能说明:

以下仅写出了310可以使用的功能:

抠图 :

从输入图片中抠出需要用的图片区域,支持一图多框和多图多框。

缩放:

 针对不同分辨率的图像,支持8K缩放、非8K缩放。

支持单图裁剪缩放(支持非压缩格式)、一图多框裁剪缩放(支持非压缩格式)。

其它缩放方式,如:原图缩放、等比例缩放(缩放前后图片的宽高比例相同)。

叠加 :

从输入图片中抠出来的图,对抠出的图进行缩放后,放在用户输出图片的指定区域,输出图片可以是空白图片(由用户申请的空输出内存产生的),也可以是已有图片(由用户申请输出内存后将已有图片读入输出内存),只有当输出图片是已有图片时,才表示叠加。

拼接 :

从输入图片中抠多张图片,对抠出的图进行缩放后,放到输出图片的指定区域。

格式转换:

支持RGB格式、YUV格式之间的格式转换。

图像灰度化:

将彩色图像转化为灰度图像。需注意,输入为灰度图像、输出只能为灰度图像。

昇腾310 AI处理器,实现图像灰度化的操作是从YUV420SP格式的输出图像数据中只取Y分量的数据

示意图:

接口说明:

VPC的接口很多,我们这里只介绍一下我们用到的那个:

二、代码验证与学习

代码思路:

1.读取一个已知其宽高的yuv图片,存入aclrtMalloc存入的内存中

2.设置好dvpp的input和output通道的相关内容。

3.调用vpc相关接口,输出图像。

4.保存图像,查看结果,并按顺序依次销毁所有创建的device等。


这里其实就已经清除的搞清楚我们需要做的事情啦,如下为代码实现:

runResize.cpp : 主函数。

dvpp_resize.cpp :主要为resize相关内容函数

dvpp_resize.h :头文件,存放相关结构体

代码就是如上啦,我们进行代码编译咯!

运行结果如下:

看样子我们已经成功的缩小了这个图片,我选择的是2048 x2048的图片。缩小后的大小为640x640的图,放在了outYuv路径下

我们来看看结果吧!这里我使用到的工具是yuvplayer,我们先看看原图。

这里点击size->custom我们选择设置自己的图像大小为2048 x 2048

然后设置图片格式为NV12。

2048x2048的图片实在是太大了,我的小小滴笔记本完全装不下,这里我只截图一部分。

看看我们缩小后的图片!按照上面的设置方法,只是宽高设置为640和640

缩放成功!!和原图一模一样。大家可以再测试一下两种分辨率之间来回缩放的时间,会发现放大是会耗时更多一点的。

好啦!到这里我们就实现了图像缩放,把图片缩放到了我们需要的大小,下一步就是把我们进行decode和resize处理好的图像进行推理,获得推理结果。

ps:该文仅是为了记录CANN训练营的学习过程所用,不参与任何商业用途,有任何代码问题可以和我一起讨论修改


【2023 · CANN训练营第一季】数据预处理-VPC图片缩放的评论 (共 条)

分享到微博请遵守国家法律