YUV 图片按 Y、U、V 的顺序分开存储为三个通道的图片。每次发送一个通道的图片数据到 PL 端的 dram,网络加速器每次处理一个通道的图片,处理完成后返回中断信号以及该通道变换系数和熵参数的地址。PS 软件从该地址取回变换系数和熵参数,进行熵编码操作。
PS 端发送到 PL 端 DRAM 的每个通道图片数据需做如下处理:
- 先对输入图片按照奇偶行分块,奇数行块在前,偶数行块在后。如图 1 所示,X 为原始图片(Y / U / V),Xe 是奇数块,Xo 是偶数块。
- 奇数块 Xe 和偶数块 Xo 按 8x8 的数据块存储。如图 2 表示奇偶行分块后的 Xe 或者 Xo。按照图 2 所示,将其分割成若干个尺寸 8x8 的数据块。这些 8x8 的数据块按照从左到右,从上到下的顺序存储(如图红色数字标记的顺序)。每个 8x8 的数据块的数据也按照从左到右,从上到下的顺序存储。
- 把图片的像素点数据由 8bit 按照高位补 0 转成 16bit,16bit 数据在内存中的存放格式在第五部分说明。
先存放变换网络的权重参数,再存放熵模型的权重参数,权重参数按照卷积层顺序存放。
权重有两种:3X3 卷积核、3X1 卷积核。只向 PL DRAM 送 3x3 的卷积核权重。如图 3、4 所示,Wi,j表示一个 3x3 的卷积核,其输入通道 i,输出通道 j。
对于如图 2 输入通道为 1 的卷积层,权重排布顺序:先按从左到右、从上到下排布卷积核的 9 个数据,再排布输出通道,即 W1,1、W1,2......W1,16。
对于如图 4 输入通道为 16 的卷积层,权重排布顺序如图 5 所示:先按从左到右、从上到下排布卷积核的 9 个数据,再排布 2 个连续的输入通道,最后输出通道,即W1,1、W2,1、W1,2、W2,2......W1,16、W2,16、W3,1、W4,1、W3,2、W4,2......W3,16、W4,16
......W13,1、W14,1、W13,2、W14,2......W13,16、W14,16
、W15,1、W16,1、W15,2、W16,2......W15,16、W16,16 。
卷积核类型有两种:3X3 卷积核、1X1 卷积核。两种卷积核分开存放,先存放 3x3 卷积核,再存放 1x1 卷积核。每种卷积核按照卷积层的先后顺序存储。
对于 3X3 的卷积,当输入通道为 1 时,权重排布顺序:先按从左到右、从上到下排布卷积核的 9 个数据,再排布输出通道。当输入通道为 16 时,权重排布顺序:先按从左到右、从上到下排布卷积核的 9 个数据,再排布 2 个连续的输入通道,最后输出通道。
对于 1x1 卷积,顺序排布按照先输入通道,再输出通道。
不需要从 DRAM 搬运,以 coe 文件的形式随,写到 FPGA 的 bram 里。
PL 端返回中断后,ps 可以读取寄存器,获取变换系数和熵参数在 PL DRAM 存放的起始地址及数据量大小。
变换网络的推理结果,即变换系数包括如下图所示的 13 个子带,从变换系数起始地址开始,按 1 到 13 依次顺序存放十三个子带。
13 个子带的熵参数,也从熵参数起始地址开始,顺序存放。
PL 端处理的数据位宽为 16bit,DRAM 的每个地址单元可以存放 8bit。数据存储统一使用小端模式,数据的低 8 bit 放在内存的低地址端,高 8bit 存放在内存的高地址端。
- 输入图片:0x20000000
- 权重: 0x10000000
- 变换系数:0x40000000
- 熵参数: 0x41000000