高通用OpenGL插件进行运动估计,实现更高性能VR体验
EPE得分为0.91
(映维网 2021年03月22日)XR要求高帧速率、高分辨率和低延迟,而且是以非常低的功耗和热预算实现。用来对抗负载增加的一项基本技术是运动估计,即计算对象在图像帧间的运动。
与骁龙865移动平台一样,Qualcomm Adreno 6xx GPU增加了一个加速纹理单元,从而能够高效地、高性能地进行硬件加速的像素块匹配。为了帮助开发者在搭载骁龙平台的虚拟现实、游戏和其他应用中利用这一点,高通的虚拟现实团队创建了一个名为QCOM_motion_estimation的OpenGL扩展。
运动估计(又称光流估计)主要分析图像帧间的感知运动,并将其捕获为运动矢量。运动矢量通常是以特定的粒度提供,例如,每8x8像素块提供一个运动矢量。
对于虚拟现实,运动矢量与异步空间扭曲(ASW)或运动平滑等技术一起应用,从而创建外推帧。外推帧在渲染内容的位置显示,这可允许应用程序以较低的帧速率渲染。
除了异步空间扭曲之外,运动估计的其他常见用例同时包括视频压缩、立体深度、运动结构、图像对齐、运动模糊和对象追踪。
下图是根据两帧视频为像素块计算的运动矢量可视化:
1. 扩展综述
QCOM_motion_estimation扩展向OpenGL添加了两个API函数。所述函数接收表示要计算运动的两个图像帧的参考图像和目标图像(纹理)。然后填充包含相应运动矢量的输出纹理。所述函数具有以下签名:
团队将函数设计成具有灵活的输出格式。运动矢量会写入一个filterable GL图像格式(GLRGBA16F),后者会对其进行优化,以便在其他OpenGL函数中进一步使用,并有助于避免转换为其他格式。输出纹理中每个像素的R和G通道分别包含X和Y magnitude,而B和A通道保留以供将来使用。目前使用16位浮点提供子像素细化。
TexEstimateMotionRegionsQCOM()通过引入额外的模板mask参数来扩展TexEstimateMotionQCOM()。这是定义要计算运动矢量的感兴趣区域的纹理。模板mask可用于减少每帧的工作量。例如,如果不想分析整个场景时,比方说上一帧中某些对象的位置已知时,这可能非常有用。模板mask同时可用于注视点渲染,从而优化工作负载。
运动估计通常在单通道亮度纹理执行,如本扩展所示。应用程序可以使用EXT_YUV_target扩展中的rgb_2_yuv()着色器函数转换参考纹理和目标纹理。
当函数生成运动矢量纹理后,开发者可以将其用于特定的用例,如异步空间扭曲和压缩等。开发者同时可以渲染矢量(如作为叠加)以帮助可视化运动,甚至可以使用纹理进行3D操作,如网格扰动。
2. 性能和精度
结合Adreno 6xx提供的底层像素块匹配硬件加速,扩展针对具有最大GPU性能和低延迟的真实运动估计(TME)进行了优化。它可以与其他GPU工作负载保持一致,不需要额外的开销,而且CPU命令可以隐藏在正在进行的GPU工作后面,同时运动估计过程可以及时执行。对于典型的VR帧分辨率,通常可以在不到1ms的时间内为双眼生成运动矢量,从而允许按需创建矢量。像素块匹配硬件同时以分层方式运行,从而提高速度和更大的搜索范围。
评价运动估计系统的精度通常是通过计算平均端点误差(average-EPE)来实现。平均EPE将每个估计的运动矢量(Vest)与ground truth运动矢量(Vgt)进行比较,以确定其欧氏距离:||Vest – Vgt||。在确定每个运动矢量的端到端点误差之后,计算平均误差(即,平均EPE)以确定最终精度水平。
所述计算需要预先存在的ground truth运动矢量,通常是基于具有描述真实已知运动的注释的帧,例如Middlebury Optical Flow Dataset。利用Adreno 6xx的QCOM_motion_estimation扩展,以及两帧Middlebury数据集的ground truth值,EPE得分为0.91。这个数据集的运行时间低于每帧0.5ms。
3. 总结
运动估计包含了计算对象在数据帧之间的感知运动的强大技术。利用相关信息,从压缩视频到平滑虚拟现实中的抖动,开发者可以解决各种各样的问题。