《SlimYOLOv3: Narrower, Faster and Better for Real-Time UAV Applications》是arXiv, 25 Jul 2019的论文,作者全部来自北理,论文链接:
arxiv.org/abs/1907.1109。作者对YOLOv3的卷积层通道剪枝(以通道级稀疏化),大幅削减了模型的计算量(~90.8% decrease of FLOPs)和参数量( ~92.0% decline of parameter size),剪枝后的模型运行速度约为原来的两倍,并基本保持了原模型的检测精度。
具体是怎么做的?通过稀疏训练和通道剪枝获得SlimYOLOv3的程式可用下图概括:
首先来介绍下YOLOv3-SPP3,它是作者在YOLOv3基础上做了一点改进得到的。YOLOv3分别在三个不同尺寸的特征图上构建detection header,作者将spatial pyramid pooling (SPP) module引入YOLOv3中。SPP module由四个并行的分支构成,分别是kernel size为1×1, 5×5, 9×9, 13×13的最大池化。如下图所示,作者在每个检测头前面的第5和第6卷积层之间集成SPP模块来获得YOLOv3-SPP3。作者实际上后续以YOLOv3-SPP3作为baseline来进行稀疏训练和通道剪枝等。
稀疏训练。在YOLOv3每个卷积层后跟着的BN layer起到加速模型收敛、提高泛化能力的作用,批量标准化公式为:(其中
和
分别是输入特征的均值和方差,
和
是可训练的比例因子和偏差)
自然地,作者直接采用
的绝对值(L1 regularization)来表征通道的重要程度。稀疏训练的损失函数是:(其中
,
是惩罚因子—— balances the two loss terms,作者在实验中设置为0.0001)
通道剪枝,其实就是去除那些尺度因子小的通道、减少模型通道数,“更窄”。作者引入一个全局阈值
来决定某通道是否被剪掉,
被设置为所有
的n-th percentile,它即是剪枝率。此外,为了防止over-pruning、保持网络连接的完整性,作者引入了一个局部安全阈值
,
是逐层级设置的,
被设置为当前卷积层中所有
的k-th percentile。作者将比例因子
同时小于
和
的通道去除。当然,YOLOv3中有一些特殊层需要特殊处理:maxpool layer和upsample layer(与通道数无关直接忽略)、route layer(concatenate其incoming layers对应的pruning masks来获得route layer的pruning mask)、shortcut layer(所有与shortcut layer连接的layers需要有相同的channel number,为了匹配这些feature channels,遍历这些层的pruning masks并执行OR操作来为这些层生成最终的pruning masks)。
接下来就是Fine-tuning(重训SlimYOLOv3)和Iteratively pruning(迭代修剪直到满足一定的条件,比如模型剪枝率达到一定要求,首选上图所示的增量修剪策略,以防止过度修剪)。
模型:YOLOv3、YOLOv3-tiny(YOLOv3的tiny版本)、YOLOv3-SPP1(仅在第一个检测头前集成SPP模块)、YOLOv3-SPP3、SlimYOLOv3-SPP3-50(n=50, k=90, 迭代剪枝2次)、SlimYOLOv3-SPP3-90(n=90, k=90)、SlimYOLOv3-SPP3-95(n=95, k=90)。
在VisDrone2018-Det dataset的验证集上进行评估,各模型测试结果如下:
SlimYOLOv3-SPP3-50、SlimYOLOv3-SPP3-90、SlimYOLOv3-SPP3-95相比YOLOv3-SPP3而言,实际上reduces FLOPs (when input size is 832×832) by 57.1%, 85.9% and 90.8%, decreases parameters size by 67.4%, 87.5% and 92.0%, shrinks model volume by 67.5%, 87.4 and 92.0%, and reduces the inference time by 38.8%, 42.6% and 49.5%.
至于检测精度,上面的柱状图表示很直观了。
至于Billion floating point operations(BFLOPs) and accuracy (mAP) trade-off,下图更为直观: