一种基于卷积定理的人脸验证加速方法与流程

文档序号:12064286阅读:493来源:国知局
一种基于卷积定理的人脸验证加速方法与流程

本发明属于计算机视觉中的人脸验证领域,涉及一种人脸验证的加速方法,尤其涉及一种基于卷积定理的人脸验证加速方法。



背景技术:

随着社会的发展,人们对安全性与便利性的要求日益增加,人脸验证技术在近几十年有了长足的发展,其具有直接、友好、方便等优点,可应用在登陆验证、身份识别等许多场景,从而得到了广泛的关注与研究。人脸验证的目标为判断两张人脸图片中的人脸是否为同一个人,主要由人脸图像预处理、特征提取、特征度量等三部分组成。在深度学习提出之后,特别是在卷积神经网络(convolutional neural networks,CNN)应用在图像识别领域取得巨大成功后,研究人员意识到CNN在提取图像特征方面的优势。许多研究人员将CNN应用于人脸验证系统,用于提取人脸特征,实验表明人脸验证的正确率有很大的提高,可靠性明显提升。目前,主流的人脸验证系统都已采用CNN技术。

但是为了提高正确率,人脸验证系统采用的CNN模型的层数不断加深,参数不断增多,这些复杂的CNN模型导致的主要问题是计算负担很大。为此,研究人员采用GPU并行计算设备计算CNN,来加快人脸验证系统的运行速度。这种方法只是将卷积计算并行化,并未本质上改变卷积的计算方式。很多人脸验证系统在采用GPU计算后,仍达不到实时性要求或难以处理海量的人脸数据。因此,在采用GPU计算设备的基础上,进一步提出方法加快人脸验证的计算速度是很有必要的。



技术实现要素:

针对人脸验证系统计算负担大,运行速度慢的问题,本发明的目的在于提供了一种基于卷积定理进行人脸验证加速的实现方案。在此基础上,人脸验证系统的运行速度明显提高,对海量数据的处理能力得以提升。

为实现上述目的,本发明采用的技术方案如下。在使用GPU并行计算平台的基础上,对满足加速条件的卷积层,采用卷积定理方法替换常规卷积计算方法进行卷积计算。卷积定理表明,空域中的卷积等价于频域中的乘积。通过将耗时的卷积计算转化为频域中的乘积计算,能够显著减少计算量,加快CNN的计算速度,从而提升人脸验证的速度。

描述本方法所用符号如下:

本方法流程如图1所示,包括六个步骤:

步骤1:由卷积层输入参数判断是否满足加速条件。

首先根据卷积层的输入参数,判断是否满足卷积定理的加速条件。标准的卷积计算方法是采用多重循环嵌套进行计算,其时间复杂度Cstd约为Cstd≈M2P2,整个卷积层的时间复杂度Cstd_layer约为Cstd_layer≈KLCstd。卷积定理算法流程中,快速傅里叶变换(Fast Fourier Transformation,FFT)的时间复杂度CFFT约为频域乘积求和的时间复杂度Cmul约为Cmul≈4M2。卷积定理的时间复杂度Cconv约为Cconv≈3CFFT+Cmul。整个卷积层采用卷积定理的时间复杂度Cconv_layer约为Cconv_layer≈KCFFT+LCFFT+KLCmul。通过Cstd_layer和Cconv_layer的对比得出,Cconv_layer与卷积核尺寸P无关,并且当满足K+L<<KL时,采用卷积定理计算卷积能显著减少计算量。

步骤2:输入图像和卷积核尺寸扩充。

为了应用卷积定理计算卷积,首先要将输入图像和卷积核扩充至相同尺寸。为了避免因为周期性问题而导致的混淆错误,输入图像的扩充尺寸M′要求满足M′≥M+P-1。扩充后在原数据右下方补零填充,如图2所示。卷积运算中的数据都是由四维构成的,四维数据的尺寸以下标大写字母形式的表示,输入图像具体表示为xS*K*M*M。在以下文字叙述中,为叙述简洁,数据不列出下标。输入图像简写为x,x′表示尺寸扩充后的输入图像。输入图像尺寸扩充操作表示为:

卷积核具体表示为wL*K*P*P,简写为w,w′表示尺寸扩充后的卷积核,尺寸扩充操作为:

输入图像和卷积核延拓后尺寸相同,即M+Q=P+Q′。

步骤3:输入图像和卷积核傅里叶变换。

利用傅里叶变换将图像从空域变换至频域。根据Hermitian对称性,傅里叶变换后的数据存在一半的冗余,因此只需存储和计算一半数据。用x″表示频域中的输入图像,输入图像的傅里叶变换表示如下:

用w″表示频域中的卷积核。卷积核的傅里叶变换表示如下:

步骤4:频域乘积求和计算。

频域的乘积求和公式定义为:

其中,out表示频域乘积求和计算结果,s表示S张输入图像中第s张,l表示L个卷积核个第l个,k表示K个输入图像通道中第k个,m,n表示二维频域中的像素位置。

对于频域中乘积求和计算,直接方法是采用循环嵌套来计算,但无疑效率较低。为了充分利用GPU的并行计算能力,本方法将循环嵌套转换为矩阵相乘形式来完成频域中乘积求和计算。

若要采用矩阵乘积完成计算,首先要将输入图像和卷积核由主通道存储重排列为主像素存储,完成批量矩阵相乘,之后将运算结果反重排列。

步骤4.1:输入图像和卷积核重排列。

x″′表示重排列后的输入图像,输入图像的重排列操作表示为:

w″′表示重排列后的卷积核,卷积核的重排列操作表示为:

步骤4.2:批量矩阵乘积计算。

在完成数据重排列后,将x″′的(m,n)处后两维(s,k)视为一个大小为(S,K)的矩阵,w″′的(m,n)处后两维(l,k)视为另一个大小为(L,K)的矩阵,进行矩阵相乘。如此便完成了(m,n)像素位置处的频域乘积求和计算。矩阵乘积运算批量进行(M+Q)*((M+Q)/2+1)次,便完成全部数据的频域乘积求和运算。out代表矩阵乘积计算后的结果,表示如下:

步骤4.3:计算结果反重排。

out′为out反重排的结果,反重排列操作表示为:

步骤5:计算结果傅里叶反变换。

对out′进行傅里叶反变换前,先根据Hermitian对称性填充另一半数据,然后再做傅里叶反变换,out″为out′傅里叶反变换的结果,得到:

步骤6:计算结果边界裁剪。

由于在进行傅里叶变换前,将输入图像和卷积核的尺寸都进行扩充,所以需要对计算结果的右下方进行裁剪。根据卷积的定义,应保留尺寸为M-P+1,即:

out″′即为卷积运算的最终结果。

本发明具有如下有益效果。

1、本发明提出的加速方法具有无精度损失的优点,不会影响人脸验证的正确率。

2、本发明方法可直接运行在通用GPU计算设备,不需要额外的硬件设备。

附图说明

图1方法流程图

图2输入图像补零填充示意图

图3输入图像的数据重排列示意图

图4输入图像与卷积核矩阵乘积计算示意图

具体实施方式

以下将结合附图和实施例对本发明作进一步详细说明。本发明中,以GPU作为计算平台,采用CUDA作为GPU并行计算框架,选取Caffe作为CNN框架。

具体实施步骤如下:

步骤1:由卷积层输入参数判断是否满足加速条件。

当K、L都大于100或P大于5时,本方法能取得加速效果。

步骤2:输入图像和卷积核尺寸扩充。

采用CUDA_KERNEL_LOOP并行循环,新建N个线程,每个线程处理图像中的一个像素点的扩充操作,N个线程并行进行扩充操作。

对输入图像和卷积核的尺寸进行扩充,需要额外的缓存空间。每个卷积层的参数不相同,需要的缓存空间大小因此也不相同。为避免消耗过多内存,在初始化时离线计算出各卷积层需要的缓存空间,一次性分配其中的最大值。在运行时各卷积层共用这一块缓存区域,而不再为它们单独分配缓存,以此节省内存。

步骤3:输入图像和卷积核傅里叶变换。

采用CUDA提供的cuFFT库来实现傅里叶变换。在初始化时,对各个卷积层,使用cufftPlanMany函数来创建傅里叶变换计划,它能够同时指定多个傅里叶变换。cufftPlanMany函数需要指定数据的内存格式,以便确定每个傅里叶变换所需数据的输入输出位置。对于二维傅里叶变换,其输入和输出数据的内存格式分别为:

input[b*idist+(x*inembed[1]+y)*istride] (12)

output[b*odist+(x*onembed[1]+y)*ostride] (13)

其中,x,y为二维数据中的坐标,b为数据序号,idist为两个数据之间的距离,inembed为二维数据的尺寸,istride为跨度。输出数据output同理。

在运行时,调用cufftExecR2C函数,它根据傅里叶变换计划来完成傅里叶变换。训练完毕的CNN卷积核的数值将不再改变。因此预先进行各卷积层的卷积核尺寸扩充和傅里叶变换计算,并将结果保存起来留待测试时使用,从而节约计算时间。

步骤4:频域乘积求和计算。

采用cuBLAS矩阵计算库,完成数据的重排列和矩阵乘法计算。

步骤4.1:输入图像和卷积核重排列。

为了用cuBLAS库来实现矩阵相乘,在将在同一像素位置处的{x"s,k(m,n)|s=0,1,2....S-1;k=0,1,2,....K-1}组成一个矩阵时,需要在内存中连续存储。但在完成傅里叶变换后,x″是以行为主存储的,即在内存中依次按(s,k,m,n)的次序存储,先存储第0幅图像第0通道的各个傅里叶系数值,之后存储第0幅图像第1通道的各个傅里叶系数值,依次类推;因此,在内存中{x"s,k(m,n)|s=0,1,2....S-1;k=0,1,2,....K-1}并不连续存储,需要先将数据重新排列,使其转换为在内存中以(m,n,s,k)的次序来存储,从而{x"s,k(m,n)|s=0,1,2....S-1;k=0,1,2,....K-1}变为连续存储。

数据重排列通过矩阵转置来实现。x″中,将x″的四维数组视为一个矩阵,前两维(s,k)和后两维(m,n)分别作为矩阵的行和列。将x″进行矩阵转置后得到x″′,则x″′的每行(m,n)对应于该像素位置处的{x"s,k|s=0,1,2....S-1;k=0,1,2,....K-1}集合。由于在以行为主存储时矩阵中每行的数据是连续存储的,因此{x"s,k(m,n)|s=0,1,2....S-1;k=0,1,2,....K-1}将连续存储。上述数据重新排列如图3所示。

使用cublasCgeam函数来完成矩阵转置,矩阵转置执行的操作为:

C=αopA(A)+βopB(B) (14)

其中,op代表是否转置操作。参数设置为:α=1,β=0,opA=T,即可得到转置操作:C=AT。设置A=x″,C=x″′时,实现了输入图像数据的重排列。设置A=w″,C=w″′时,实现卷积核数据的重排列。

步骤4.2:批量矩阵乘积。

当只考察单个像素位置(m,n)时,如果把在(m,n)处的所有输入图像和所有通道的F(xs,k)(即x"s,k)值组成一个矩阵A,其行数和列数分别为S和K,再把(m,n)处的所有卷积核和所有通道的w"l,k值组成另一个矩阵B,其行数和列数分别为L和K,则用矩阵乘积A*BT就能够一次性求出所有S个输入图像和所有L个卷积核在(m,n)处的卷积结果,如图4所示。矩阵乘法通过GPU上的cuBLAS计算库来实现,且不同像素位置处的矩阵乘积计算成批进行,从而完成频域中的乘积求和计算。

CUDA中提供cublasCgemmBatched函数来批量完成多个矩阵相乘计算,与循环调用矩阵相乘相比,效率更高。

cublasCgemmBatched函数执行的运算为:

C[i]=α(opA(A[i])*opB(B[i]))+βC[i],i∈[0,batchCount-1] (15)

其中,i为批序号,batchCount为批量计算数量。令A为输入图像矩阵,B为卷积核矩阵,C为运算结果矩阵,batchCount设置为像素的数目,即:(M+Q)*((M+Q)/2+1)。参数设置为α=1,β=0,opA=N,opB=T,即矩阵A不转置,B转置。

cublasCgemmBatched函数要求指定每批数据中A[i],B[i],C[i]等的起始地址。输入图像中,若x″′为输入图像数组的起始地址,则各批数据的起始地址为:

步骤4.3:计算结果反重排。

计算结果反重排实现方式与4.1中类似,设置参数为A=out,C=out′完成反重排操作。

步骤5:计算结果傅里叶反变换。

实现方式与步骤3中类似,调用cufftExecC2R函数完成傅里叶反变换操作。

步骤6:计算结果边界裁剪。

新建一块尺寸为(M-P+1)*(M-P+1)的内存空间,用以存放最终运算结果。采用CUDA_KERNEL_LOOP并行循环,新建N个线程,N个线程并行处理,将out″中应保留的数据拷贝至最终运算结果的内存空间。

下面给出本发明的一个测试结果。选取Xiang Wu等人提出的“lightened modelA”人脸验证CNN模型进行试验,实验环境如下。GPU型号为GTX 860M,CUDA 7.0版本,每批输入图像的数量为8,共输入1000批人脸图像进行试验。结果为:

从以上实验可以看出,本发明方法相较于常规卷积计算方法能取得明显加速效果。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1