综合技术交流
直播中

ss

6年用户 8762经验值
擅长:电源/新能源 制造/封装 RF/无线
私信 关注
[经验]

PYNQ框架下如何快速完成3D数据重建

`  3D视觉数据与我们的生活已经密不可分,在无人机测绘、实时摄影测量、AR/VR等领域有许多应用。视频的实时处理需要大量的计算,而无人机等移动应用需要低功耗便携式设备。PYNQ平台提供了正确的工具来实现基于这些约束的三维重建的完整管道。
  在这个项目中,作者的目标是朝着实时生成3D视觉数据迈进一步。首先,在CPU上生成3D点云,然后使用Mesh Lab可视化它。由于Mesh Lab不适合实时3D可视化,作者创建了自己的3D到2D可视化算法。这对于视频输入来说足够快了,我们通过移动输出模型来证明这一点。接下来,在PYNQ-Z2板上重新创建这个管道。我们在立体图像上演示这个概念,然后对表演进行计时。对于作者定制的3D到2D投影算法,又设计了一个覆盖层来加速乘法累加(MAC)操作,然后通过Jupyter笔记本在PYNQ板上进行测试。未来将为视频输入设计自定义覆盖,以加速视差图和三维点云生成,这是本项目中计算量最大的任务。
   1.png
  1.摄像机校准
  用Python编写的OpenCV开源代码被用来校准这个项目中使用的摄像机。这个过程的目标是找到摄像机的固有参数,也称为摄像机矩阵。用于这个初始任务的输入图案图像是一个黑白棋盘图案,在水平方向和垂直方向分别由9个内角和6个内角组成。从不同角度拍摄了多幅这种图案的图像,并将其输入到摄像机校准算法中。下图说明了这种图案图像的示例。
  
  摄像机矩阵的输出,即焦距对(fx,fy)和主要点对(cx,cy)如下所示。
   3.png
  2.视差图
  在摄像机标定之后,视差图生成是设计流程中的下一步。视差图是在PYNQ板创建和计时,在CPU中进行验证的。最初的目标是从两个摄像机产生立体视觉。由于缺乏对立体摄像机的直接访问,一个解决办法是尝试生成伪立体视频。将输入的视频分成两部分,虚拟地创建立体视觉并生成视差图。虽然生成的地图不会非常精确,但这里的目的是评估3D构建算法如何在实时立体输入上工作。OpenCV内置的生成视差图的函数被用于加速管道的开发,在未来的工作中将使用压缩输入帧的方法或现有的3D云生成算法(visualfm、OpenMVS)等。有很多这样的工具可用,但它们是计算密集型的,只运行后期记录,而不是实时的,以验证对FPGA的需求。为了测试立体图像的质量,使用了芦荟的立体图像数据集。这个过程是在PYNQ板上计时的,它花了12.531396秒,所以这对于实时视频是不可行的。未来将设计一个自定义覆盖来解决这个问题。然而,视差图是在PYNQ板上生成,在PC上验证精度,如下图所示。
  3.3D点云
  3D点云是使用相关的内置OpenCV函数生成的。为了与下一节中实现的自定义方法进行比较,使用Mesh Lab可视化三维点云。从下图可以看出,渲染是准确的。使用PYNQ板生成3D点云耗时42.973997秒。这说明视差图和点云生成是三维模型实时生成的瓶颈。为这两个OpenCV函数创建一个覆盖层也是这个项目未来工作的一部分。
  4.3D到2D投影
  生成投影2D图像的方法首先从生成的3D密集点云开始。3D点云可以视为有关模型的所有必需信息。它包含位置信息;X、Y、Z坐标以及颜色信息;红色、绿色、蓝色强度。为了正确测试函数,首先生成一个简单的立方体,其中8个点代表对象上的每个角。这种结构随后被用于旋转和平移功能。立方体在所有3个轴上独立旋转,能够以所需的位置和颜色将所有点输出到屏幕。先前生成的三维密集点云提供了每个点的X、Y、Z坐标和RGB颜色,因此旋转和平移矩阵可以直接应用于此。对于当前的实现,决定使用单个输入帧,并将其旋转以查看一系列输出帧中的投影。这可以改变为一个输入图像流,即视频,其视图可以是恒定的,甚至可以是围绕它旋转的。转换完成后,最终输出帧保存到变量中。在生成输出帧时,完全可以直接查看输出帧,但在笔记本电脑上,结果将是大约3-5秒的新帧。
  笔记本电脑的结果是大约3-5秒的新帧。芦荟示例图像包含超过23万个要计算的单独点。使用一台带有i5处理器的笔记本电脑,在1轴上旋转然后投射大约需要102.5秒才能产生10个输出帧。在PYNQ处理器上运行时,速度明显较慢,因此必须对问题进行显著的重新调整。为此,问题大小将减少到2300点作为输入。这为进程的运行提供了一个可接受的时间框架,单个输出帧需要14.7秒。这种低性能有几个原因。
  没有为这个代码编写数据处理过程。这意味着数据是以线性方式为线路板获取的,而不是利用并行缓冲区。这可以解释为什么板处理器比使用DSP块更快。通信,即在板上CPU和FPGA之间传输的数据比实际的硬件加速要长。
  在3帧的并行运算中,只有3帧的乘法运算是完全相反的。这意味着所使用的27个块同时使用,但要完成一个单独的旋转和投影,则需要在每次计算中单独重用这些块。也只有对每个点单独进行处理,没有并行计算的点。
  以下是二维平面上旋转和投影模型的输出示例。
  PYNQ板上的实时3D建模是该项目背后的主要动机。我们意识到,在整个3D建模流程中有很多优化是可能的,但完全优化不在本项目的范围之内。然而,管道的不同部分采用了不同的改进方法。实验证明,PYNQ板的可移植性和并行计算能力使其成为实时3D建模的理想候选。作者们希望这将激励更多的开发人员致力于实际应用,如无人机绘图或GoPro用于移动摄影测量。Python平台使这类应用程序的原型化变得非常容易,而且PYNQ的未来充满了有趣的可能性。

` 2.png

更多回帖

发帖
×
20
完善资料,
赚取积分