基于 PYNQ 的散射成像相机 CC Cam 设计文档

陈欣玥 雷弈 刘可 

 

 

一、 设计概述 /Design Introduction

 

  本作品 CC Cam 基于计算光学的方法实现散射体成像,利用 PYNQ-Z2 制作了集成标定、摄像、重建算 法、人机交互于一体的小型系统。散射图像重建须首先在点光源标定过程获取点扩散函数,然后获取物体 的散射图像,再通过 ADMM 算法和 FISTA 算法对散射图像进行运算,迭代得到重建图像。在本系统中,PL 部分利用 HLS 设计了重建算法中计算量最大的梯度计算的 IP 核,该计算 IP 核提升了算法的并行度、实现 了计算加速的性能,同时视频流通路也在 PL 部分构建;PS 部分则负责交互界面、机械臂控制、预处理、 整体迭代等功能。透过散射介质成像在透过云雾进行遥感测绘、观察生物深层组织等方面有着应用前景, 同时无透镜的计算光学成像对相机突破透镜尺寸限制和分辨率限制有着革新意义。

 

二、 系统组成及功能说明 /System Construction & Function Description

 

  A.PYNQ 实现总体系统控制,图像重建算法,与控机械臂 51 单片机的串口通信。 PL 部分:负责实现图像还原算法的梯度计算部分,通过对点扩散函数与原始拍摄图像的频域及空间 域处理,得到梯度结果;负责摄像头驱动部分及 HDMI 显示驱动部分。 PS 部分:负责图像重建算法中除梯度计算以外的部分,与 51 单片机通信控制机械臂及人机交互界面 控制。

  B. 摄像头:由无透镜的 OV5640 及散射体组成,将图像信息回传 PYNQ 进行捕获及处理。

  C. 机械臂:夹持摄像头并调整摄像头姿态,控制方式有:(1)PC 在 Jupyter Notebook 界面通过滑动杆控 件调节六个舵机(2)PS 部分处理图像并自动调整舵机位置,使图像位于屏幕中央 (3)通过板卡上按动 按键对两个舵机进行粗调

  D. 显示屏:用 HDMI 线连接 PYNQ,使用 640*480@60Hz 的显示格式,呈现可视化的交互效果和展现摄 像、重建结果。

2.1 使用随机散射介质对 OV 摄像头模块改造

  拆除 OV5640 的镜头,将透明胶带与支撑材料固定在原镜头位置,作为散射体;散射体成像于图像传 感器,图像信息传至 PYNQ 的 PL 部分进行处理;手机闪光灯在 40cm 以外(近似于点光源)照射获取 PSF; 标定过程需要且仅需要进行一次;以梯度下降算法进行图像还原,得以还原夜晚场景或暗环境下的实物。

  本作品采用的散射体为日常生活中易获得的材料,为了获得更好的重建图像质量,我们在工作初期对 薄散射片材料的选取进行了多次试验。在我们试验对象中,双层紧紧粘贴的普通透明胶带的 PSF 图像纹路 过于密集,而中间留有气泡的双层粘贴的普通透明胶带则过于稀疏。最终,我们在一小片揉皱的透明塑料 袋表面粘贴上一层透明胶带,制成了现在使用的散射体,该散射体的 PSF 图像纹路疏密适中,对距离摄像 头 20 厘米开外、80 厘米以内的物体重建效果良好。

  在多次的试验中,我们发现 PSF 图像纹路与重建图像质量有如下关系:

  ① PSF 的图像纹路越随机,越像阳光直射下游泳池底部的水纹,重建图像质量越好;

  ② PSF 的图像纹路越密集,成像的视野越大,但放大倍数随之降低,重建图像清晰度也随之降低;

  ③ PSF 的图像纹路越稀疏,成像的视野越小,放大倍数也越大,细节也随之增加,但当纹路稀疏到 一定程度,拍摄对象过于有限。

  另一方面,散射介质的随机性可以从 PSF 图样的随机性表现,通过计算自相关[2](Autocorrelation), 二维计算结果越显现出冲激函数的模式则随机性越好。本设计在拍摄 PSF 后会自动进行自相关运算,辅助 使用者在更换散射材料时对散射材料的选择。如下图中(d)中央亮点更接近冲激的模式,是目前本设计使用 的 PSF 样式。注意随机性评判应在添加小孔之前进行,不应将小孔的裁剪(Crop)效果引入自相关计算。

2.2 ADMM 算法快速重建

  使用 ADMM(Alternating Direction Method of Multipliers)交替方向乘子算法进行散射图像的重建,是对 精度要求不高时的一种快速方案。基于[3]使用 ADMM 进行重建的方案,我们将这一快速重建的环节在 PS端通过运行 Python 脚本实现。尽管作为快速算法,同样迭代 1 次在 PC 上能够达到流畅的实时效果,在 PYNQ 的嵌入式级别处理器上则实时性稍差。因此设计了 3 帧缓存的结构,开辟分别负责捕捉预处理和 ADMM 重建的双线程进行运算,改善时延。

  与下一节阐述的速度较慢但能保证收敛、细节更丰富的梯度下降类算法相比,基于 ADMM 重建提供了 一种快速扫描的功能:让使用者可以先大致确定目标物的位置,并由屏幕上粗略的重建结果选取合适的拍 摄姿态,从而使目标物的散射光全部被图像传感器接收,这样有利于迭代收敛以及获取更清晰的重建图像。 相比于物点一一对应像点的传统相机,本设计提供 ADMM 快速重建功能是对使用者不能立即从原始散射 图像对应出重建结果这一缺点的一种补偿。

  经过 ADMM 的快速模式大致锁定目标位置后,下一阶段可以选择使用基于梯度下降法改进的 FISTA 迭 代算法进行更细节的重建,在这个耗时长的环节,本设计在 PL 端定制了硬件加速 IP。

2.3 FISTA 算法硬件加速

  首先将摄像头捕获的 RGB 图转至灰度图,经过尺缩、平滑、归一化等预处理后,通过 PSF、拍摄图像 和当前预测值计算梯度,梯度下降法多次迭代后预测值即重建后的图像。其中计算量最大的梯度计算由 HLS 设计的 IP 核在 PL 内实现,整体的迭代过程通过 Python 脚本在 PS 端运算。

  (1)FISTA 算法流程

  以下对重建过程进行进一步说明。

  空间中的发光物体可以看作多个点光源组成,真实影像以 v*表示;散射体光学系统对光线的作用可以 用矩阵 A 表示;在图像传感器上接收到的图像记为 b,对真值的预测值记为 v;那么真值 v*满足的解散射 体成像的物像方程如下:

  从散射图像求取真实场景是一个反问题(Inverse Problem),在未知散射体的详细物理参数时无法由 v 和 b 推断 v*的解析解,但是通过迭代法能让预测值 v 由初始值逐渐逼近真值 v*。于是,我们面对的是一个优 化问题,可以采用梯度下降算法去实现 v 对 v*的逼近,其中计算量最大、耗时最长的梯度计算如下:

  在图像空间域中进行大矩阵 A、v、 的矩阵乘法可以转化为在频域中点级的简单相乘,大大减少了 计算量。其中,由二维离散空间域向离散频域的转化 fft-2d 包括步骤:ifft-shift→fft-1d-row→fft-1dcolumn→result,频域向空间域的转化 ifft-2d 包括步骤:ifft-1d-row→ifft-1d-colum→fft-shift→result,单次 梯度计算的数据流如下所示:

  将上示梯度计算部分利用 Vivado HLS 设计,并将其封装为 IP,以计算硬核替代以 PS 上调用 Numpy 库 的计算方式,利用了 PYNQ 的 FPGA 资源。总体的迭代更新使用 FISTA 算法(FISTA, A fast iterative shrinkagethresholding algorithm)过程如下,下标 k 表示当前值,k+1 表示下一次的迭代值,v 表示图像预测值,x 与 t 均为辅助变量:

  迭代初值的选取可以是将预测图全部置为 PSF 图像的中值,也可以先使用快速的 ADMM 算法进行初 步运算后的结果。这里我们希望应用求解反问题中 Two Stage 的思想,选择了后者。迭代的终止目前是一 个预先设置的固定值,在使用 ADMM 结果作初值时约迭代 40 次能获取较好结果,否则需迭代约 60 次。

  FISTA 算法总体的计算过程如上已陈述完毕,在设计初期,我们先使用 Python 在 PC 上对计算过程进 行原理性的功能验证,然后再利用高级综合工具 Vivado HLS 进行算法硬件化的设计。

  (2)HLS 设计整体流程

  HLS 设计需要先进行 C 仿真(C Simulation)在逻辑上对硬件设计进行验证,此前有 Python 实现便于 抽取中间量、生成二进制测试文件输入 HLS、记录 log 文件等等进行对比分析,加快 HLS 逻辑层面的调 试。同时用 C 仿真进行逻辑功能验证时可以采用先浮点后定点的方式,来逐阶段分析:先使用与 Python 计算一样的浮点数 float (32bits)验证 HLS 设计是否忠实还原了计算的所有步骤,尤其是数组的寻址是否正 确;再用 FPGA 需要的定点数进行仿真,根据数据在每一阶段的数值范围,对数据分布采取必要平移、尺 缩、交换局部计算顺序等等数值分析中的常用策略来使关键的信息既不会因为过大而溢出、也不会因为 过小而产生严重精度损失。具体到本设计中,尤其需要反复尝试 fft 这个 ip 核的缩放策略、定点格式、相位因子的设置。

  在用 C 仿真确认 HLS 设计在逻辑上已经还原了算法之后,需进行 C 综合(C Synthesis),设计到 C 综合 阶段则需要考虑每一条代码对应的硬件模块、每一组循环对应的硬件行为、每个变量代表的具体端口类 型和存储形式。配合 HLS 中的硬件指令(Directive),对原代码书写进行调整,使之符合 ip 核需要的输入格 式、符合 SoC 中 AXI 总线的传输流、符合模块间的接口类型。具体到本设计,C 综合阶段主要需要解决 fft 这个 ip 核的输入接口为 FIFO 的问题,以及片上 BRAM 不足、使大矩阵存放在远距离的 DDR 时缓存设计的 问题。

  在通过 C 综合后,需要考虑提高计算并行度。如果不利用 FPGA 算法实现作为硬件设计的并行性,如 果不应用流格式而需要采用静态的存储格式,一般来说,Zynq SoC 中 HLS 设计的硬核结果尽管能够正确 完成计算,也会在计算速度上逊色纯 ARM 核主导的计算,毕竟后者有成熟的 CPU 架构和 Numpy 库两方 面的优化。例如本设计最初未有目的地并行优化时,计算时延是纯 PS 端计算的两倍。所以为了实现最初 硬件加速的目的,还需要用 HLS 中硬件优化指令来提高计算并行度、优化数据流水线、提升数据吞吐 量。此阶段常用的优化策略有:

  (a)对于不存在有变量同时读写的模块使用 dataflow,进行任务级流水,例如为 fft 核输送数据;

  (b)对于循环,常使用数组分割(Array Partition)-流水线(Pipeline)-循环展开(Unroll)三者结合的模式,来 优化访存密集型而非计算密集型的模块的吞吐量,例如各类 AXI 总线与缓存之间传输搬运数据的模块;

  (c)对于代码风格调整,需要并行执行不相关的两个循环时需要封装出两个函数,否则会理解为串行 时序,以及需要把模式稍微不同但应用的计算资源和时钟周期大致相同的计算组成一个模块,例如点乘 H 和点乘 H 共轭应该被用条件结构封装在一个模块,否则将理解为两个独立不相关的模块,从而浪费了分 时复用模块的机会。

  (3)举例两种计算模块

  下面以图示阐述主要的两种计算模块的设计方案。

  以行 fft 为例阐述为 fft 核输送待一维待运算数据和取走计算结果的过程。首先由于二维 fft 中列 fft 需 要等待行 fft 全部完毕后才能获得有效输入,所以总的二维 fft 操作对象只能保存全图,全图大小超出片上 BRAM 的空间,因此需要存在大容量但远距离的 DDR3 中。为了衔接以 AXI 总线连接 PL 的全图变量以及 FIFO 格式的一维 FFT 输入,中间需要增加一级 memory 形式的行缓存。取数据-fft-存数据的过程有明显的 数据流特征,因此将各小模块封装后用 dataflow 指令优化了任务间时延(Interval)。

  在 fft 核进行计算时,由于离散傅里叶变换中的累加性质,必须要在基 2-FFT 蝶形运算的各级进行缩 减,以行 512=2^9 个元素为例,缩减策略[5]0x18A 表示:1、2 级缩减 4 倍,3、4 即缩减 4 倍,5、6 级无缩 减,7、8 级缩减 4 倍,9 级缩减 2 倍。翻转 fft 核的方向配置后,即实现 ifft,ifft 同样具有缩减策略,但是此时数据的数值更小,因此行 ifft 应用的缩减策略是 0x141;列 fft 缩减策略为 0x14A,列 ifft 的缩减策略为 0x141。只要在与来自空间域的 b 作差之前达到总共 256*512=2^17 的缩减倍数(fft 与 ifft 之间与 H 只是乘 法运算),因为分阶段缩减,从开始 fft 到结束 ifft 之间的计算结果与 Numpy 库函数的计算不再相同,依然 能得到正确的计算结果的同时配合了定点数的数值范围要求、保护了计算精度。

  除了 fft 相关的模块,另一类模块包括频域内与 H 或 H 共轭矩阵相乘、空间域内与 b 作差,这里只取 与 H 矩阵点级相乘的模块阐述设计此类模块的方案。首先图像数据都从 DDR 通过 AXI 总线进入 PL,为预 测图的行向量和 H(PSF 的频域表示)的行向量分别设置缓存区存在 BRAM,两个缓存的存储都由数组分割 指令分出 8 个端口,采用的是 cyclic 划分模式;对数组分为 8 块使得乘法运算可以以 8 并行度实现,具体 是将循环的书写以 8 为因子划分出一个内层循环,再用 Unroll 指令对内层循环展开,这样就能被理解为 8 个乘法单元的并行执行,充分利用 FPAG 部分的 DSP 资源。同时遍历全部 512 的循环中,使用 pipeline 指 令使得对 8 个乘法单元的复用的时间间隔得到优化。

  (4)HLS 综合报告

2.4 串口通信控制机械臂

  本功能的添加是为了方便 PSF 的标定过程,而已有的机械臂代码中只有移动到指定位置的串口指令, 不能满足我们的需求。因此我们添加了四条串口指令,可以控制机械臂在当前位置的基础上实现前后左右 基本的姿态调整。根据 PSF 图像的特点结合 Python 强大的图像处理功能,我们在 PYNQ 的 PS 端采用中值 滤波、开闭运算、边缘检测等图像处理方法,从而获得图像中心位置;利用该位置通过串口进一步控制机 械臂的移动,最终使 PSF 图像近似位于屏幕中央,获得较好的 PSF 图像,这将方便后面的图像恢复过程。

2.5 人机交互

  有两种方式可以控制整个系统:

  (1) 通过 usb wifi(网卡型号 RT5370)可以进行远程访问,在 jupyter notebook 上运行交互式脚本, 可以逐块运行功能块、查看打印出的状态、使用网页控件对机械臂各关节进行调整,wifi 功能主要用于远 程监视和调试。

  (2) 在初始化完毕,显示屏上输出开始界面表示系统已准备好。以后的任务可以完全脱离 PC 执行,使 用者通过操作板卡上的按键 BTN[3:0]和拨动开关 SW[1:0]进行切换不同的功能。

2.6 Block Design

三、完成情况及性能参数 /Final Design & Performance Parameters

  系统实现的功能:

  机械臂可以自动调整姿态,使得图像位于显示屏中央;ADMM 快速重建在只迭代 1 次时帧率在 3 FPS 左右;FISTA 算法在迭代 50 次后能获得较好的重建图像,平均重建一张图片耗时约 36 秒(包含每隔 5 次迭代输出图像显示到屏幕),算法处理中单次计算梯度的时间为 0.39 秒,是纯 PS 端运行(0.80 秒)速度的两倍。系统目前 LUT 占用 84%,BRAM 占用 67%,DSP 占用 84%,FF 占用 48%。

 

四、总结与展望 / Summary and Prospect

 

  (1) 考虑到算法的易实现性、重建效果、PYNQ 计算资源,我们选择了运算速度较慢,重建效果较稳定的 FISTA 算法,假以更多时间尝试改进,对 ADMM 进行硬件加速可以真正做到实时重建的效果,应用于 只需获取位置以及大小的大范围扫描,例如使用近红外光进行活体的肿瘤检测就是一个面向小物体的 扩散方程问题。

   (2) 目前计算参与计算的图片都是灰度形式,可以对三个颜色通道分别进行运算来获取彩色图片的重建。 目前梯度计算硬核的速度受访存速度限制,需要进一步优化缓存设计、优化数据流水线。

  (3) 由于散射体材料的选取局限,图像还原效果还有待进一步优化,并且可以制作焦距不同的散射体实现 不同尺寸场景的重建。我们使用的光源是普通的生活照明光源,例如手机闪光灯等,一些面向实际散 射体成像应用的场景采用的是特殊光源,这可能更贴近应用实际。更进一步,散射成像的本质是对扩 散方程的求解,而这是诸多无损探伤的领域中的普遍问题,传感器读入的不一定是光子的强度,还可 以是热、声等物理量,按照这样的思路可以拓宽应用范围。

  (4) 对于数学物理方程反问题的迭代法求解中,对初值和迭代终止条件的设置是关键问题之一。目前本设 计使用快速算法 ADMM 的少量迭代作为 FISTA 初值,依然是两种迭代法的叠加,尚未引入严格意义上 的非迭代计算,而数学方面关于非迭代法计算扩散方程已有数量可观的研究,这是初值设置方面可以 考虑改进的地方。关于迭代终止条件,目前本设计中使用的是设置一个固定值,但我们实验发现不同物体需要的迭代次数是不一样的,并且梯度下降法的“振荡”问题会在迭代次数过大时显现,清晰的 重建图片再次发散,因此需要对设置一种迭代终止的判断方法。

参考文献

[1] N. Antipa, G. Kuo, R. Heckel, B. Mildenhall, E. Bostan, R. Ng, and L. Waller, "DiffuserCam: lensless singleexposure 3D imaging," Optica 5, 1-9 (2018).

[2] Laura Waller - Computational Imaging Lab. https://waller-lab.github.io/DiffuserCam/tutorial/building_guide.pdf .3-4

[3] Laura Waller - Computational Imaging Lab. https://waller-lab.github.io/DiffuserCam/tutorial/algorithm_guide.pdf .5-9

[4] Xilinx. http://www.xilinx.com/support/documentation/sw_manuals/xilinx2017_4/ug902-vivado-high-levelsynthesis.pdf. 132-154

[5] FFT Xilinx Logicore. http://www.xilinx.com/support/documentation/ip_documentation/xfft/v9_0/pg109- xfft.pdf. 24, 31, 32

[6] Ting Liu,” Mapping Large 2D FFTs onto FPGAs using High Level Synthesis” Master Thesis,27-32

 

Github链接:

https://github.com/Springbone/CC-Cam

 

发布时间:2020-02-03 10:01
浏览量:0
点赞
收藏
首页    Catalog    Featured    基于 PYNQ 的散射成像相机 CC Cam 设计文档