物体检测是计算机视觉领域的一个重要问题, 物体检测算法从传统的人工特征(如梯度方向直方图, SIFT角点)和经典的统计机器学习方法(如支持向量机, 朴素贝叶斯)[1–5]发展到现今的基于卷积神经网络的物体检测算法, 物体检测效果令人惊叹. 2014年, R.Girshick等人将卷积神经网络应用到物体检测中, 提出了基于区域的卷积神经网络(R-CNN)算法[6], 使得检测效果远远优于当时的传统物体检测算法. 随后的Fast R-CNN[7]和Faster R-CNN[8]等都在检测准确率和定位精度上不断突破, 而2015年Joseph Redmon等提出的YOLO[9]算法和2016年Wei Liu等提出的SSD[10]算法都是在算法速度上进行突破. 在物体检测算法不断突破的同时, 神经网络架构也在不断更新.
最早的卷积神经网络LeNet[11]是Yann LeCun在1998年设计并提出的, 它一开始是针对识别手写数字问题, 网络结构较为简单, 但是包含了卷积神经网络的基本单元, 是以后各种模型的始祖. 2012年, 在ImageNet比赛上大放异彩的AlexNet[12]虽然只比LeNe多了几层, 但效果远远优于最早的LeNet, AlexNet将激活函数由Sigmoid换成了ReLU, 解决了因为网络层更深时的梯度弥散问题, 还加入了dropout层, 有效解决过拟合问题. 2014年出现的VGG[13]相较于AlexNet而言网络层越来越深, 整个网络层全部使用3×3大小的小卷积核和2×2的最大池化核, 使得整个网络结构简洁, 具有更好的泛化性. Network in Network[14]模型的亮点在于1×1卷积核和全局平均池化层(Global Average Pooling)的应用, 使得整个网络模型的参数规模锐减, 有利于网络的加深, 训练时间也得到提升. 2014年的GoogLeNet[15]中使用了基础卷积块Inception, 最后的全连接层借用NiN模型思想换成Global Average Pooling, 整个模型的参数量大大减小, 效果更好. 2015年的ResNet[16]中包含了Residual单元, 允许原始输入信息直接传递到后面的网络层中, 解决了因为网络层过深而梯度消失, 无法反向传播的问题. 2017年谷歌公司提出的MobileNets使用深度分离卷积[17], 进一步减小计算量, 压缩模型, 可以满足嵌入式设备的需求.
随着硬件计算能力的快速发展, 深度学习技术已经应用到很多便携式嵌入设备中, 比如各种刷脸支付、相册智能分类、图片风格迁移等, 但是目前一大挑战是如何将庞大深度模型移植到资源有限的嵌入式设备上[18].
2 优化流程本文针对嵌入式设备进行的深度学习物体检测优化算法研究主要在PC端和嵌入式平台ARM上完成. 首先, 准备好训练数据, 选择合适的物体检测框架和神经网络架构进行构建; 然后在此网络结构下, 对训练数据进行模型训练, 得出原始物体检测模型; 接着对原始物体检测模型进行模型剪枝, 以上过程都是在PC端上完成. 将PC端上完成模型剪枝的物体检测模型移植到嵌入式设备ARM平台上, 针对该物体检测模型的各个网络层进行运算代价计算, 根据计算结果, 对运算代价较高的网络层进行汇编优化. 汇编优化后的物体检测模型在ARM平台上对冰箱内采集到的视频内容进行前向推理, 在ARM平台上显示检测结果, 上述过程在ARM平台上完成, 图1为整个物体检测优化算法的流程图.
2.1 网络结构选择
本文整体网络架构选用MobileNets, MobileNets中的深度可分解卷积是将标准卷积分解成一个深度卷积和一个点卷积.
假设输入F的维度为DF×DF×M, 其中DF为输入F的宽和高, M为输入层的通道数. 标准卷积时, 卷积K的参数量表示为DK×DK×M×N, 其中DK为卷积K的维度, N为输出通道数, 则此时的计算代价为C:
$C = {D_K} \times {D_K} \times M \times N \times {D_F} \times {D_F}$ | (1) |
深度可分解卷积时, 将标准卷积K拆分为深度卷积DK×DK×1×M和点卷积1×1×M×N, 计算代价为C’:
$C' = {D_K} \times {D_K} \times M \times {D_F} \times {D_F} + M \times N \times {D_F} \times {D_F}$ | (2) |
将深度可分解卷积的计算代价C’与标准卷积的计算代价C相除, 进行比较:
$\begin{aligned} \frac{{C'}}{C} &= \frac{{{D_K} \times {D_K} \times M \times {D_F} \times {D_F} + M \times N \times {D_F} \times {D_F}}}{{{D_K} \times {D_K} \times M \times N \times {D_F} \times {D_F}}}\\ & = \frac{{\text{1}}}{N} + \frac{1}{{D_K^2}} \\ \end{aligned} $ | (3) |
在ImageNet数据集上, 深度分离卷积的参数量约是标准卷积参数量1/7, 而准确率只下降了不到1%[17].
深度分离卷积在网络结构上的变化如图2所示, 将标准卷积拆分成深层卷积和点卷积, 在每层卷积后面都有BN层和激励函数ReLU.
在物体检测算法方面, R-CNN系列都是物体定位和物体分类分开进行的物体检测方法, 虽然准确率很高, 但是速度较慢; 而YOLO和SSD则都是一步完成物体定位和物体分类, 其中YOLO的速度很快, 但是准确率不尽人意, 而SSD综合了Faster R-CNN的高准确率和YOLO的快速率优点, 使得物体检测方法更加适合应用在嵌入式设备上, 故选择SSD作为本次面向嵌入式设备的深度学习物体检测优化算法研究的物体检测框架.
2.2 模型剪枝在PC端上的模型剪枝流程图如图3所示.
首先, 对MobileNets-SSD网络进行神经元重要性的评估, 然后根据评估结果将其中最不重要的神经元置零, 对部分神经元置零后的网络进行微调, 判断微调后的网络是否达到预定标准, 如果达到预定的标准, 则可以停止剪枝; 如果未到到预定的标准, 则需要重复神经元重要性评估、不重要神经元置零、微调等步骤.
本文在模型剪枝过程中采用了一种基于一阶泰勒展开的新的神经元重要性评估准则[19]. 该准则中对神经元的评估公式为:
$\left| {\Delta C({h_i})} \right| = \left| {C(D|{W'}) - C\left( {D|W} \right)} \right|$ | (4) |
上式中, D表示训练样本集, W表示未修剪前的权重参数, W’表示修剪后的权重参数, C(D|W)为修剪后的代价函数, 而C(D|W’)表示的是修剪后的代价函数, 最优化的剪枝就是使得修剪后的代价函数C(D|W’)尽可能地逼近修剪前的代价函数C(D|W). 将剪枝前后的代价函数差值赋值给|ΔC(hi)|, 找出令式(4)中|ΔC(hi)|值最小的非零权重参数, 将该参数置零, 即完成一次剪枝. 又因为C(D|hi)=C(D|(w,b)i), 所以式(4)可以变换为式(5):
$\left| {\Delta C({h_i})} \right| = \left| {C(D,{h_i} = 0) - C\left( {D,{h_i}} \right)} \right|$ | (5) |
在式(5)中的C(D,hi=0)部分引入一阶泰勒展开式, 如式(6)所示:
$C(D,{h_i} = 0) = C(D,h{}_i) - \frac{{\delta C}}{{\delta {h_i}}}{h_i} + {R_1}({h_i} = 0)$ | (6) |
其中, R1(hi=0)为高阶项, 因为ReLU激活层中含有高阶信息, 同时为了避免复杂的计算, 高阶项R1(hi=0)可以忽略不计.
综合式(5)和式(6)可得式(7):
$\begin{aligned} {\Theta _{TE}}({h_i}) &= \left| {\Delta C({h_i})} \right| = \left| {C(D,{h_i}) - \frac{{\delta C}}{{\delta {h_i}}}{h_i} - C(D,{h_i})} \right| \\ & = \left| {\frac{{\delta C}}{{\delta {h_i}}}{h_i}} \right| \\ \end{aligned} $ | (7) |
将特征图看作变量的向量表示, 当有M个变量时, 剪枝前后的损失函数差值可表示为:
${\Theta _{TE}}(z_l^{(k)}) = \left| {\frac{1}{M}\sum\limits_m {\frac{{\delta C}}{{\delta z_{l,m}^{(k)}}}z_{l,m}^{(k)}} } \right|$ | (8) |
嵌入式设备主要由嵌入式处理器、相关支撑硬件和嵌入式软件系统组成, 而树莓派是一款基于ARM的微型电脑主板, 是作为学习计算机编程的首选嵌入式设备. 本文使用的是树莓派3 B, 它有1.2 GHz和64位处理器, 满足物体检测模型汇编优化和前向推理的性能需求.
在该ARM平台上, 通过对表1模型剪枝对比中各个网络层的耗时比较, 决定针对其中卷积层Conv_0、Conv_1、Conv_2、Conv_3、Conv_4、Conv_5、Conv_6、Conv_7、Conv_8、Conv_9、Conv_10、Conv_11、Conv_12、Conv_13、Conv_14_1和Conv_14_2进行汇编优化,主要策略分为指令调整、寄存器分配和条件执行[20].
(1) 指令调整: 通过展开循环对装载指令进行人工优化, 仔细安排装载指令的时间次序, 防止流水线终止.
(2) 寄存器分配: 限制局部变量的个数; 把多个局部变量存放在一个寄存器中.
(3) 条件执行: 使用ARM处理器特有的条件执行指令来减少判断跳转和分支等对流水线影响较大的操作.
通过以上策略最大程度地利用平台资源, 发挥处理器最大效能, 来满足物体检测模型直接在嵌入式设备上快速前向推理的需求.
3 实验分析 3.1 数据集制作通过冰箱内的USB摄像头对总共76种蔬菜水果饮料等冰箱常见食材进行训练样本采集, 一共采集5万张图片, 最后挑选出45 488张作为训练样本, 如图4所示.
利用网上标注系统对挑选出的训练样本进行数据标注, 网上标注系统的界面如图5所示, 可以对物体进行种类选择和位置定位.
3.2 训练优化训练时采用MobileNets作为本次实验的基础网络架构, 其中总共有35层卷积层, 在Conv_11、Conv_13、Conv_14_2、Conv_15_2、Conv_16_2和Conv_17_2后进行物体检测方法SSD的分类器分类、位置回归和锚框的生成. 最后, 将以上6个卷积层生成的类别特征、位置特征和anchor box信息进行concat、Softmax和flatten. MobileNets的网络层与本文的MobileNets-SSD网络层如表2所示. 相比于MobileNets, 本文的MobileNets-SSD多8层卷积层, 且最后的平均池化层、全连接层和Softmax变成了conf_reshape、conf_softmax和conf_flatten. 对训练集进行训练后, 最终本文的MobileNets-SSD模型的mAP达到84.7%.
MobileNets-SSD完成训练后进行基于一阶泰勒展开的模型剪枝. 控制裁剪的整体过程为: 1)前向传播2)获取排序后的卷积窗口3)计算需要剪枝的卷积窗口个数4)裁剪. 主要函数如下所示:
(1) forward
(2) compute_rank
(3) normalize_ranks_per_layer
(4) get_prunning_plan
(5) lowest_ranking_filters
其中函数(1)表示模型的前向传播过程; 函数(2)用在梯度更新时, 其输出的计算值用于卷积窗口排序; 函数(3)是将每层的结果归一化; 函数(4)和函数(5)表示利用最小堆方法得到N个排名最低的卷积窗口.
完成一次剪枝后, 进行模型微调和迭代. 所有参数参与训练与学习, 重新训练模型10个迭代.
具体实验时, N分别设置为512和1024, 此时每层网络层耗时情况如表1模型剪枝对比所示. N为512时, 物体检测模型的mAP为85.1%; N设为1024时, 物体检测模型的mAP为82.3%. 可以看出, N为512时, 物体检测模型的mAP有所提升; 而N为1024时, 物体检测模型的mAP有所下降, 说明N设置为512时, 模型剪枝后的物体检测模型复杂度更为适合本次实验训练数据集和测试数据集, 前向推理效果更好.
所以, 综合表1模型剪枝对比中N为512和1024时的耗时情况以及相对应的物体检测模型的mAP值, 本实验选择针对N为512的模型剪枝后的MobileNets-SSD物体检测模型进行汇编优化. 经过模型剪枝后的MobileNets-SSD模型体积由23.1 MB缩减为20.8 MB, 模型体积减小9.96%.
3.3 ARM平台优化由表1模型剪枝对比可知, 物体检测模型中卷积层Conv_0、Conv_1、Conv_2、Conv_3、Conv_4、Conv_5、Conv_6、Conv_7、Conv_8、Conv_9、Conv_10、Conv_11、Conv_12、Conv_13、Conv_14_1和Conv_14_2无论是模型剪枝前还是模型剪枝后, 耗时都比较久. 我们通过指令调整、寄存器分配和条件执行等手段对模型剪枝前和模型剪枝后的耗时多的网络层分别进行汇编优化. 主要应用到的是NEON技术, 它是ARM处理器的128位SIMD架构扩展, 旨在为消费性多媒体应用程序提供灵活、强大的加速功能. 它具有32个64位寄存器和16个128位寄存器. 寄存器的具体调用代码如下所示:
(1) .macro MobileNets-SSD
(2) vldl.32 {d16-d19},[BO]!
(3) vldl.32 {d0-d3},[AO]!
(4) vldl.32 {d16-d19},[BO]!
(5) vldl.32 {d4-d7},[AO]!
(6) vmla.f32 q12,q0,d16[0]
(7) vmla.f32 q12,q2,d18[0]
(8) vmla.f32 q12,q3,d20[0]
(9) vmla.f32 q12,q4,d22[0]
(10) ...
(11) vstl.32 {d24-d27},[CO]!
(12) vstl.32 {d28-d31},[CO]!
(13) .endm
上述代码(1)行, .macro后面的字符串表示该宏的名称,在后续的调用中可以直接利用该宏来替代内部的具体实现代码. 代码(13)行的.end为宏的载止位置.
代码(2)–(5)行为数据加载指令, 其中A0表示矩阵起始地址, B0为右矩阵的起始地址, 两者均为地址寄存器. vldl,32指令的调用可以将数据按照32位为一个数据单位的顺序加载到NEON寄存器当中, 数据的连续性能够减少指令的访存时间.
代码(6)–(9)行为结果矩阵第一列的计算过程, vmla.f32为乘加指令.
代码(10)行表示其他几列的计算方式.
代码(11)–(12)行将寄存器当中的结果矩阵的值存储到内存当中, 当存储位置是连续的情况下, 指令的访存将同样是连续的, 减少数据存储所需时间.
汇编优化后的结果如表3汇编对比所示.
由表3汇编对比可知, 模型剪枝后的MobileNets-SSD模型前向推理速率相较于未进行模型剪枝时的速率加快了1.16倍, 而汇编前后模型的mAP无变化; 又结合表1模型剪枝对比和表3汇编对比, 经过模型剪枝和汇编优化的MobileNets-SSD模型前向推理速率相较于原始模型加快了8.82倍.
本文还选择其他两个前向推理框架进行了对比, 使用的都是剪枝之后的网络模型, 如表4所示. Mini-Caffe是对Caffe的前向推理版本, 汇编优化比较少, Ncnn是腾讯开发的带汇编优化的前向推理框架, 做了比较深度的汇编优化. 与它们相比, 本文最终的前向推理时间是最低的.
3.4 检测结果
在ARM平台上的前向推理时, 测试样本检测结果如图6所示.
部分物体未被检测的原因有以下几点:
(1) 遮挡物过多, 未能检测到整个物体;
(2) 离USB摄像头太远, 暴露面积太小;
(3) 只暴露物体部分特征, 前向推理困难等.
前期的训练样本的选择对最后嵌入式设备上物体检测模型的前向推理检测结果有一定影响. 整体效果较为理想.
4 结论与展望
本文选择了合适的物体检测框架SSD和神经网络架构MobileNets, 训练出一个满足嵌入式设备需求的物体检测模型, 并通过模型剪枝对该物体检测模型进行优化, 在移植到ARM平台上之后又进行汇编优化, 进一步加快前向推理速率. 在准确精度和模型大小方面还可以有进一步的研究:
(1) MobileNets V2的准确率和速率都有提高, 可以在此网络结构上进行物体检测算法优化.
(2) 因为模型中参数的存储精度为32位的浮点数, 可以在ARM平台上针对模型参数进行量化, 更大程度地压缩模型, 加快前向推理速率.
[1] |
胡仕玲, 顾爽, 陈启军. 基于HOG的物体分类方法. 华中科技大学学报(自然科学版), 2011, 39(S2): 124-126, 130. |
[2] |
潘子昂. 基于SIFT算法的图像匹配研究[硕士学位论文]. 西安: 西安电子科技大学, 2012.
|
[3] |
艾扬利, 赵忠芹, 杨兵. 基于新核函数的支持向量机在物体分类中的应用. 中国测试技术, 2008, 34(1): 80-83. |
[4] |
Lowd D, Domingos P. Naive Bayes models for probability estimation. Proceedings of the 22nd International Conference on Machine Learning. Bonn, Germany. 2005. 529–536.
|
[5] |
邓江帆. 基于学习的目标检测及应用[硕士学位论文]. 北京: 北京邮电大学, 2017.
|
[6] |
Girshick R, Donahue J, Darrell T, et al. Rich feature hierarchies for accurate object detection and semantic segmentation. Proceedings of 2014 IEEE Conference on Computer Vision and Pattern Recognition. Columbus, OH, USA. 2014. 580–587.
|
[7] |
Girshick R. Fast R-CNN. Proceedings of 2015 IEEE International Conference on Computer Vision. Santiago, Chile. 2015. 1440–1448.
|
[8] |
Ren SQ, He KM, Girshick R, et al. Faster R-CNN: Towards real-time object detection with region proposal networks. Proceedings of the 28th International Conference on Neural Information Processing Systems. Montreal, Canada. 2015. 91–99.
|
[9] |
Redmon J, Divvala S, Girshick R, et al. You only look once: Unified, real-time object detection. Proceedings of 2016 IEEE Conference on Computer Vision and Pattern Recognition. Las Vegas, NV, USA. 2016. 779–788.
|
[10] |
Liu W, Anguelov D, Erhan D, et al. SSD: Single shot MultiBox detector. Proceedings of 14th European Conference on Computer Vision. Amsterdam, The Netherlands. 2016. 21–37.
|
[11] |
LeCun Y, Bottou L, Bengio Y, et al. Gradient-based learning applied to document recognition. Proceedings of the IEEE, 1998, 86(11): 2278-2324. DOI:10.1109/5.726791 |
[12] |
Krizhevsky A, Sutskever I, Hinton GE. Imagenet classification with deep convolutional neural networks. Proceedings of the 25th International Conference on Neural Information Processing Systems. Lake Tahoe, NV, USA. 2012. 1097–1105.
|
[13] |
Simonyan K, Zisserman A. Very deep convolutional networks for large-scale image recognition. arXiv preprint arXiv: 1409.1556, 2014.
|
[14] |
Lin M, Chen Q, Yan S. Network in network. arXiv preprint arXiv: 1312.4400, 2013.
|
[15] |
Szegedy C, Liu W, Jia Y Q, et al. Going deeper with convolutions. Proceedings of 2015 IEEE Conference on Computer Vision and Pattern Recognition. Boston, MA, USA. 2015. 1–9.
|
[16] |
He KM, Zhang XY, Ren SQ, et al. Deep residual learning for image recognition. Proceedings of 2016 IEEE Conference on Computer Vision and Pattern Recognition. Las Vegas, NV, USA. 2016. 770–778.
|
[17] |
Howard AG, Zhu ML, Chen B, et al. MobileNets: Efficient convolutional neural networks for mobile vision applications. arXiv preprint arXiv: 1704.04861, 2017.
|
[18] |
黄萱昆. 基于深度学习的移动端图像识别算法[硕士学位论文]. 北京: 北京邮电大学, 2018.
|
[19] |
李晓云, 周聪. 基于ARM9TDMI的汇编优化方法. 计算机与现代化, 2007(2): 25-27, 31. DOI:10.3969/j.issn.1006-2475.2007.02.009 |
[20] |
Molchanov P, Tyree S, Karras T, et al. Pruning convolutional neural networks for resource efficient transfer learning. arxiv preprint arXiv: 1611.06440, 2017.
|