1.一种基于FPGA的Tiny‑yolo卷积神经网络硬件加速方法,其特征在于,包括:
1)将Tiny‑yolo卷积神经网络的卷积层采取多个通道的数据并行输入的方法,步骤如下:
11)将Tiny‑yolo卷积神经网络的第一层卷积层(conv0)采取3个通道的数据并行输入,具体方法为:将Tiny‑yolo卷积神经网络的第一层卷积层(conv0)采取3个输入通道同时输入数据并同时进行卷积计算,将第一层卷积层(conv0)的3个输入通道输出的卷积输出值进行相加,直接得到最终的卷积输出值;
12)将Tiny‑yolo卷积神经网络的第二层卷积层至第九层卷积层(conv1‑8)采取多个通道的数据并行输入,具体方法为:
121)预设一个缓冲器out_buffer,用于缓存每次操作输出的卷积输出值;
122)将Tiny‑yolo卷积神经网络的第二层卷积层至第九层卷积层(conv1‑8)中每层卷积层采取每次同时输入多个通道的数据同时进行卷积计算,并将多个通道输出的卷积输出值相加就是每次操作输出的卷积输出值,进行第一次多通道的卷积计算后将第一次操作输出的卷积输出值缓存在缓冲器out_buffer中,继续进行下一次多通道的卷积计算,然后将该次操作输出的卷积输出值与缓存在缓冲器out_buffer中的卷积输出值进行相加后再缓存在缓冲器out_buffer中,重复上述操作过程直到最后一次多个通道进行卷积计算,将最后一次操作输出的卷积输出值与缓存在缓冲器out_buffer中的卷积输出值进行相加后即得到最终输出的卷积输出值;
Tiny‑yolo卷积神经网络的第二层卷积层至第九层卷积层(conv1‑8)中每层卷积层采用的缓冲器out_buffer的大小与该卷积层的输入尺寸一样;
2)对Tiny‑yolo卷积神经网络的第一层卷积层至第八层卷积层(conv0‑7)中每层卷积层的卷积计算进行并行处理,具体方法为:
21)预设3个行缓冲器,用于暂存读取的输入数据,3个行缓冲器依次为line_buf0、line_buf1、line_buf2,并预设两个寄存器组,用于分别缓存进行卷积计算的输入数据和卷积核权重,每个寄存器组由9个寄存器构成;
22)第一层卷积层至第八层卷积层(conv0‑7)中的每层卷积层在读取输入图片的过程中,采取按行逐个读取输入图片的输入数据,并将读取的输入数据依次暂存到预设的3个行缓冲器中,当3个行缓冲器的前3个位置的数据已经构成了一个3*3输入单元时,将3*3输入单元的数据送入寄存器组后进行卷积计算,输出卷积输出值,输出缓存输入数据的寄存器组与缓存卷积核权重的寄存器组进行乘加运算,通过优化指令将9次乘加运算展开并行处理,实现一个时钟周期完成一次卷积计算,最下面的行缓冲器line_buf2每读取一个输入数据,3*3输入单元就向右移动一位,直到读取到第三行的最后一个输入数据,就完成前三行的卷积计算;接着读入第四行的输入数据,将最上面的行缓冲器line_buf0移动到最下面,并将读取的输入图片第四行的输入数据依次存入最下面的行缓冲器line_buf0中,当3个行缓冲器的前3个位置的数据已经构成了一个3*3输入单元时,继续卷积计算,直到读取到第四行的最后一个输入数据,依次类推,最终可以完成对整张输入图片的卷积。
2.根据权利要求1所述的方法,其特征在于:步骤2)后还包括步骤3)将Tiny‑yolo卷积神经网络的池化操作对应嵌入卷积层,具体方法为:
31)当所述Tiny‑yolo卷积神经网络的卷积层的输出特征图尺寸为M*M时,预设一个行缓冲器pool_buf,行缓冲器pool_buf的长度为M/2;
32)池化操作在有卷积输出时就开始进行,卷积计算完成的同时也完成池化:在所述卷积层的每个输入通道的卷积计算过程中,当卷积输出第一行的第2个卷积输出值output_2时,将卷积输出第一行的第2个卷积输出值output_2与第1个卷积输出值output_1进行比较,选取其中较大值存入行缓冲器pool_buf的第一个位置,当卷积输出第一行的第4个卷积输出值output_4时,将卷积输出第一行的第4个卷积输出值output_4与第3个卷积输出值output_3进行比较,选取其中较大值存入行缓冲器pool_buf的第二个位置,依次类推,直到卷积输出第一行的第M个卷积输出值output_M时,行缓冲器pool_buf中已经存入了M/2个待比较值;然后等到卷积输出第二行的第2个卷积输出值output_(M+2)时,将卷积输出第二行的第2个卷积输出值output_(M+2)与第1个卷积输出值output_(M+1)进行比较,选取其中较大值与行缓冲器pool_buf中第一个位置缓存的数据进行比较,得到最大值即池化输出值后直接输出,并将行缓冲器pool_buf中第一个位置清空,依此类推,当输出M/2个池化输出值时,行缓冲器pool_buf里面已经全部清空,完成对前两行卷积输出的池化操作,当卷积输出第三行的卷积输出值时,重复卷积输出第一行的操作,将每相邻2个卷积输出值进行比较并选取其中较大值存入行缓冲器pool_buf,直到卷积输出第三行的第M个卷积输出值output_
3M时,M/2个待比较值又缓存在行缓冲器pool_buf里,然后等到卷积输出第四行的卷积输出值时,重复卷积输出第二行的操作,将每相邻2个卷积输出值进行比较并选取其中较大值后与行缓冲器pool_buf中对应位置缓存的待比较值进行比较,得到最大值即池化输出值后直接输出,并将行缓冲器pool_buf中对应位置清空,当再次输出M/2个池化输出值时,行缓冲器pool_buf里面已经全部清空,依此类推,直至完成整个卷积输出的特征图的池化操作。
3.根据权利要求1所述的方法,其特征在于:当需要对输入图片进行边界填补0时,对输入图片进行边界填补0的过程在IP核内部完成,边补0边进行卷积计算,对于输入数据的第一行、第一列、最后一行以及最后一列在卷积计算时,不需要从输入接口读取,而是直接读取常数0;在第一个时钟周期时将行缓冲器line_buf0全部填充0,将行缓冲器line_buf1的前后两端位置均填充0,将行缓冲器linebuffer2的前端位置填充0,假设补0之后的输入图片尺寸为N*N,则在第N个时钟周期时,行缓冲器line_buf0全部填充0,行缓冲器line_buf1填充(N‑2)个输入数据和2个0,行缓冲器linebuffer2填充一个0和一个输入数据,第(N+1)个时钟周期时,3个行缓冲器的前3个位置的数据构成了一个3*3输入单元,构成了第一个3*
3输入单元后每读取一个输入数据,3*3输入单元就向右移动一位,从读取到第1个可以进行卷积计算的3*3输入单元开始,即前3行的前3个输入数据,之后每读取一个输入数据便得到其对应的输入单元,直接进行卷积计算,每次卷积计算相当于9次乘加运算,并通过PIPELINE等优化指令将9次乘加运算展开同时处理,实现一个时钟周期完成一次卷积计算;
步骤21)中每个行缓冲器长度与补0后的输入图片宽度一样为N,每个位置存储2个字节的数据,将这三个行缓冲器声明为双端口RAM:RAM_2P_BRAM,可以在一个时钟周期内同时读写操作。
4.根据权利要求1所述的方法,其特征在于:步骤12)中将Tiny‑yolo卷积神经网络的第二层卷积层至第九层卷积层(conv1‑8)采取两个通道的数据并行输入,且在步骤122)中将Tiny‑yolo卷积神经网络的第二层卷积层至第九层卷积层(conv1‑8)中每层卷积层采取每次同时输入两个通道的数据同时进行卷积计算,两个通道输出的卷积输出值相加就是该次操作输出的卷积输出值,将第一次操作输出的卷积输出值缓存在缓冲器out_buffer中,继续进行下一个双通道的卷积计算,然后将该次操作输出的卷积输出值与缓存在缓冲器out_buffer中的卷积输出值进行相加后再缓存在缓冲器out_buffer中,重复上述操作过程直到最后两个通道进行卷积计算,将最后一次操作输出的卷积输出值与缓存在缓冲器out_buffer中的卷积输出值进行相加后即得到最终输出的卷积输出值。
5.根据权利要求1所述的方法,其特征在于:将Tiny‑yolo卷积神经网络进行预处理,包括将Tiny‑yolo卷积神经网络的每一层卷积层的权重、输入数据、输出数据进行量化,使每一层卷积层的权重、输入数据、输出数据均量化为2个字节的shortint类型整数,以及将Tiny‑yolo卷积神经网络最后的卷积层即需要以float类型数据形式体现的输出数据进行反量化,使Tiny‑yolo卷积神经网络最后的卷积层输出的数据反量化为4个字节的float类型数据。
6.根据权利要求5所述的方法,其特征在于:将Tiny‑yolo卷积神经网络的权重、输入数据、输出数据进行量化时采取的是最大量化,即将绝对值最大的数据作为量化基准;将绝对值最大的数据量化到255,计算量化系数,其他数据依次量化,每个数据由4个字节的float类型数据量化为2个字节的shortint类型整数,即是将float类型数据量化到[‑255,255]范围内;若该数据远离其他数据,为了量化均匀考虑将其舍弃,采用次绝对值最大的数据作为量化基准。
7.根据权利要求1所述的方法,其特征在于:各卷积层的全部计算均在IP核中完成;为Tiny‑yolo卷积神经网络的第一层卷积层(conv0)单独设计一个IP核ty0_kernel,为Tiny‑yolo卷积神经网络的第二层卷积层至第八层卷积层(conv1‑7)设计一个共同调用的IP核ty1_kernel,为Tiny‑yolo卷积神经网络的第九层卷积层(conv8)单独设计一个IP核ty2_kernel;3个IP核设计在FPGA内;
图片载入ZedBoard中,ARM CPU将图片以数据流的形式输入到FPGA中,并依次调用IP核ty0_kernel、IP核ty1_kernel、IP核ty2_kernel完成各层卷积层的计算,并为各层卷积层的计算所需的缓冲器分配存储资源;对Tiny‑yolo卷积神经网络的第九层卷积层(conv8)的卷积计算不需要进行卷积加速,每次卷积计算相当于一次乘积;
3个IP核一共用到了193个DSP48,156个BRAM,DSP48用于满足卷积计算并行处理时的计算开销,BRAM则是用于输入输出数据的缓存。
8.根据权利要求7所述的方法,其特征在于:IP核ty0_kernel采用3通道并行输入的方式,3个输入接口分别是input_r[416*416],input_g[416*416],input_b[416*416];接口大小为416*416,与输入图片的尺寸相同;每个卷积核的权重数据是weights0[3*3*3],卷积核对应的偏置bias使用float数据类型;由于将池化嵌入卷积过程,输出output0的大小是
208*208;
IP核ty1_kernel设计能满足各层输入输出大小的接口;第二层卷积层至第八层卷积层(conv1‑7)的输入大小分别是208*208*16,104*104*32,52*52*64,26*26*128,13*13*256,
13*13*512,13*13*512,其中最大是208*208*16,由于ty1_kernel采用双通道并行输入,输入接口分别是input1_0[208*208*8],input1_1[208*208*8];conv1‑7卷积核的大小分别是
16*3*3,32*3*3,64*3*3,128*3*3,256*3*3,512*3*3,512*3*3,其中最大是512*3*3,卷积核数据的接口是weights1[512*3*3];输出最大的是104*104,输出接口为output1[104*104];
通过定义变量width和channels满足各层的输入尺寸及通道数;
IP核ty2_kernel采用双通道并行输入的方式,conv8的输入大小为13*13*1024,输入接口分别是input2_0[13*13*512],input2_1[13*13*512];conv8的输出将直接用于检测,输出数据应是原始的float类型数据,输出接口定义为float类型,输出接口为output2[13*
13];与其他两个IP核不同之处在于卷积核尺寸从3*3变为1*1,卷积核数据的接口是weights2[1024*1*1];
输入输出接口声明为STREAM,读写都根据STREAM的方法。
9.一种基于FPGA的Tiny‑yolo卷积神经网络硬件加速系统,其特征在于:包括IP核,通过IP核来实现如权利要求1至6任一所述的方法,各卷积层的全部计算均在IP核中完成。
10.根据权利要求9所述的系统,其特征在于:为Tiny‑yolo卷积神经网络的第一层卷积层(conv0)单独设计一个IP核ty0_kernel,用于完成第一层卷积层(conv0)的全部计算;为Tiny‑yolo卷积神经网络的第二层卷积层至第八层卷积层(conv1‑7)设计一个共同调用的IP核ty1_kernel,用于完成第二层卷积层至第八层卷积层(conv1‑7)的全部计算;为Tiny‑yolo卷积神经网络的第九层卷积层(conv8)单独设计一个IP核ty2_kernel,用于完成第九层卷积层(conv8)的全部计算;3个IP核设计在FPGA内;ARM CPU将输入图片以数据流的形式输入到FPGA中,并依次调用IP核ty0_kernel、IP核ty1_kernel、IP核ty2_kernel完成各层卷积层的计算,并为各层卷积层的计算所需的缓冲器分配存储资源。