用于卷积神经网络硬件加速的数据处理方法与流程

文档序号:15934201发布日期:2018-11-14 02:07阅读:406来源:国知局

本发明涉及卷积神经网络硬件加速技术领域,特别涉及一种用于卷积神经网络硬件加速的数据处理方法。

背景技术

卷积神经网络(convolutionneuralnetwork,cnn)在计算机视觉领域应用广泛,尤其是在目标检测和图像识别等方面体现出了良好的应用前景。边缘计算是一种全新的计算模式,其概念是在靠近数据中心的边缘地带直接对数据进行处理,而不用传回服务器处理。在目标检测中使用边缘计算能够带来一系列好处:直接在采集端的硬件设备上处理图像,不需要传回上位机,节省数据传输的时间、减少数据传输的开销。通过优化加速卷积神经网络,实现在硬件设备上的高效处理具有重要的实际意义。

现有的fpga加速方案大致如下:①使用一个嵌入式处理器和消息传递接口来控制运算单元之间的数据传输和计算流程来加速限制波兹曼机算法,之后针对波兹曼机提出了环状fpga加速,使用易扩展的环状fpga来并行处理部分神经元计算以达到加速整个算法的目标。②通过优化卷积神经网络算法,压缩结点与权值数据的位宽,设计并实现针对预测过程的fpga加速器。③使用低秩矩阵分解的方式来加速线性卷积的计算,在此基础上,通过稀疏约束的方法进一步加速线性卷积计算。还可以通过在gpu环境中使用最简单的基-2fft算法实现线性卷积的加速。

tiny-yolo是一种基于端到端的目标检测框架,将目标检测问题转换成回归问题,利用整个网络同时完成目标分类和目标定位。从实验效果来看,tiny-yolo网络不仅检测速度远远快于其它目标检测网络,而且在检测精度方面也表现良好。但是为了让其能更好的工作于嵌入式硬件设备上,还需要结合硬件特点对算法进行进一步的优化。

未经加速的tiny-yolo卷积神经网络的数据处理过程具有如下缺点:

1:tiny-yolo卷积神经网络各层的输入输出和网络权重均是浮点数据,在进行卷积计算、数据缓存和数据传输的时候,浮点数据会占用硬件平台大量的存储资源。

2:tiny-yolo卷积神经网络采用的是单通道输入方式,逐个输入每个通道的数据,大大限制了网络的处理速度。

3:tiny-yolo卷积神经网络的卷积计算是串行执行,这种计算方式导致卷积计算速度很慢,降低了网络的处理速度。

4:tiny-yolo卷积神经网络在检测过程中,池化操作需要在卷积操作完成之后进行,两者之间存在较大的数据传输开销。



技术实现要素:

本发明的目的是针对现有技术对应的不足,提供一种用于卷积神经网络硬件加速的数据处理方法,其大大提高了tiny-yolo卷积神经网络的检测速度。

本发明的目的是采用下述方案实现的:一种用于卷积神经网络硬件加速的数据处理方法,将卷积神经网络的池化操作对应嵌入卷积计算,包括如下步骤:

1)当卷积神经网络的卷积层的输出特征图尺寸为m*m时,预设一个行缓冲器pool_buf,行缓冲器pool_buf的长度为m/2;

2)池化操作在有卷积输出时就开始进行,卷积计算完成的同时也完成池化:在所述卷积层的每个输入通道的卷积计算过程中,当卷积输出第一行的第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中第一个位置缓存的数据进行比较,得到最大值即池化输出值后直接输出(得到的最大值即池化输出值就是2*2单元的池化输出,每个2*2单元的最大值即池化输出值是直接输出),并将行缓冲器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里面已经全部清空,依此类推,直至完成整个卷积输出的特征图的池化操作。池化的步进是2,卷积输出的特征图每行的第1个卷积输出值与第2个卷积输出值进行比较后,就是第3个卷积输出值与第4个卷积输出值进行比较。

优选地,本发明还包括将卷积神经网络的卷积层采取多个通道的数据并行输入的方法,当卷积神经网络为tiny-yolo卷积神经网络时,步骤包括:

1)将tiny-yolo卷积神经网络的卷积层conv0采取3个通道的数据并行输入,具体方法为:将tiny-yolo卷积神经网络的卷积层conv0采取3个输入通道同时输入数据并同时进行卷积计算,将卷积层conv0的3个输入通道输出的卷积输出值进行相加,直接得到最终的卷积输出值;

2)将tiny-yolo卷积神经网络的卷积层conv1-8采取多个通道的数据并行输入,具体方法为:

21)预设一个缓冲器out_buffer,用于缓存每次操作输出的卷积输出值;

22)将tiny-yolo卷积神经网络的卷积层conv1-8中每个卷积层采取每次同时输入多个通道的数据同时进行卷积计算,并将多个通道输出的卷积输出值相加就是每次操作输出的卷积输出值,进行第一次多通道的卷积计算后将第一次操作输出的卷积输出值缓存在缓冲器out_buffer中,继续进行下一次多通道的卷积计算,然后将该次操作输出的卷积输出值与缓存在缓冲器out_buffer中的卷积输出值进行相加后再缓存在缓冲器out_buffer中,重复上述操作过程直到最后一次多个通道进行卷积计算,将最后一次操作输出的卷积输出值与缓存在缓冲器out_buffer中的卷积输出值进行相加后即得到最终输出的卷积输出值;

tiny-yolo卷积神经网络的卷积层conv1-8中每个卷积层采用的缓冲器out_buffer的大小与该卷积层的输入尺寸一样。

步骤2)中将tiny-yolo卷积神经网络的卷积层conv1-8采取两个通道的数据并行输入,且在步骤122)中将tiny-yolo卷积神经网络的卷积层conv1-8中每个卷积层采取每次同时输入两个通道的数据同时进行卷积计算,两个通道输出的卷积输出值相加就是该次操作输出的卷积输出值,将第一次操作输出的卷积输出值缓存在缓冲器out_buffer中,继续进行下一个双通道的卷积计算,然后将该次操作输出的卷积输出值与缓存在缓冲器out_buffer中的卷积输出值进行相加后再缓存在缓冲器out_buffer中,重复上述操作过程直到最后两个通道进行卷积计算,将最后一次操作输出的卷积输出值与缓存在缓冲器out_buffer中的卷积输出值进行相加后即得到最终输出的卷积输出值。

优选地,本发明还包括将卷积层采取卷积并行计算的方法,当卷积神经网络为tiny-yolo卷积神经网络时,对tiny-yolo卷积神经网络的卷积层conv0-7中每个卷积层的卷积计算进行并行处理的步骤,包括:

1)预设3个行缓冲器,用于暂存读取的输入数据,3个行缓冲器依次为line_buf0、line_buf1、line_buf2,并预设两个寄存器组,用于分别缓存进行卷积计算的输入数据和卷积核权重,每个寄存器组由9个寄存器构成;

2)对卷积层conv0-7中每个卷积层的输入图片进行边界填补0,卷积层conv0-7中的每个卷积层在读取输入图片的过程中,采取按行逐个读取输入图片的输入数据,并将读取的输入数据依次暂存到预设的3个行缓冲器中,当3个行缓冲器的前3个位置的数据已经构成了一个3*3输入单元时,将3*3输入单元的数据送入寄存器组后进行卷积计算,输出卷积输出值,输出缓存输入数据的寄存器组与缓存卷积核权重的寄存器组进行乘加运算,通过优化指令将9次乘加运算展开并行处理,实现一个时钟周期完成一次卷积计算,最下面的行缓冲器line_buf2每读取一个输入数据,3*3输入单元就向右移动一位,直到读取到第三行的最后一个输入数据,就完成前三行的卷积计算;接着读入第四行的输入数据,将最上面的行缓冲器line_buf0移动到最下面,并将读取的输入图片第四行的输入数据依次存入最下面的行缓冲器line_buf0中,当3个行缓冲器的前3个位置的数据已经构成了一个3*3输入单元时,继续卷积计算,直到读取到第四行的最后一个输入数据,依次类推,最终可以完成对整张输入图片的卷积。每次检测结束后缓冲器out_buffer要清零,下一次检测图片又会缓存新的数据。

假设当输入是416*416,输出是416*416,卷积核大小为3*3,所以输入要经过填零为418*418。由于如果先对图片进行补0,然后输入到ip核中,会额外增加传输的数据量,增加传输时间,因此本发明优选地,对输入图片进行边界填补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次乘加运算展开同时处理,实现一个时钟周期完成一次卷积计算。每次卷积计算后寄存器要清零;步骤1)中每个行缓冲器长度与补0后的输入图片宽度一样为n,每个位置存储2个字节的数据,将这三个行缓冲器声明为双端口ram:ram_2p_bram,可以在一个时钟周期内同时读写操作。

各卷积层的全部计算均在ip核中完成;为tiny-yolo卷积神经网络的卷积层conv0单独设计一个ip核ty0_kernel,为tiny-yolo卷积神经网络的卷积层conv1-7设计一个共同调用的ip核ty1_kernel,为tiny-yolo卷积神经网络的卷积层conv8单独设计一个ip核ty2_kernel;3个ip核设计在fpga内;

图片载入zedboard中,armcpu将图片以数据流的形式输入到fpga中,并依次调用ip核ty0_kernel、ip核ty1_kernel、ip核ty2_kernel完成各个卷积层的计算,并为各个卷积层的计算所需的缓冲器分配存储资源;对tiny-yolo卷积神经网络的卷积层conv8的卷积计算不需要进行卷积加速,每次卷积计算相当于一次乘积。卷积核为1*1,不用填零,其卷积计算就是乘积运算,一一对应,不要考虑上述的卷积计算加速方法,它用不上,在计算上不考虑加速conv8。

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的方法。

将卷积神经网络进行预处理,包括将卷积神经网络的每一个卷积层的权重、输入数据、输出数据进行量化,使每一个卷积层的权重、输入数据、输出数据均量化为2个字节的shortint类型整数,以及将卷积神经网络最后的卷积层即需要以float类型数据形式体现的输出数据进行反量化,使卷积神经网络最后的卷积层输出的数据反量化为4个字节的float类型数据。

将卷积神经网络的权重、输入数据、输出数据进行量化时采取的是最大量化,即将绝对值最大的数据作为量化基准;将绝对值最大的数据量化到255,计算量化系数,其他数据依次量化,每个数据由4个字节的float类型数据量化为2个字节的shortint类型整数,即是将float类型数据量化到[-255,255]范围内;若该数据远离其他数据,为了量化均匀考虑将其舍弃,采用次绝对值最大的数据作为量化基准。

3个ip核一共用到了193个dsp48,156个bram,dsp48用于满足卷积计算并行处理时的计算开销,bram则是用于输入输出数据的缓存。

tiny-yolo卷积神经网络经过硬件加速,各卷积层的全部计算均在ip核中完成。算法实现就是通过ip核来实现各步骤提出的加速算法,并为加速算法所需的缓冲器分配存储资源。

本发明具有的优点是:

(1)对输入输出数据和网络权重进行了量化。神经网络各层的输入输出和网络权重都是浮点类型的数据,整个网络的计算集中在卷积过程,卷积计算是一个乘加过程,如果将数据的传输和计算映射到硬件上,则浮点类型数据会占用大量的存储资源(比如bram)、消耗大量的计算资源(比如,dsp48)。基于zedboard硬件资源考虑,将float数据类型量化为short数据类型。同时,为了确保检测目标的准确性,在最后的输出层进行数据的反量化。数据量化既节省了资源,又提高了运算速度。

(2)优化了tiny-yolo网络的数据输入方式。整个网络各卷积层的输入通道数较多,使用单通道输入方式大大限制了网络的速度,通过优化输入方式,将单通道输入的方式改进为多通道输入,可以提升网络的处理速度。

(3)优化了tiny-yolo网络的卷积计算方法。卷积层是卷积神经网络的核心,但由于卷积层的卷积运算很耗时,几乎占用了网络的全部运算时间。因此通过优化卷积神经网络在硬件中的卷积计算方式,来加快整个网络的卷积计算速度。

(4)优化了tiny-yolo网络的池化计算方法。卷积计算之后,需要对数据进行池化。池化处理的好处就是减少特征和参数,并且可以保持某种不变性(比如旋转、平移、伸缩等)。神经网络通常的计算方式是完成卷积操作之后,再进行池化操作,这种情况下会造成池化计算的延后。优化后的tiny-yolo网络采用的是边卷积边池化的方式,大大节省了卷积操作和池化操作之间的数据传输时间。

附图说明

图1为本发明的用于卷积神经网络硬件加速的数据处理方法的系统结构图;

图2为本发明的用于卷积神经网络硬件加速的数据处理方法的总设计流程图;

图3为本发明的tiny-yolo卷积神经网络的卷积层conv0的卷积过程示意图;

图4为本发明的tiny-yolo卷积神经网络的卷积层conv1的卷积过程示意图;

图5为本发明的tiny-yolo卷积神经网络的卷积计算加速原理示意图;

图6为本发明的tiny-yolo卷积神经网络的池化嵌入原理示意图;

图7为本发明的量化前后tiny-yolo卷积神经网络的卷积层conv0-8的权重分布示意图;

图8本发明的tiny-yolo卷积神经网络的整个量化与反量化的过程示意图;

图9为ip核ty0_kernel的资源消耗表示意图;

图10为ip核ty1_kernel的资源消耗表示意图;

图11为ip核ty2_kernel的资源消耗表示意图:

图12为实施例一的原始版本tiny-yolo网络检测结果示意图:

图13为实施例一的加速优化后的tiny-yolo网络检测结果示意图:

图14为实施例二的原始tiny-yolo网络检测结果示意图;

图15为实施例二的加速优化后的tiny-yolo网络检测结果示意图。

具体实施方式

本发明以tiny-yolo网络作为实施例进行分析,本发明通过分析tiny-yolo网络并行特征,结合硬件(zedboard)的并行处理能力,从输入方式、卷积计算、池化嵌入3个方面对tiny-yolo卷积神经网络进行硬件加速。使用hls工具在fpga上设计相应的ip核实现加速算法,实现基于fpga+arm双架构的zedborad测试的tiny-yolo卷积神经网络加速。

参见图1至图6,一种用于卷积神经网络硬件加速的数据处理方法,包括将池化操作嵌入卷积层。优选地,还包括将卷积层采取多通道并行输入。优选地,还包括将卷积层采取卷积并行计算。优选地,对卷积神经网络的各卷积层进行权重量化以及输入输出量化以及输出与反量化来完成网络预处理。可以在上述各个硬件加速改进方案中按需要选择其中之一的改进(改进的部分按本发明的改进方案执行,其余不作改进部分按现有方法执行)来实现数据处理,也可以自由组合各个硬件加速改进方案(改进的部分按本发明的改进方案执行,其余不作改进部分按现有方法执行)来实现数据处理。上述各个硬件加速改进方案的具体描述如下所述:

基于zedboard硬件资源,本实施例的tiny-yolo卷积神经网络的卷积层conv1-8采用了双通道输入的方式,在其他的硬件平台上,由于资源的不同,可以增加同时输入的通道数,其本质都是多通道并行输入,都属于通过改进输入方式来加速网络。

tiny-yolo网络具有卷积层conv0至conv8,前六层卷积层conv0-5后分别有池化层,卷积层conv8后还有两个全连接层。本发明的卷积层conv0至conv8的输入通道数依次是3、16、32、64、128、256、512、1024和1024。结合硬件资源,考虑同时输入2个通道的数据,单通道的输出特征图是由各个输入通道对应的卷积输出值相加得到的,若不能同时处理所有的输入通道的数据,则需要一个缓冲器来缓存卷积过程中的卷积输出值,直到最后一个输入通道数据的处理完成,得到该卷积核最终的输出特征图。

conv0的输入数据就是输入图片,图片尺寸为416*416且有rgb三通道,若不能及时处理就要进行缓存,设置的缓冲器大小也必须为416*416,字节数很大,消耗的bram较多。考虑到conv0的输入通道数较少,将图片3个通道的数据同时输入,各输入通道对应的卷积输出值同时得到并相加,直接得到最终的输出数据,不需要对conv0设置缓存,虽然额外消耗了一定的计算资源,但是对比节省的大量存储资源,是可以接受的。

conv0采取3通道并行输入的方法,其单个卷积核的卷积过程如图3所示。从图3可知,conv0的3个输入通道的数据同时输入,与单个卷积核的3个维度分别进行卷积,输出的卷积输出值相加,得到最终的卷积输出值。conv0的卷积过程中,因各输入通道同时进行卷积计算,输出的卷积输出值同时相加,直接得到最终的卷积输出值,不需要缓冲器缓存各通道对应的输出数据。单通道输出的是尺寸为416*416的特征图,与输入图片的尺寸一致。通过3通道并行输入的处理,conv0的处理速度提升了3倍。

conv1-8的输入通道数过多,不能直接采用所有通道的数据并行输入的方法。分析硬件计算资源,conv1-8使用将2个通道的数据并行输入的方法,每次同时输入两个通道的数据一起进行卷积。由于不能及时处理各输入通道对应的输出卷积输出值,必须要使用缓冲器来进行缓存,直到所有输入通道的数据处理完成。由于conv1-8的输入尺寸比conv0小很多,所以可以进行缓存。

(1)通过卷积层采取多通道并行输入提升tiny-yolo网络的处理速度。

从输入方式方面对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的大小与该卷积层的输入尺寸一样。

本实施例的步骤12)中将tiny-yolo卷积神经网络的卷积层conv1-8采取两个通道的数据并行输入,且在步骤122)中将tiny-yolo卷积神经网络的卷积层conv1-8中每个卷积层采取每次同时输入两个通道的数据同时进行卷积计算,两个通道输出的卷积输出值相加就是该次操作输出的卷积输出值,将第一次操作输出的卷积输出值缓存在缓冲器out_buffer中,继续进行下一个双通道的卷积计算,然后将该次操作输出的卷积输出值与缓存在缓冲器out_buffer中的卷积输出值进行相加后再缓存在缓冲器out_buffer中,重复上述操作过程直到最后两个通道进行卷积计算,将最后一次操作输出的卷积输出值与缓存在缓冲器out_buffer中的卷积输出值进行相加后即得到最终输出的卷积输出值。

本实施例以conv1为例,其单个卷积核的卷积过程如图4所示。conv1采用的双通道的数据同时输入,即一次操作对应2个通道的数据的卷积计算,2通道对应的输出卷积输出值相加就是该次操作输出的卷积输出值。由于不能及时处理卷积过程中输出的卷积输出值,必须设计一个缓冲器out_buffer缓存每次操作输出的卷积输出值,缓冲器的大小和conv1的输入尺寸一样为208*208。如图4,将输入数据的16个输入通道以每次2通道的方式输入ip核,每次进行的是双通道的卷积计算,将2个通道输出的卷积输出值相加,然后缓存在缓冲器out_buffer中,在进行下一个双通道的卷积计算时,继续使用out_buffer,对缓冲器中相应位置的数据进行相加,重复上述过程直到最后两个通道进行卷积计算,缓冲器中每个位置的数据就是最终输出的卷积输出值。双通道并行输入可以提升conv1-8的2倍的处理速度。

输入数据以串行数据流的方式进入ip核,一个时钟周期只能且必须读取和写入一次,加速设计中数据都是按照数据流的方式输入或输出,这样做的优势就是节省硬件资源,但同时提升了编程复杂度。输入数据以数据流的方式按行逐个进入ip核,在进行卷积计算时,就需要在ip核内部逐个提取数据,然后进行计算。通过对卷积计算并行处理来缩短计算时间,优化tiny-yolo网络的处理速度。本发明对卷积计算优化加速的目标是尽量在一个时钟周期完成一次卷积计算。

卷积并行计算的思路如下:从读取到第1个可以进行卷积计算的3*3输入单元开始,即前3行的前3个输入数据,之后每读取一个输入数据便得到其对应的输入单元,直接进行卷积计算,每次卷积计算相当于9次乘加运算,并通过pipeline等优化指令将9次乘加运算展开同时处理,实现一个时钟周期完成一次卷积计算。

通过卷积层的卷积并行计算提升tiny-yolo网络卷积计算的速度。

从输入通道的卷积计算方面对tiny-yolo卷积神经网络进行硬件加速:

2)对tiny-yolo卷积神经网络的卷积层conv0-7中每个卷积层的卷积计算进行并行处理,具体方法为:

21)预设3个行缓冲器,用于暂存读取的输入数据,3个行缓冲器依次为line_buf0、line_buf1、line_buf2,并预设两个寄存器组,用于分别缓存进行卷积计算的输入数据和卷积核权重,每个寄存器组由9个寄存器构成;

22)对卷积层conv0-7中每个卷积层的输入图片进行边界填补0,且卷积层conv0-7中的每个卷积层在读取输入图片的过程中,采取按行逐个读取输入图片的输入数据,并将读取的输入数据依次暂存到预设的3个行缓冲器中,当3个行缓冲器的前3个位置的数据已经构成了一个3*3输入单元时,将3*3输入单元的数据送入寄存器组后进行卷积计算,输出卷积输出值,输出缓存输入数据的寄存器组与缓存卷积核权重的寄存器组进行乘加运算,通过优化指令将9次乘加运算展开并行处理,实现一个时钟周期完成一次卷积计算,最下面的行缓冲器line_buf2每读取一个输入数据,3*3输入单元就向右移动一位,直到读取到第三行的最后一个输入数据,就完成前三行的卷积计算;接着读入第四行的输入数据,将最上面的行缓冲器line_buf0移动到最下面,并将读取的输入图片第四行的输入数据依次存入最下面的行缓冲器line_buf0中,当3个行缓冲器的前3个位置的数据已经构成了一个3*3输入单元时,继续卷积计算,直到读取到第四行的最后一个输入数据,依次类推,最终可以完成对整张输入图片的卷积。每次检测结束后缓冲器out_buffer要清零,下一次检测图片又会缓存新的数据。

对tiny-yolo卷积神经网络的卷积层conv8的每个输入通道的卷积计算不需要进行卷积加速,每次卷积计算相当于一次乘积,卷积层conv8的卷积核为1*1,不用填零,其卷积计算就是乘积运算,一一对应,不要考虑上述的卷积计算加速方法,它用不上,在计算上不考虑加速conv8。

本实施例以conv0的单个输入通道为例,其卷积计算的加速原理如图5所示。如果先对图片进行补0,然后输入到ip核中(在tiny-yolo的darknet框架下通过指令读取图片进行检测),会额外增加传输的数据量,增加传输时间,因此将补0的过程转移到ip核内部完成,边补边进行卷积计算。输入数据的第一行、第一列、最后一行以及最后一列全是0元素,在卷积计算时,不需要从输入接口读取,而是直接读取常数0。补0之后的输入图片尺寸为418*418,设计的3个行缓冲器依次为line_buf0、line_buf1、line_buf2,其长度与图片宽度一样为418,将这三个行缓冲器声明为双端口ram:ram_2p_bram,可以在一个时钟周期内同时读写操作。ip核读取的输入数据依次暂存到行缓冲器,在前418个时钟周期内,line_buf0全部填充0,line_buf1填充416个输入数据和2个0,linebuffer2填充一个0和一个输入数据;从第419个时钟周期开始,每一个时钟周期进行一次卷积计算。此时3个行缓冲器前3个位置的数据已经构成了一个3*3输入单元,每个输入通道分别为输入数据和卷积核权重各设计一个寄存器组,每个寄存器组由9个寄存器构成,将3*3输入单元的数据送入寄存器组后就可以进行卷积计算,缓存输入数据的寄存器组与缓存卷积核权重的寄存器组进行乘加运算,通过优化指令将9次乘加运算展开同时处理。

line_buf2每读取一个输入,3*3输入单元就向右移动一位。直到读取到第三行的最后一个数据,就完成前三行的卷积计算。接着读入第四行的输入数据,然后将第四行的数据存入line_buf0,并将line_buf0移动到line_buf2的后面,继续卷积计算,重复前面的过程,最终可以完成对整张图片的卷积。如果不进行加速,理论上conv0的串行执行所需时钟周期是418*418*9,而使用pipeline加速后所需时钟周期是417*417,速度提升约9倍。

conv0-7的卷积核尺寸都是3*3,通过卷积计算并行处理的方法可以优化卷积计算速度,速度提升约9倍。conv8的卷积核尺寸为1*1,每次卷积计算相当于一次乘积,不需要进行卷积加速。tiny-yolo网络运行过程中绝大部分时间都是在进行卷积计算,而且conv8的计算量占比很小,可以认为卷积计算的并行加速方法提升了tiny-yolo网络9倍的速度。

池化是对卷积输出的特征图进行子采样的操作,目的是进行二次特征提取,在不损失较多信息的基础上压缩特征图。tiny-yolo卷积神经网络中conv0至conv5层后都有一个池化层,卷积层和池化层进行数据传输需要一定的传输时间和资源开销。使用将池化层嵌入卷积层的方法,对tiny-yolo网络的处理速度做进一步优化,在卷积计算的过程中进行池化,同时完成卷积和池化,最终输出的是经过池化后的特征图。而且将池化层嵌入卷积层在设计ip核的时候更加方便,只需要设计一个合并的卷积池化核即可。

(3)通过池化嵌入卷积减少tiny-yolo网络的池化过程时间。

将tiny-yolo卷积神经网络的卷积层后面的池化层嵌入所述卷积层,包括将tiny-yolo卷积神经网络的卷积层conv0后的池化层maxpool0嵌入卷积层conv0,卷积层conv1后的池化层maxpool1嵌入卷积层conv1,卷积层conv2后的池化层maxpool2嵌入卷积层conv2,卷积层conv3后的池化层maxpool3嵌入卷积层conv3,卷积层conv4后的池化层maxpool4嵌入卷积层conv4,卷积层conv5后的池化层maxpool5嵌入卷积层conv5,具体方法为:

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里面已经全部清空,依此类推,当卷积输出第m行的第m个卷积输出值output_m*m时,将卷积输出第m行的第m个卷积输出值output_m*m与第(m-1)个卷积输出值output_(m*m-1)进行比较,选取其中较大值与行缓冲器pool_buf中第m/2个位置缓存的数据进行比较,得到最大值即池化输出值后直接输出,直至完成整个卷积输出的特征图的池化操作。池化的步进是2,卷积输出的特征图每行的第1个卷积输出值与第2个卷积输出值进行比较后,就是第3个卷积输出值与第4个卷积输出值进行比较。

本实施例以conv0和maxpool0为例,池化嵌入到卷积层的原理如图6所示。conv0的输出特征图尺寸是416*416,使用一个长度为208的行缓冲器pool_buf。首先,卷积输出第二个值output_2时比较第一个输出值output_1与output_2,选取其中较大值存入行缓冲器,依次类推,每相邻2个输出值进行比较并选取其中较大值存入行缓冲器,直到第416个输出值,行缓冲器中已经存入了208个数据;然后等到卷积输出第418个输出值,就选取output_417和output_418中较大值与行缓冲器中缓存的output_1和output_2中较大值进行比较,得到最大值。当卷积得到第832个输出值时,通过上述操作,已经完成对前两行卷积输出的池化操作,得到了208个池化输出数据。重复上述过程,当卷积输出最后一个数据时,卷积输出的特征图的池化操作也相应完成。

参见图7和图8,将tiny-yolo卷积神经网络进行预处理,将tiny-yolo卷积神经网络进行预处理,包括将tiny-yolo卷积神经网络的每一个卷积层的权重、输入数据、输出数据进行量化,使每一个卷积层的权重、输入数据、输出数据均量化为2个字节的shortint类型整数,以及将tiny-yolo卷积神经网络最后的卷积层即需要以float类型数据形式体现的输出数据进行反量化,使tiny-yolo卷积神经网络最后的卷积层输出的数据反量化为4个字节的float类型数据。

将tiny-yolo卷积神经网络的权重、输入数据、输出数据进行量化时采取的是最大量化,即将绝对值最大的数据作为量化基准;将绝对值最大的数据量化到255,计算量化系数,其他数据依次量化,每个数据由4个字节的float类型数据量化为2个字节的shortint类型整数,即是将float类型数据量化到[-255,255]范围内;若该数据远离其他数据,为了量化均匀考虑将其舍弃,采用次绝对值最大的数据作为量化基准。

tiny-yolo网络的权重是32位的float类型数据,占四个字节。量化权重可以减小每一个权重数据的大小,对网络进一步压缩。本发明采取的是最大量化,即将绝对值最大的数据作为量化基准。

量化的关键在于选择合适的量化基准和量化范围。最大量化即是选取绝对值最大的权重数据作为量化基准,若该数据远离其他权重,为了量化均匀考虑将其舍弃,采用次绝对值最大的数据作为量化基准。

量化范围小会造成精度不够,量化范围大会造成量化误差较大。将绝对值最大的权重数据量化到255,计算量化系数,其他权重依次量化,每个权重数据由4个字节的float类型数据量化为2个字节的shortint类型整数。即是将权重数据量化到[-255,255]范围内。

conv1、conv4和conv5层的绝对最大值均远离其他数据,舍弃绝对值最大的数据,采用次最大绝对值的数据作为量化基准,量化结果更加均匀。

conv0-7量化前后的权重分布图如图7所示,将conv0-8的权重量化到[-255,255]范围内得到的分布曲线与原始权重的分布曲线基本一致,所以该量化方法是可行的。

每一层的输入输出数据也需要进行量化,方法和权重量化一致。因为不同图片各层的输入输出不一样,量化系数不一样,对100张图片产生的各层输入输出数据进行量化分析,测试结果表明是可行的。conv0的输入数据是输入图片,图片输入之前是经过归一化的,输入数据的绝对最大值必然是1,其量化系数也固定为255。

tiny-yolo网络最终输出的用于检测的数据需要以float类型数据形式体现,来表达出最原始的特征,所以需要进行反量化。输入数据和权重以signedshort类型数据的形式进行计算,可以提高计算效率,之后用得到的输出数据除以两者的量化系数,得到的便是float类型的输出数据。整个量化与反量化过程如图8所示。直接使用原始的float类型输入数据和权重数据进行卷积的输出为3.9121。由图8可以看到,量化为shortint类型数据进行卷积,经过反量化的到的输出为3.912853,与原结果基本相同。

本发明通过量化权重和输入输出来完成网络预处理,采用最大值量化法,将绝对最大值量化为255,即量化范围是[-255,255],但是合理选择较小或较大的量化范围也可能实现本发明,因此较小或较大的量化范围即为替代方案。

本发明基于arm+fpga双架构的zedboard开发平台,使用hls工具进行硬件设计。分析各卷积层的具体特点,在fpga上设计相应的ip核,实现上述提出的加速算法,完成对tiny-yolo网络的优化加速。tiny-yolo卷积神经网络经过硬件加速,各卷积层的全部计算均在ip核中完成,算法实现就是通过ip核来实现各步骤提出的加速算法,并为加速算法所需的缓冲器分配存储资源。

分析tiny-yolo卷积神经网络的结构,各卷积层有明显区别,也有一定的相似之处,考虑在fpga上设计3个ip核:

(1)conv0为3输入通道,输入通道数较为特别,为conv0单独设计一个ip核ty0_kernel。

(2)conv8的卷积核大小为1*1,而其他层则是3*3,所以为conv8设计一个ip核ty2_kernel。

(3)conv1到conv7都是双通道输入,结构较为相似,给这几层设计一个共同调用的ip核ty1_kernel。

由于将池化嵌入卷积过程,不需要专门设计池化核,卷积层和池化层合二为一,设计成统一的ip核。3个ip核主要从函数接口及端口设置、算法实现、优化结果以及资源消耗这几个方面来设计。

3.1函数接口及端口设置

各ip核的函数接口及端口的具体设置如下表:

表3.1函数接口及端口设置表

ty0_kernel是为conv0设计的ip核,采用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。

ty1_kernel为conv1-7共同调用,该ip核必须设计能满足各层输入输出大小的接口。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,由于ty0_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满足各层的输入尺寸及通道数。

ty2_kernel是为conv8设计的ip核,采用双通道并行输入的方式,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的方法。使用stream指令能够提升数据的传输速度,减少资源消耗。声明指令如下:

tiny-yolo网络经过硬件加速,各卷积层的全部计算均在ip核中完成,算法实现就是通过ip核来实现论文提出的加速算法,并为加速算法所需的缓冲器分配存储资源。

ty0_kernel的算法伪代码:

row=0时将输入数据的前两行数据缓冲到行缓冲器中,在第419个时钟周期,row=1且col=1时开始进行卷积计算。使用unroll指令将9次乘加运算展开同时进行,conv0是3通道同时输入,总共展开27次乘加运算,相当于卷积计算速度提升27倍。ii=1是优化的目标,ii就是initiationinterval指循环一次的时钟周期,ii=1就是1个时钟周期完成一次循环。

ty1_kernel的算法伪代码:

conv1-7和conv0一样,依然是当row=1且col=1时开始卷积计算。conv1-7采取的是双通道并行输入的方法,每次同时处理两个通道的输入数据,使用优化指令,实现双通道的18次乘加计算并行处理。从第1、2输入通道开始,每两个通道的卷积输出数据缓存到缓冲器,反复使用缓冲器将对应位置的输出数据不断累加,直到累加最后两个输入通道的卷积输出数据,得到单通道的最终卷积输出数据。需要注意的是从conv6开始,卷积过程之后不需要再进行池化操作。

ty2_kernel的算法伪代码:

conv8依然采取的是双通道并行输入的方法,每次处理2个输入通道的数据。由于conv8中1*1的卷积核,卷积计算相当于乘积运算,直接计算即可。ty2_kernel与ty1_kernel一样,将每两个输入通道的卷积输出数据缓存到缓冲器,依此类推,缓冲器相应位置缓存的数据不断进行累加,直到累加到最后两个输入通道的卷积输出数据,得到单通道的最终卷积输出数据。

对tiny-yolo网络进行硬件加速设计时,需要设计缓冲器并为这些缓冲器分配存储资源。设计的缓冲器主要如下:

(1)使用卷积计算并行处理的方法,每个通道的输入数据需要3个行缓冲器line_buf。因此ty0_kernel需要9个line_buf,长度为418;ty1_kernel需要6个line_buf,长度要满足所有层的输入宽度需求,各层输入宽度最大为210。

(2)进行卷积计算时,ty0_kernel和ty1_kernel需要寄存器组来存放输入数据和卷积核数据,每个寄存器组包括9个寄存器,ty0_kernel各需要3个寄存器组,ty1_kernel各需要2个寄存器组。

(3)ty1_kernel和ty2_kernel需要缓冲器来缓存每两个输入通道的输出,缓冲器大小和输入尺寸一样,分别为208*208和13*13。

(4)将池化嵌入卷积过程,ty0_kernel和ty1_kernel需要设计一个行缓冲器pool_buf来缓存并行池化过程中的数据,长度为输入宽度的一半,分别为208和104。

各个缓冲器的资源分配如表4.2:

表3.2缓冲器资源分配表

conv1至conv7为了保持输出结果的精度,输出缓冲器out_buf的类型为int,short与short数据相乘的结果继续用short类型保存会降低精度。conv8不用卷积计算与池化,只需要设置一个缓冲器来缓存卷积过程中的输出数据。由于conv8的输出直接用于检测,其输出数据应该为原始的float类型,所以将out_buf声明为float类型。

通过resource指令将各ip核的line_buf、pool_buf和out_buf缓冲器的资源类型声明为ram_2p_bram。通过array_partition指令将最小输入处理单元input_buf和最小权重处理单元weights_buf声明为寄存器。

声明指令如下:

通过pipeline指令优化tiny-yolo网络的并行处理,实现一个时钟周期完成一次卷积过程,即pipeline的优化目标是ii=1,一个时钟周期完成一次循环。设计综合后各ip核的scheduling的信息如下表:

表3.3pipeline优化结果表

从scheduling信息可以看到,pipeline优化目标是ii=1,经过综合后的结果显示为ii=1,本论文中各个ip核的pipeline优化目标成功实现了。

硬件加速的过程中,用到的硬件资源主要是存储资源bram和计算资源dsp48e。ty0_kernel的资源消耗表如图9所示,ty1_kernel的资源消耗表如图10所示,ty2_kernel的资源消耗表如图11所示。对tiny-yolo网络进行硬件加速,用到的主要是存储资源bram和计算资源dsp48e,3个ip核一共用到了156个bram和193个dsp48,zedboard上共有280个bram和220个dsp48,可以满足硬件资源的需求。

分析tiny-yolo网络的结构特点,深入挖掘其并行特征,结合硬件并行处理能力,对其进行硬件加速。使用hls工具进行硬件设计,tiny-yolo网络得以在zedboard测试平台上加速运行,实现了在zedboard上较为高效的处理。

通过多通道并行输入、卷积并行计算、池化嵌入等方法对tiny-yolo网络进行加速改进。在fpga上设计3个ip核来实现加速算法,其中主要用到的硬件资源是dsp48和bram,dsp48用于满足卷积计算并行处理时的计算开销,bram则是用于输入输出数据的缓存。从资源消耗表可知3个ip核一共用到了193个dsp48,156个bram,满足了zedboard硬件资源的要求。tiny-yolo网络在zedboard的arm上测试100次,平均每次运行时间约为8秒,而tiny-yolo网络基于3个ip核在fpga上加速之后,经过100次测试,平均每次的运行时间约为0.6秒,检测速度提高了接近14倍。由于ip核的多次调用增加了数据传输时间的消耗,没有达到理论上的18倍加速。

经过加速改进的tiny-yolo网络在运行速度、硬件资源、检测精度之间基本达到了平衡,通过硬件设计在zedboard测试平台上实现了较为高效的处理。用voc2007图片测试集来测试检测准确率,优化后的tiny-yolo网络的map为55.0,原始网络的map为57.1,检测性能与原始网络相比略有下降,但总的效果基本一致。误差主要发生在网络量化阶段,由于设计合理误差较小,最终的检测效果与原始版本基本相符。

原始版本tiny-yolo网络检测结果如图12:

置信度:

bird:93%

加速后的tiny-yolo网络检查结果如图13:

置信度:

bird:90%

原始版本tiny-yolo网络检测结果如图14:

置信度:

person:50%

person:66%

person:37%

dog:77%

加速后的tiny-yolo网络检测结果如图15:

置信度:

person:46%

person:55%

person:34%

dog:57%

从测试图片的检测结果可以看到,各个目标物体的置信度略有下降,目标框稍有偏差,总的来说,加速后tiny-yolo网络的检测结果与原始结果基本相同。

分析tiny-yolo网络的处理过程,结合网络的并行特征和硬件的并行处理能力对tiny-yolo网络进行硬件加速;神经网络各层的输入输出和网络权重都是浮点类型的数据,整个网络的计算集中在卷积过程,卷积计算是一个乘加过程,如果将数据的传输和计算映射到硬件上,则浮点类型数据会占用大量的存储资源(比如bram)、消耗大量的计算资源(比如,dsp48),先对网络的权重及输入输出进行预处理,降低网络对存储资源和计算资源的要求,然后从输入方式、卷积计算方式、池化计算方式3个方面对tiny-yolo网络进行加速改进;分析tiny-yolo网络各卷积层的结构异同,使用高层次综合工具(high-levelsynthesistool,hls)在zedboard的fpga上设计3个ip核,分别对应conv0、conv1-7、conv8,各ip核从函数接口及端口设置、算法实现、优化结果及资源消耗等方面来进行设计;tiny-yolo卷积神经网络基于3个ip核经过fpga加速后,其处理速度相比之前得到了大幅提升。

本发明具有如下优点:

1.传统的fpga加速卷积神经网络直接使用浮点数类型的权重和输入数据进行卷积计算,耗费了大量的计算资源;本发明通过量化权重和输入输出降低网络对硬件存储和计算资源的需求。

2:采用多通道并行输入的方式替代传统的单通道输入方式,同时处理多个通道的输入数据,成倍地提升了tiny-yolo卷积神经网络的处理速度。

3:tiny-yolo卷积神经网络一次卷积计算相当于9次乘加运算,卷积计算是串行执行的;通过hls优化指令展开卷积计算,将乘加运算并行处理来加速网络的卷积计算速度,提升网络的处理速度。卷积计算过程具有并行的特点,非常适合在硬件上进行并行加速。

4:卷积计算与池化并行处理,边卷积边池化,而非传统的先卷积再池化,节省了大量的卷积操作和池化操作之间的数据传输时间和资源开销。

本发明通过分析未经加速的tiny-yolo卷积神经网络的处理过程,结合网络的并行特征与fpga的并行处理能力,将输入方式改进、卷积计算方式改进和池化改进结合,从这3个方面加速tiny-yolo网络的处理过程。本方案易于实现,从tiny-yolo网络在处理运算过程入手,不涉及网络本身结构的改变;本方案便于移植,整个加速的设计都是对于tiny-yolo网络处理过程的改进,对硬件平台没有特殊要求,在其他硬件平台上也能实现本加速方案。

以上所述仅为本发明的优选实施例,并不用于限制本发明,显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1