当前位置:首页 期刊杂志

基于小型ZynqSoC硬件加速的改进TINYYOLO实时车辆检测算法实现

时间:2024-05-04

张雲轲 刘丹

摘 要:针对TINY YOLO车辆检测算法计算量过大,且在小型嵌入式系统中难以达到实时检测要求的问题。利用小型Zynq SoC系统的架构优势以及TINY YOLO的网络权值中存在大量接近零的权值参数这一特点,提出硬件并行加速的改进算法,称为濃缩小型深度网络(Xerantic-TINY YOLO, X-TINY YOLO)车辆检测算法。首先对TINY YOLO中网络结构进行压缩;其次采用高效多级流水线、流水线内全并行的方式对卷积计算部分进行算法加速;最后提出与网络结构相配合的数据切割和传输方案。实验结果表明,X-TINY YOLO仅消耗50%的片内硬件资源,可在相对于GPU和CPU性价比更高更适合嵌入式场景的Zynq SoC系统上实现,且其检测速度达到24帧/s,满足车辆检测的实时性要求。

关键词:车辆检测;机器视觉;TINY YOLO;Zynq-7020;硬件加速

中图分类号: TP389.1; TP391.413

文献标志码:A

Abstract: TINY YOLO (TINY You Only Look Once) vehicle detection algorithm requires much amount of calculation which makes it difficult to achieve real-time detection in small embedded systems. Because plenty of zero values exist in a network weight matrix which makes the network a sparse structure, an improved version of TINY YOLO vehicle detection algorithm, called Xerantic-TINY YOLO (X-TINY YOLO), was proposed and accelerated in parallel way using architectural advantages of small Zynq SoC system. Original network structure of TINY YOLO was compressed and the operations of convolution steps were accelerated in parallel by using high efficient multistage pipeline. All multiply-add operations were concurrently executed within each stage of pipeline. By matching network structure, a method of data segmentation and transfer was also proposed. The experimental results show that, X-TINY YOLO only consumes 50% hardware resources on chip, and it can be implemented on small Zynq SoC systems which have higher performance-price ratio than GPU and CPU and is suitable for embedded implementation scenes. Its detection speed reaches 24 frames per second, which meets the requirement of real-time vehicle detection.

Key words: vehicle detection; machine vision; TINY You Only Look Once (TINY YOLO); Zynq-7020; hardware acceleration

0 引言

实时车辆检测算法主要分为三类:基于先验知识的车辆检测算法[1-2]、基于浅层机器的学习车辆检测算法以及基于深度学习的车辆检测算法[3]。基于先验知识的检测算法是根据车身所带有的线条、阴影或边缘特征对前方车辆进行识别。文献[4]通过对车辆尾部特定水平直线(如保险杠、后车窗下边沿等)的检测达到车辆检测目的。该算法易将车身周边环境中存在的类似直线误判为车辆,且对处于转弯状态的车辆会出现检测丢失现象。文献[5]中提出对刹车灯进行检测的方法实现车辆夜间检测,效果较好但无法应用于外部光强较好的白天或地下停车场等环境。行驶中车辆周边环境的多样性常常会以噪声形式干扰此类检测方法准确率,故此类方法难以在环境变化剧烈的使用场景中适用。基于浅层机器学习的车辆检测算法以先验知识类算法中提取的车辆特征为基础,结合机器学习算法实现车辆的检测。文献[6]中提出Haar-like与Online Boosting相结合的方式,使用大量特征集对网络进行训练使其能检测车辆,与单纯的先验知识检测相比该算法在各种环境中的鲁棒性有了显著提高。文献[7]对Haar-like特征进行了优化,提升了该特征对环境中光强变化的适应性。该类算法特点是检测效率高、复杂度低,但依然严重依赖特征选取,使得其在复杂且变化的路况场景下重建模工程量大。基于深度学习的车辆检测算法多以卷积神经网络为基础加以改进,文献[8]中提出的Faster R-CNN(Faster Region proposal Convolutional Neural Network请补充Faster R-CNN的英文全称)通过聚类方式对车辆尺寸进行分类,随后使用高分辨率图片作为网络输入,最后在KITTI数据集上获得了较高的车辆检测精度,但其卷积层数过多导致网络计算复杂度过大而难以实现实时性检测。在网络模型的小型化方向上,Facebook的人工智能实验室设计了更轻巧的模型YOLO(You Only Look Once)[9],其最快版本的TINY YOLO在GPU上的测试速度可以达到每秒200帧。各版本YOLO算法的出现为深度学习类的目标检测算法在实际运用场景的实时性检测提供了可能。

深度学习算法的硬件加速方案主要有以下四种:图形处理器(Graphic Processing Unit, GPU)、专用集成电路(Application-Specific Integrated Circuit, ASIC)、粒度可重構阵列和现场可编程门阵列(Field-Programmable Gate Array, FPGA)。

利用GPU数千个计算核心并行计算的优势,文献[10-12]中提出的GPU加速方案,相比CPU上实现的深度学习算法在运算速度和功耗方面均有较大提升,然而中低端GPU多核之间共享存储(share memory)资源少难以完成算法移植,而高端GPU芯片昂贵的价格难以在短时间内为工业级应用所接受。文献[13]基于深度神经网络结构特点设计的由64块ASIC芯片组成的超级加速器DaDianNao在加速性能方面是GPU的450.65倍,功耗仅为CPU的0.67%,性能达到极致;然而各版本神经网络的网络结构间存在较大差异,而ASIC专用芯片的可变性较差,故其较适用于作为某些结构固定的网络的专用加速器。文献[14]基于单指令多数据流(Single Instruction Multiple Data, SIMD)架构,引入FPGA可编程逻辑电路,实现了可重构硬件的神经网络加速方案。其与文献[15-16]中提出的基于FPGA架构的加速器均可提供多种神经网络的实现方案,然而其缺少核心处理器,在实现较复杂的分支任务繁多的算法上有一定难度。

使用Zynq SoC架构对深度神经网络算法进行加速的研究还较少。Zynq SoC在架构方面结合了ARM(Acorn RISC Machine)嵌入式处理核心和FPGA可编程逻辑电路两方面的优势,提供较强的流程控制的同时可实现多个高速并行的乘加运算,而卷积神经网络的主要计算量集中于卷积层中的矩阵乘加运算,故其非常适用于卷积神经网络的检测算法加速,且该系列芯片在价格上相比FPGA和GPU均有较大优势。

综上所述,本文针对实际应用场景中车辆检测算法对实时性要求高这一特点,选择YOLO算法的快速版本TINY YOLO作为算法基础,并对网络作出裁剪优化进一步降低算法复杂度;再选择相比GPU等硬件平台性价比更高的小型Zynq SoC平台作为加速算法的硬件平台;通过Zynq SoC平台内的数字信号处理(Digital Signal Processing, DSP)并行计算资源和流水线技术,最终在千元以内的硬件平台上实现车辆实时检测算法。

1.1 网络结构压缩

TINY YOLO检测算法是YOLO V2目标检测算法的简化网络,相比原YOLO V2算法而言,其运算量减少,伴随着精度的降低,但作为在系统内部硬件资源极度有限的小型Zynq SoC中实现的嵌入式算法,TINY YOLO依然存在着网络规模过大导致计算量过大的缺点,从而使得其在实际应用场景下检测的实时性无法得到满足,故算法中首先需考虑对TINY YOLO网络进行裁剪。

TINY YOLO网络中包含三种传递结构:卷积层、全连接层和最大池化层。卷积层的计算过程如图1所示。

feature map是每一层的输入特征矩阵,由图1可见卷积运算中存在大量的矩阵乘加运算,所以耗时最多。又因为Zynq SoC系统中有可用于乘加运算加速的专用数字信号处理单元DSP48E硬IP核资源,可对乘加运算进行并行计算加速,故考虑利用FPGA(简称为PL端)资源对卷积层进行并行计算加速。最大池化层是滑动地取2×2网格中的最大值,可以紧接在卷积乘加运算之后而无需耗费更多的硬件资源。对于全连接层,虽然计算量较大,但在TINY YOLO的16层网络结构中只有最后一层是全连接层,若移植至FPGA端(PL端)将占用较多资源且对速度提升不明显,故选择将全连接层直接放在ARM端(简称为PS端)串行运行。

通过以上分析发现,对TINY YOLO网络进行移植时的主要计算量源于卷积层中的大量乘加运算,故考虑裁剪卷积层从而减少计算规模。通过观察TINY YOLO网络训练后的卷积核中的权值发现,该网络第3到第9层卷积层中存在着大量接近0的权值。通过对比实验发现,这样的网络稀疏性会带来少量的网络性能提升,但伴随着成倍的计算量的增加(表1)。故尝试在性能不会有过大减小的情况下,在网络训练前对TINY YOLO第3到第9层卷积层的输入卷积核个数进行裁剪,从而使得重新训练后得到的新网络(X-TINY YOLO)中接近于0的权值个数减少,最后得出缩小规模后的网络权值用于嵌入式移植。

裁剪后X-TINY YOLO网络结构下新网络权值的训练方法是先用ImageNet数据集和MS COCO2007+2012数据集对网络进行预训练,待网络参数稳定后再用收集和标定的2000张图片集(行驶车辆前方的路况图片),对网络后3层负责分类的网络进行再训练,从而进一步提升网络对具体的车辆检测任务数据的拟合效果。训练后得出的X-TINY YOLO网络与原TINY YOLO网络的各卷积层输入feature map的结构的对比如图2。

如图2所示,在训练时对上述层的输入卷积核数量进行了控制,从而减少了对相应卷积层输入的feature map通道个数,其中第二卷积层的训练所用卷积核个数由原来的32个减小为24个,之后每一个卷积层训练所用卷积核个数减半。网络理论总计算量如式(1):

其中:w、h和in_c分别表示单层卷积层输入feature map的宽、高和通道数,k_sizek_size如何能有两种含义,即是宽,又是高,是否少了一个变更,请明确表示输入卷积核的宽和高k_size2 表示卷积核二维尺寸面积,out_c表示卷积核数量。

训练后的网络性能及计算量对比统计如表1,其中mAP(mean Average Precision)为平均精度指标。

TINY YOLO网络中引入了Batch Normalization(BN)的操作来解决训练中的梯度爆炸和收敛速度慢等问题,故在Zynq SoC平台实现检测网络的前向传播时,每一层的卷积运算之后还需要进行BN操作,其输出output的具体公式如式(2)所示:

其中:w为该层的权值矩阵,d为该层输入的feature map矩阵,m为单张feature map均值,v为单张feature map方差,b为偏移向量(bias),s为缩放系数向量(scale)。若每一次的结果都进行这样的运算,将在检测环节耗费过多时间,而这些参数中,w、m、v、s、b通过网络训练后都成为已知参数,即在网络初始化时已知且不会再改变的数值,仅d需要用到上一层的计算结果。故对式(2)进行化简得到式(3):

按照式(3)在网络初始化时提前对参数进行处理,之后网络前向传播时用新生成的和b替代原权值矩阵w和偏移b进行运算。通过这种方法,用网络初始化时间增加的成本换取了实时检测计算时间的缩减。

1.2 数据分割算法

由于X-TINY YOLO算法中存在大量卷积运算,即矩阵乘法运算(如图1),若将大量乘加运算放置在Zynq SoC平台的FPGA端(PL端)进行,就可利用多片数字信号处理单元——DSP48E内核对多个乘加运算并行从而提升计算效率,但小型SoC平台包含的DSP48E和块随机存储单元(Block RAM, BRAM)的数量有限,远远小于X-TINY YOLO每一层的计算及存储所需要的资源数量,例如图2中第一层卷积层的输入图片尺寸是224×224×3,输入权值规模是3×3×3×16,若一次性传入PL端则共需要150960个BRAM存储单元,之后进行224×224×16×3×3×3(共21676032)次乘加运算,而以Xilinx公司旗下Zynq-7020系列中的XC7Z020芯片为例,其PL端仅仅有4.9MB(最多可分为280片)BRAM存储单元和220个DSP48E片上IP核,只可同时并行220个25×18位的乘加运算,远远小于该层卷积计算全并行所需资源。

故考虑根据每一层的网络结构,将单层卷积分解为多次进行,即将无法在PL端一次性完成的大矩阵乘法运算进行运算拆分后分多步完成。该方法首先需要对存储于PS端的第三代双倍数据率同步动态随机存取存储器DDR3 SDRAM(Double-Data-Rate Three Synchronous Dynamic Random Access Memory)中的单层网络的权值矩阵和该层图片像素矩阵(第二层后称为feature map矩阵)进行拆分。拆分后的单个小矩阵尺寸由X-TINY YOLO网络结构和PL端硬件资源允许的单次最大并行计算量共同决定。单层卷积中上述二矩阵未拆分前在PS端DDR3中的存储示意图如图3~4所示。

图3和图4中的(a)图分别表示两矩阵在PS端DDR3中的存储方式,而图(b)分别展示两矩阵在X-TINY YOLO中的逻辑对照模型。可以看出,单层卷积运算中权重矩阵需要传入PL端的数据总量weights_trans计算如式(4):

由式(3)知,还需要传入偏移向量(bias),它只用保存在权值矩阵的最后一行并随其一同传输即可,其传输大小为bias_trans计算如式(5):

其中:in_c、w、h分别为输入的feature map的通道数量、宽度和高度;out_c为输出feature map的通道数量,也是输入的权重矩阵中卷积核的个数;k_size为卷积核尺寸,除最后一层卷积使用1×1卷积核之外,其他各层卷积核尺寸都是3×3。

以下根据网络结构核硬件平台资源设计权值矩阵的分割方法,观察式(4)发现,k_size除第9层外始终是3,而in_c除第1,3层外,随层数增加以16为基数成倍增加,weights_trans都有公约数3×3×16,即144。故决定对DDR3中权值矩阵(图4(a))进行按列切割,切割后每列宽度为144或144的倍数(取决于硬件资源限制),单次传入的分割后权值矩阵大小(Weights_trans_once)为如式(7)所示:

其中:m为Zynq SoC平台的PL端允许的单次最大并行乘加运算个数,n为双端口BRAM存储单元个数,实际小型Zynq SoC平台各系列芯片的n是略大于m的,m约为n的66%~90%,故m成为计算瓶颈。

对应模型中的逻辑意义为:在本层所有卷积核的相同位置截断,每次运算同时向PL端传入out_c个卷积核在相同位置的144·m/144」个数据,即截取该层所有卷积核的连续16·m/144」个通道的所有权值。其中的特殊情况为第1,3,9层,由于通道数小于16或k_size为1导致列数不足144。采取的措施是在初始化时,依然按单次传入144×out_c个值,不足144按的列数在DDR3端存储时先补0。例如,图4中若DDR3端存储的是第一层卷积层的权值矩阵,即16行3×3×3列的数据,则在每一行末尾补144-3×3×3个0,使得每行的个数为144。

feature map矩阵的切割方式需要与权值矩阵的切割方式相匹配以适应计算需要。在权值矩阵切割时选择按列切割,即对in_c切割,而计算时需要传入将会与切割后的权值矩阵作卷积运算的feature map对应部分,故对其in_c按行切割,在DDR3(图5(a))中表现为按行切割,切割后每份的行数为144/k_size2·m/144」。单次传入的分割后feature map矩阵大小(feature_map_trans_once)如式(8)所示:

对应模型中的逻辑意义为一次性传入多个大小为w×h的完整的通道数据,但由于前三层的w,h过大导致整行数据无法一次性传入,故需要对前三层按行切割后再按列切割。对于第1、2層,因为in_c很小不需要按行切割,只需对其矩阵按列切割。第3层需要同时按行和列切割,而之后的4~9层只需要按行切割,但按列切割操作会使得一次传入的单通道数据不完整,而进行卷积运算时又需要用到feature map中一个单元及周边的3×3个数据,使得在对边缘数据卷积时缺少w列数据(也缺少w行,但这部分是补零操作而非用到feature map矩阵中的数据,将放在PL端补零)。故为满足边缘部分卷积对数据的要求,对于feature map中进行过按列切割的1,2,3层数据进行补传操作:若是该列切割中传入的第一块数据或最后一块数据,则在执行卷积操作时需要额外传入w列;若是非首尾块,则需额外传入2×w列。具体切割方式的示意图如图5所示,图中mul=m/144」。

按照上述方式拆分后的两个大矩阵被分割为存在计算匹配关系的若干小矩阵,之后成对传入一个权值小矩阵和一个feature map小矩阵供PL端计算单元使用,单次计算完成后立即传回PS端存储,所有小矩阵乘加计算结束后,结果将按照X-TINY YOLO该层通道顺序存储于DDR3中,组成下一层卷积运算的feature map输入。

1.3 数据传输、在PL端的存储和计算

数据传输时采用加速一致性接口(AXI-Accelerator Coherency Port,AXI_ACP)结合分散—集中型直接内存读取模式(Scatter-Gather Direct Memory Access,DMA_SG)进行数据搬移,将切割后小矩阵组从PS端的DDR3中分多次搬运至PL端的BRAM中。DMA_SG方式适合传输数据量大于300B的连续或非连续数据块的搬运,高效且灵活。高速一致性AXI_ACP接口使得PL端可直接读取L1和L2两级cache中缓存的PS端数据,降低传输延迟。

由于AXI_ACP口的位宽限制,分配4个8bit的AXI_ACP端口给权值矩阵的传输,保证在同一传输周期PL端可同时从PS端DDR3内搬移4组char类型的权值矩阵数据到BRAM,并存入4个不同的BRAM中,直至单次权值小矩阵传输完成。单次小矩阵共需传输数据量计算公式如式(7),结合以上分析知,单次权值小矩阵传输消耗时钟周期(weight_trans_clock)如式(9):

分配1个8bit的AXI_ACP对feature map数据传输,单个feature map小矩阵共需传输数据量如式(8),单次feature map小矩阵传输消耗时钟周期(weight_trans_clock)如式(10):

但对于第一到第三层卷积,传入计算的是非完整通道数据(如图5),计算时还需要用到上一次硬件函数输出的部分卷积运算结果,故分配4个8bit的AXI_ACP用于传入上一个小矩阵运算后的部分结果。最后剩下的位宽留给生成的新feature map矩阵的传回PS端使用最后剩下1个8bit位宽AXI_ACP用于在PL端单次计算得到的新feature map 矩阵传回PS端使用此句不通顺,请作相应调整,因为结果的传输过程是紧跟在计算完成之后放在计算流水线之内的,每完成一次计算传回一个结果,只会增加单级流水线的延迟,并不会增加流水线级数,而当启动间隔(Initiation Interval, II)为1且流水线级数远远大于单级延迟时,因此增加的少量额外时间可忽略。

PL端的数据存储使用BRAM存储单元,Zynq SoC平台允许对BRAM进行分割,每一个分割后的小BRAM都具有双端口读写功能,故考虑传入一对乘数(即一对feature map和权值数据)存入分割后同一个BRAM单元,以保证可在同一时钟周期内同时读写多组数据,从而极大提高了数据吞吐量。BRAM分割个数应取值为最大单次允许并行乘加个数,并留出富余的2个BRAM供最大池化操作使用。

计算时采用多级流水线、单级流水线内全并行的方式。因为该流水线的每一级均是从不同的BRAM中取数据并使用不同的DSP48E运算单元计算(或相同DSP48E中不同级单元),故流水线不存在结构冒险和数据冒险,故可实现流水线II=1的高效流水线。单个卷积层乘加运算消耗总时钟周期为:

2 算法实现

2.1 系统总体设计

硬件结构如图6所示,Zynq SoC平台主要由ARM(简称PS端)和FPGA(简称PL端)两部分构成,PL和PS端分别有各自的存储单元BRAM和DDR3。

PL端的并行摄像头接口逐帧接收摄像头传入的图像数据并传输给PS端的DDR3中存储。PL端的多路并行计算单元由多片DSP48E IP核构成,用于并行地加速乘加运算。

算法现实的物理平台核心为Zynq-7020的XC7Z020芯片,其片内只有220个DSP48E Slice,每片规格为18×25的乘法器。片内有140片双端口BRAM,每片存储空间为36Kb,实际可分为280片18Kb存储,其中每片系统预留2Kb不可用空间,故每片可用16Kb,即2KB空间。总可用空间为280×2KB,共可存储280×2048个8bit数据。

2.2 数据切割、存储、传输和计算

由第1章分析知,单次传入计算的矩阵规模上限将受限于PL端硬件存储资源(BRAM请补充BRAM的英文全称。前面有全称)和计算资源(DSP48E)数量。故需按照式(7)、(8)矩阵切割方法,对feature map矩阵和权值矩阵进行切割,由硬件资源知公式m=220,m/144」=1中,单次最多并行计算144个乘加运算。故单次传入权值小矩阵大小为144·out_c,单次传入feature map小矩阵大小为144/k_size2·w·h。X-TINY YOLO所有卷积层传入PL端的分割后矩阵规模及传入次数统计如表2。

表2中,k_step、n_step分别为feature map和权值矩阵分割后需分多次传入PL端的小矩阵数目。需要注意的是权值矩阵在传输当前层最后一个小矩阵时会多增加一行bias数据,而feature map矩阵在第3和第9次传入时,因为in_c无法被16整除,最后一次会传入规模比表格中数值更小的矩阵。以上两点未体现在表格中。

数据在PL端的存储方面,定义一个大小为146×2048的BRAM,并对第一个维度进行分割,分割为146个小BRAM,其中144个BRAM存储两个计算所用矩阵,2个BRAM用于最大池化操作。按照1.3节的存储方法,在每个BRAM的前w×h個单元中存入一个通道的feature map数据,从w×h开始之后的单元内存入out_c个单元的权值数据,在每个乘法计算周期内同时从144个BRAM中读出144对feature map和权值数据并分别送入144片DSP48E计算(综合后电路实际只使用了110片)。DSP48E只有144片,按上述方式单个计算周期内只能实现144·(16·k_size2)个乘加运算并行,乘加总量为in_c·out_c·k_size2·w·h,多个计算周期间通过#pipeline方式实现II=1的流水线(表75本文无表7,指代哪个表格,请明确。回复:表7改为表5)。由图2结合式(9)、(10)和(11)得到,各层卷积运算理论耗时,如表2的最后一列所示。

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!