设计目的与应用
人工智能一路高歌猛进,神经网络如今已经渗透到了智能安防、自动驾驶、医疗等几乎每一个角落。作为其中一项关键应用,目标识别的前景自然不用多说。随着深度学习框架越来越成熟,卷积神经网络的识别精度一路走高——当年经典的LeNet-5在手写数字识别上就做到了99%的准确率,后来的AlexNet和VGG-16直接碘伏了传统图像识别的思路,再到GoogLeNet和ResNet,更是把卷积神经网络的应用推向了一个新高度。
不过,神经网络进步得越快,挑战也就随之而来。权重参数越来越多,计算量也越来越大,这就导致一个很现实的问题:那些精度很高的复杂模型,很难塞进移动端或者嵌入式设备里。嵌入式环境对功耗、实时性、存储空间要求都非常苛刻——动不动就几十上百兆的参数文件,普通的ARM平台根本扛不住,算力就是最大的瓶颈。GPU虽然在训练阶段表现亮眼,但它对环境和特定库的依赖比较重,国内在这方面的技术积累也相对薄弱,很难做到完全自主可控。ASIC呢,是专门为特定需求定制优化的架构,灵活性太差,开发周期长,成本高得吓人,而且缺乏统一的软硬件生态。
所以,FPGA的机会来了。FPGA天生的并行架构,在实时信号处理、图像处理领域本来就有广泛的应用,而卷积神经网络恰好也需要这种并行算力。问题的另一个关键是,传统RTL开发FPGA的流程实在太慢了,完全跟不上软件那头的迭代效率。于是HLS应运而生——用高层次语言去描述算法,然后自动转换成底层的硬件代码,开发速度可以说是质的飞跃。这个项目正是利用HLS工具来生成算法中的加速IP核,把SSD目标检测网络移植到FPGA硬件平台上。对于硬件加速过程中如何挖掘并行性,主要思路有两条:一方面在层内对运算做并行化,把多个通道的数据分成小块,同一块里的通道同步运算,最后再把结果累加起来;另一方面是借助HLS提供的并行优化指令,对数组和循环做针对性优化。整个系统是基于PYNQ这个软件框架来搭建的,最终为SSD目标检测算法提供了一套完整的硬件加速方案,把FPGA的并行能力充分利用了起来。
SSD目标检测算法原理
SSD是2016年提出的,属于经典的单阶段目标检测模型。它厉害在哪?精度可以跟Faster R-CNN这种双阶段方法掰手腕,同时速度却能达到59FPS(512×512输入,Titan V下)。单阶段模型的关键思路是检测和分类一步完成:先用CNN提取特征,然后在图片的不同位置做密集抽样,抽样时可以设置不同的尺度和长宽比,物体分类和边框回归同时做,整个过程就是一步到位,所以速度就是它最大的王牌。
SSD的主干网络用的是VGG。VGG是由Simonyan和Zisserman在论文《Very Deep Convolutional Networks for Large Scale Image Recognition》中提出的,名字来自他们所在的牛津大学视觉几何组(Visual Geometry Group)。这个模型在2014年的ImageNet图像分类与定位挑战赛上风光了一把——分类任务拿了第二,定位任务直接第一。

图1.VGG16网络结构
需要说明的是,SSD里用的VGG并不是原汁原味的VGG16,而是做了几处关键改动:
1、把VGG16的FC6和FC7两个全连接层改成了卷积层。
2、去掉了所有的Dropout层和FC8层。
3、新增了Conv6、Conv7、Conv8、Conv9这几个卷积层。

图2.SSD主干网络结构
上图展示的就是SSD的主干网络——整个网络是全卷积结构。具体来说,VGG16的两个全连接层被换成了普通的卷积层,池化层POOL5的参数也做了调整,步长从原来的2变成了1,卷积核从2×2变成了3×3,这样特征图的大小不会缩水,同时还能获得更大的感受野。Conv6则改成了空洞卷积,膨胀系数设为6。输入图像依次经过改进后的VGG网络(从Conv1到fc7),再走几个新加的卷积层(从Conv6到Conv9),完成整条特征提取路径。
从图2可以看得很清楚:SSD把conv4_3、conv7、conv6_2、conv7_2、conv8_2、conv9_2这6个特征图都接入了最后的检测分类层做回归。这6个特征图分别负责预测不同大小和长宽比的边界框,具体细节可以参考图3。

图3.SSD特征提取网络
SSD为每个检测层都预先定义了不同大小的先验框(prior boxes)。其中Conv4_3、Conv8_2和Conv9_2分别有4种先验框,而Conv7、conv7_2和Conv8_2分别有6种——也就是说,特征图上的每个像素点,都会对应生成4个或6个先验框。
说到这里,其实有一个很直观的道理:在浅层的神经网络里,网络能看到的只是图片的细节和纹理信息,好比管中窥豹,看到的只是一小部分。随着网络层数加深,相当于把观看距离往后拉远了,这样才能感知到图片的整体结构。低层卷积擅长捕捉细节信息,高层卷积则擅长提取抽象特征。低层特征更关心“物体在哪里”,但分类的准确度不高;高层特征更关心“物体是什么”,但位置信息却丢失了不少。SSD正是利用了这种不同尺度特征图的互补特性,用多层特征同时检测不同大小和类别的目标,最终取得了非常不错的效果。
作品展示
