基于OpenVX的图像预处理算法的并行化研究

2020-02-01 15:23黄灿
现代计算机 2020年34期
关键词:插值预处理人脸识别

黄灿

(上海交通大学微纳电子学系,上海200240)

0 引言

近两年来,计算机视觉技术飞速发展,当前的人脸识别项目已经从传统的识别方法,如PCA特征脸法[1]、Viola-Jones算法、局部二进制模式(LBP)等,转为更加优异的基于卷积神经网络(CNN)的方法。应用卷积神经网络的识别率已接近100%,但在嵌入式平台上如何提高人脸识别速度仍然存在不小的挑战。由于人脸识别步骤中的图像预处理存在细粒度像素级的计算,如何加速图像预处理成为整个人脸识别系统重要的一环。随着GPU通用计算的发展,利用GPU计算平台实现对应用程序的加速已成为提高程序性能的主要模式。当前操作GPU的方式有很多,与诸如OpenCL之类的计算框架相比,OpenVX为通过用户自定义节点和图(graph)模型的使用能实现系统级优化和内核级优化[2]。

传统的人脸识别的并行解决方案已有大量的工作,文献[3-5]基于CUDA、OpenCL在GPU上实现传统人脸检测系统。当前基于深度学习的人脸识别的优化工作,多是网络结构的改进,如文献[6]。国内外鲜有人针对网络之前的图像预处理步骤结合OpenVX进行并行优化。本文基于OpenVX框架,将前处理算法在GPU平台上实现和优化的关键技术和方法进行研究。本文的主要贡献如下:①基于VIP8000 GPU对人脸识别系统的图像处理步骤提出并行化框架及算法改进;②以OpenVX框架进行处理,将前处理算法设计成一个核函数,并以节点的方式链接人脸识别网络,以此增进与网络的数据联系,减少内存总线的数据传输。

在第1节中首先介绍前处理算法步骤,在第2节中分析并行性介绍算法的并行设计方案和其他2种加速方案,第3节讨论实验结果,第4节是总结与后期研究。

1 预处理算法步骤

由于输入的图像不可避免地存在诸如图像光照不均、与网络前端尺寸不匹配等问题,在对图像输入网络之前需要先对图像进行预处理。其步骤如图1所示。

图1 人脸识别系统步骤

步骤1:缩放。根据OpenCV,通过缩放比例系数计算目标像素在源图像中的坐标。

或者人脸对齐。利用仿射变换矩阵逆矩阵计算出目标像素映射到原形变图像中的坐标。

步骤2:插值。像素值的计算通过插值获得,这里采用双线性插值,经过变形后的插值表达式如下[7],其中fx,fy是坐标的小数部分:

步骤3:z-score标准化。对原图像进行归一化处理,以消除光照影响。这里采用z-score标准化,能很好地处理异常值经过处理的数据符合标准正态分布。

步骤4:uint8量化。在人脸识别网络中,层内操作是float 32类型,层间的数据传递是uint8。我们将图像前处理层传递数据的也设计为uint8,将标准化后的数据重新量化到0-255像素值范围[8],如图2所示。

图2 8bit量化

2 算法的并行化设计与实现

2.1 并行性分析

经分析,我们发现预处理步骤1、2存在较高的并行性,主要体现在:

(1)步骤1中坐标计算的并行性:缩放和仿射变换都属于图像几何变换,它们不更改图像内容,所有像素坐标计算并不存在数据依赖关系,具有很好的并行度。

(2)步骤2中像素值插值的并行性:双线性插值过程中,映射坐标周围四个像素间涉及一个插值运算,并且四个像素值在存储中两两连续。在设计核函数时,由于VIP8000寄存器宽度为128bits,相比于CUDA更宽,减少插值过程中寄存器数据转移是并行设计的一大挑战。

2.2 并行化设计

(1)数据并行设计

首先对图像像素进行分块。本文基于是芯原的VIP8000 GPU架构处理器,VIP8000有两个Shader Core,即并行处理计算核心,每个Shader包含128位的4组寄存器文件和一个ALU执行单元。因此线程并发度为8。由于其寄存器长度为128bits,可以处理4个float类型数据,因此本文设计一个线程处理4个目标像素,其由16个原图像像素插值得到,如图3所示。

图3 像素分块示意

接着,以单指令多数据(SIMD)的方式对像素向量进行操作。由于VIP8000中寄存器很长,寄存器里两两像素间存在数据关联,基于VIP8000的EVIS指令集,本文提出一个解决方法,以R像素点为例,将双线性插值公式变形成如下所示:

可以看到公式(2)中的三个方括号里包括了形式相同的公式。因此在数据处理过程中,4个R0、R1在同一个寄存器,同样4个R2、R3放在另一个寄存器,计算出方括号内的形式的向量,方便插值计算。

此外,本文通过对坐标进行移位操作,将浮点运算变成整数运算,加速计算过程。

(2)系统级并行

OpenVX指定了基于图模型(graph)的计算方法,图由节点(node)连接,每一个节点都是计算机视觉核函数(kernel)的实例。以图模型运行前处理算法有以下好处:①利用节点执行的独立性,为不同设备上运行的节点提供并行性;②图的模式中系统了解多个节点之间的数据关系,并且可以在系统和cache上有效地操作,能够减少不必要的刷新和失效[2]。

另外,本文设计的核函数是一个聚合函数,如图4所示,将多个前处理操作节点融合成为一个节点,节点融合可以消除相关的内存缓冲区,同时不需要访问中间数据对象,可以将其创建为虚拟图像。虚拟图像还允许进行进一步的优化,例如过滤器堆栈,以最大程度地减少通过内存总线的数据传输[9]。

图4 具有自定义节点的graph

3 实验结果与分析

3.1 测试环境

本实验基于芯原的VIP8000 GPU(频率886MHz);CPU采用的是ARM v7(频率996MHz)。人脸检测、识别网络分布基于MobileNet v1和ResNet50,测试两个网络之前的前处理算法在不同优化下的时间。本文将CPU上的常用的几种优化方法应用于预处理算法中进行了对比,选取的对比算法如下:

(1)查表法:将0-255像素值经过标准化和量化处理后制成三张表,输入图像经过定点化处理之后,通过查表法替换像素值。

(2)NEON优化:本文基于Intrinsics指令,将像素点打包成向量,并行处理像素。

3.2 测试结果与分析

(1)人脸检测网络预处理时间

这里将预处理算法在OpenCV库中高度优化的CPU版本在ARM-v7上的执行时间记录为基本CPU时间。其中,尺寸为224×224×3的图片输入网络中不需要缩放步骤,另外设计分支核函数以加速运算。

如表1所示,实验结果表明,与OpenCV库的CPU版本相比,NEON优化性能却下降,这主要是由于①in⁃trinsics指令不能一次性从uint8转换成float,中间涉及u16、u32、f32、f64的类型转换浪费很多cycle;②需要对离散的像素进行打包操作。查表法因为计算量的减少能达到1.34倍的加速比,可以计算出分辨率为224×224×3的图像计算量能够变为之前的0.0051。基于OpenVX的并行优化由于其SIMD向量化、以及graph的处理能得到12.65倍的加速比。另外,准确率不会因为优化方式的不同而改变,因为算法步骤是相同的。

表1 人脸检测网络预处理时间对比

(2)人脸识别网络预处理

人脸识别网络预处理时间如表2所示。同样设计了基本CPU时间和查表法作为对比。实验结果表明,与OpenCV库的CPU版本相比,查表法涉及的计算量减少能得到约1.58倍的加速比,基于OpenVX的并行程序经过数据向量级并行,以及graph执行图处理,能得到5.25倍的加速比。

表2 人脸识别网络预处理时间对比

4 结语

本文设计了三种图像预处理加速方案。实验结果表明,基于OpenVX的图像预处理算法基于数据并行以及graph处理能达到约12倍的加速效果,明显优于查表法和NEON优化。综上,本文基于OpenVX为预处理算法设计核函数,为基于VIP8000 GPU的人脸网络图像预处理领域并行化的运用提供新的方案。下一步工作会实现跨平台的算法部署;针对预处理算法的其他专用场景如夜晚下的处理步骤进行并行优化。

猜你喜欢
插值预处理人脸识别
预处理对医用外科口罩用熔喷布颗粒过滤性能的影响
滑动式Lagrange与Chebyshev插值方法对BDS精密星历内插及其精度分析
手术器械预处理在手术室的应用
人脸识别 等
污泥预处理-厌氧消化体系的能源经济性评价
人脸识别的“国标”来了
污泥预处理及其在硅酸盐制品中的运用
基于pade逼近的重心有理混合插值新方法
荣耀畅玩7C:人脸识别
不同空间特征下插值精度及变化规律研究