一种基于GPU的整像素运动估计方法与流程

文档序号:15359255发布日期:2018-09-05 00:26阅读:225来源:国知局

本发明涉及一种整像素运动估计方法。特别是涉及一种用于视频编码标准avs2中帧间的基于gpu的整像素运动估计方法。



背景技术:

随着高分辨率视频的出现,其对视频信息压缩的要求越来越高。新一代视频编码标准avs2的出现极大地缓解了这一挑战。avs2是具有我国自主知识产权的第二代数字音视频编码标准。avs2通过引入多个创新编码技术,在压缩质量和效率上已经超越传统的视频编码标准avs1。

为提高预测的灵活性和预测的精确度,avs2中采用四叉树划分结构,块划分更加灵活。主要分为编码单元(codingunit,cu),预测单元(predictionunit,pu)和变换单元(transformunit,tu)。avs2中将编码帧分成若干个一定大小互不重叠的矩形块,允许最大编码单元(lcu)尺寸为64x64。每个lcu又可以按照四叉树递归划分为从64x64到8x8不同大小的cu。在帧间运动模式下,64x64到16x16的编码单元下均有7中预测单元(predictionunit,pu)的划分为:2nx2n、2nxn、nx2n、2nxnu(2nxn+2nx3n)、2nxnd(2nxn+2nx3n)、nlx2n(nx2n+3nx2n)、nrx2n(3nx2n+nx2n),其中,n为当前编码单元大小的一半,n大小为1/2n,u,d,l和r是“up”,“down”,“left”和“left”的缩写。具体如图1所示,8x8的编码单元只有前三种预测单元的划分。

运动估计就是在视频序列参考帧上相应的搜索范围内为当前编码块寻找最佳匹配块,使得当前编码块与匹配块的残差尽可能的小,并用运动矢量(mv)表示最佳匹配块的位置。在运动估计中常常采用块匹配算法。整像素运动估计是帧间运动估计较为重要的一个部分。整像素运动估计搜索方法分为全搜索算法和快速搜索算法,通常采用搜索模板。全搜索算法是将一定的搜索范围内的像素点都遍历一遍。全搜索算法通常可以得到全局最优解,效果最好,但是复杂度太高。快速搜索算法中包括三步搜索法、四步搜索法、菱形搜索法、分层块匹配搜索法等。快速搜索算法能够大大降低运动矢量的搜索时间,但是可能得到局部最优解。整像素运动估计结果的评价通常采用公式(1):

jsad=λ×rmode+dsad(1)

其中,jsad代表当前的运动估计代价,λ代表lagrange乘子,r代表编码运动矢量差值的比特数,dsad表示当前块与匹配块差的绝对值之和(sumofabsolutedifferences,sad)。由于这些算法通常在cpu上计算,而cpu本身的串行计算方式在很大程度上限制了搜索算法的性能。

由于运动估计部分需要针对大量的像素点进行处理,存在很大的并行优化潜能。所以这一部分采用gpu进行优化会带来编码效率的显著提升。gpu广泛应用在图像处理、深度学习和物理仿真等领域。cuda(computeunifieddevicearchitecture)是由nvidia公司提供的基于该公司gpu的运算平台。这种通用并行计算架构能够帮助gpu解决复杂的计算问题。该平台是对c语言以及c++的一种扩展。

cuda编程模型中将cpu端作为主机端(host),gpu端作为设备端(device)。在设备端运行的函数被称为内核函数(kernelfunction)。内核函数中的线程以线程格(grid)的形式组织,函数调用时需要确定内核函数线程格中线程块(block)数目和线程(thread)的数目。相比较于cpu来说,gpu有更加复杂的存储模型,其中包括:全局存储器、共享存储器、常量存储器、纹理存储器等。

新一代视频编码标准avs2中整像素运动估计具有较高的复杂度,在cpu上运算搜索计算量较大,耗时较长。



技术实现要素:

本发明所要解决的技术问题是,提供一种能够降低整像素运动估计的复杂度,加速运动估计过程的基于gpu的整像素运动估计方法。

本发明所采用的技术方案是:一种基于gpu的整像素运动估计方法,包括如下步骤:

1)设置cuda平台中的内核函数的线程格和线程块的大小;

2)启动cuda平台整像素运动估计内核函数;

3)在设备端为当前最大编码单元分配共享内存,包括编码单元像素值缓存、子块sad值存储、pu的运动矢量存储和pu的运动矢量代价存储;

4)将当前最大编码单元的像素值从纹理内存中读入共享内存中的编码单元像素值缓存,并初始化当前最大编码单元的相关参数;

5)从参考帧列表读取当前参考帧,初始化各pu的初始运动矢量和初始像素搜索点;

6)按照运动估计搜索模板中确定的像素搜索点进行搜索,每四个像素搜索点并行搜索;

7)在当前搜索点下,并行计算当前编码单元中各pu的sad值和运动矢量代价,并将求得的pu的运动矢量代价同上一次循环得到的四个像素搜索点对应的pu的运动矢量代价进行对比,保存各pu代价最小时对应的运动矢量;

8)判断是否将运动估计搜索模板中的像素搜索点遍历完成,若是,则进行步骤9),否则返回步骤6);

9)比较并行搜索后四个搜索点对应pu的运动矢量代价,保存运动估计搜索模板中最优搜索点对应的运动矢量和运动矢量代价;

10)将当前编码单元中各pu对应的最优运动矢量和最优运动矢量代价拷入全局内存;

11)判断参考帧列表中的参考帧是否遍历完成,若是,则结束流程,否则,返回步骤5)。

步骤4)中所述的当前最大编码单元的相关参数包括:编码单元像素值指针、lagrange乘子、编码单元位置索引、运动矢量的范围。

步骤7)中所述的计算当前编码单元中的sad值和运动矢量代价是采用如下公式计算:

jsad=λ×rmode+dsad

其中,jsad代表当前的运动估计代价,λ代表lagrange乘子,r代表编码运动矢量差值的比特数,dsad表示当前块与匹配块差的绝对值之和。

本发明的一种基于gpu的整像素运动估计方法,将整像素运动估计应用于gpu,通过利用视频图像本身的并行性,增加数据处理的并行度,从而大大降低了运动估计算法的复杂度和计算时间,加速运动估计过程。实验证明本发明提出的方法可以有效加速整像素运动估计过程,最高加速比可以达到16.1。

附图说明

图1是帧间pu模式示意图;

图2是本发明一种基于gpu的整像素运动估计方法的流程图。

具体实施方式

下面结合实施例和附图对本发明的一种基于gpu的整像素运动估计方法做出详细说明。

如图2所示,本发明的一种基于gpu的整像素运动估计方法,包括如下步骤:

1)设置cuda平台中的内核函数的线程格和线程块的大小;

2)启动cuda平台整像素运动估计内核函数;

3)在设备端为当前最大编码单元分配共享内存,包括编码单元像素值缓存、子块sad值存储、pu的运动矢量存储和pu的运动矢量代价存储;

4)将当前最大编码单元的像素值从纹理内存中读入共享内存中的编码单元像素值缓存,并初始化当前最大编码单元的相关参数;所述的当前最大编码单元的相关参数包括:编码单元像素值指针、lagrange乘子、编码单元位置索引、运动矢量的范围等。

5)从参考帧列表读取当前参考帧,初始化各pu的初始运动矢量和初始像素搜索点;

6)按照运动估计搜索模板中确定的像素搜索点进行搜索,每四个像素搜索点并行搜索;

7)在当前搜索点下,并行计算当前编码单元中各pu的sad值和运动矢量代价,并将求得的pu的运动矢量代价同上一次循环得到的四个像素搜索点对应的pu的运动矢量代价进行对比,保存各pu代价最小时对应的运动矢量;

所述的计算当前编码单元中的sad值和运动矢量代价是采用如下公式计算:

jsad=λ×rmode+dsad

其中,jsad代表当前的运动估计代价,λ代表lagrange乘子,r代表编码运动矢量差值的比特数,dsad表示当前块与匹配块差的绝对值之和(sad)。

8)判断是否将运动估计搜索模板中的像素搜索点遍历完成,若是,则进行步骤9),否则返回步骤6);

9)比较并行搜索后四个搜索点对应pu的运动矢量代价,保存运动估计搜索模板中最优搜索点对应的运动矢量和运动矢量代价;

10)将当前编码单元中各pu对应的最优运动矢量和最优运动矢量代价拷入全局内存;

11)判断参考帧列表中的参考帧是否遍历完成,若是,则结束流程,否则,返回步骤5)。

下面采用不同分辨率的视频序列分别在cpu端和gpu端进行测试,记录各自的运行时间。采用加速比来说明本发明方法的有益效果。计算方法如下:

对不同分辨率视频序列进行整像素运动估计在cpu和gpu运行时间的对比如表1所示。从表1中可以看出,本发明专利所提出的方法能够有效加速帧间整像素运动估计,在处理1920x1080序列时,加速比最高达到了16.14。

表1整像素运动估计在cpu和gpu上运行时间对比

下面给出最佳实施例:

本实施例以basketballdrive_1920x1080_50.yuv视频序列为例,采用的gpu型号是nvidiageforcegt1030,cuda运行版本是8.0。在编码设置中,将最大编码单元设置为64x64,整像素运动估计搜索范围设置为32,同时将参考帧提前绑定至gpu的纹理内存中。具体步骤如下:

(1)将cuda启动内核函数中线程格的大小设置为(i_width_in_lcu,i_height_in_lcu)。i_width_in_lcu表示当前输入帧水平方向上最大编码单元的数量,i_height_in_lcu表示当前输入帧垂直方向上最大编码单元的数量。将线程块的大小设置为(16,16,4)。

(2)启动整像素运动估计内核函数。

(3)创建共享内存,用于存储算法中当前编码单元像素值,子块的sad值等,并初始化内存和编码单元的相关参数。

(4)进行参考帧列表循环,从参考帧列表中读取当前参考帧。

(5)对当前最大编码单元进行整像素运动估计。按照运动估计搜索模板确定的像素点每四个像素搜索点并行搜索。每个像素搜索点采用16x16个线程并行计算。

(6)在当前像素搜索点下,并行计算当前编码单元中的sad值和运动矢量代价,并将求得的pu的运动矢量代价同上一次循环得到的四个搜索点对应的pu的运动矢量代价进行对比,保存各pu运动矢量代价最小时对应的运动矢量。

(7)比较并行搜索后四个搜索点对应pu的运动矢量代价,保存搜索模板中最优搜索点对应的运动矢量和运动矢量代价。

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