胡艺馨,张逸杰,方 健,金光浩,宋庆增+
(1.天津工业大学 计算机科学与技术学院,天津 300387;2.北京工美集团有限责任公司北京总部,北京 100005;3.北京电子科技职业学院 电信工程学院,北京 100176)
现阶段最流行的目标检测算法[1,2]基于(CNN[3])结构,如YOLO系列及其变体[4]、R-CNN及其变体[5]。此种结构的目标检测模型需要设备在满足大量内存开销的同时可以进行上亿次的浮点运算。虽然可以通过使用大型服务器如NVIDIA的GPU[6,7](图形处理器)进行计算实现快速检测。但是,随着CNN的应用范围扩大,人们需要得到具有更好的特征提取能力和表达能力的网络模型。自AlexNet[8]之后,科研学者们又提出了一系列的深度学习网络模型,如VGG[9]、GoogLeNet[10]、ResNet[11]、DenseNet[12]等,网络模型大小的增长导致计算量成倍增长。而在实际的应用场景中,大多数目标检测任务需要部署在计算资源有限的小型设备上,才能提高其实时反应速度。比如,在无人机上部署的检测模型,智能安防系统中部署的人脸识别检测,以及无人驾驶车辆上的目标检测系统。为了能在硬件资源限制的情况下快速精确地实现目标检测任务,本文设计出一款轻量级的目标检测神经网络。本文的方法基于现有目标检测模型,重新设计结构,提出一种模型压缩方法,再通过量化的方法减少计算量,最后在保证了一定的检测精度的情况下,提高了检测速度。
为了解决现有网络模型参数量和计算量所需内存空间较大的问题,本文对训练好的模型使用压缩的方式,有效降低模型的大小和参数量。
通过对现有的几种目标检测算法的对比,本文选定了目前检测速度最快,还能同时保证检测精度的YOLO系列模型。YOLO算法使用DarkNet[13]系列网络作为提取图像特征和语义信息的主干卷积网络。然而,使用了DarkNet的YOLO检测模型的参数量大小达到了240 MB,对于目标检测任务而言依然过大。本文通过轻量化方法重新设计YOLOV3[14]、YOLOV4[15]的主干网络,来对输入图像进行特征的提取。得到训练模型后,再使用int8量化[16]的模型压缩技术,将训练好的目标检测模型参数进行量化,将原先模型中的浮点值转换为int8的整型值来压缩模型大小。最终,在保证检测精度几乎不下降的同时,将模型所需的空间压缩到约5 MB大小。
基于CNN的目标检测模型的计算量和参数量主要由卷积层、全连接层来决定。因此,现有模型加速方法大多从缩减卷积过程计算量的角度考虑。这些方法有对网络模型的参数做压缩,或者重新设计出一种计算开销更低、空间内存消耗也更低的网络结构。
Lin等[17]提出了一种新型网络结构,通过1×1的卷积来增加网络的非线性,同时降低模型的复杂度。为了减少CNN模型的存储需求,还提出移除网络的全连接层的想法,并且使用了全局的平均池化。分组卷积[10]是另一种常用来的降低网络计算量的策略。在2015年提出的GoogLeNet中,大量使用了分组卷积,通过在不同的组中使用不同的卷积核和卷积方式,对分组卷积进行了实验和探讨。在2016年提出的SqueezeNet[18]中通过大量使用1×1卷积和分组卷积的策略,最终实现了对AlexNet约50倍的参数量的压缩,且没有降低精度。2017年提出的ResNeXt[19]网络结构使用分组卷积的方式,其性能在拥有相同量级的参数量和计算量时已经超过何凯明等提出的ResNet[11]网络。在2017年提出的MobileNet网络中提出了深度可分离卷积[20],这种卷积方式将分组卷积的方式几乎可以说发挥到了极致,也就是说,分组的数量等于输入特征的通道的数量,为每个通道分别进行卷积操作。因此,MobileNet可以比vgg16[9]网络在空间上减少32倍的内存消耗、在计算速度上也快出了27倍。当使用深度卷积层和1×1卷积层代替标准卷积之后,MobileNet将大部分的计算量和参数量都放在了1×1的卷积层内。在2017年提出的ShuffleNet[21]网络引入了通道混洗的概念,通过将不同卷积组之间的通道交叉混合,可以在不同卷积组之间的将各自学习到的特征信息交换,从而融合每个卷积组之间单独学习到的特征,显著增加网络对于特征的提取能力和表现能力,ShuffleNet在性能比肩AlexNet的同时,运算速度超过了AlexNet13倍。
本文从当前检测性能和检测速度两者综合考虑,选择了目标检测模型YOLOV3和新被提出来的检测模型YOLOV4,作为本文轻量级网络设计所基于的基础模型。对于轻量级网络的设计,将参考目前最流行的MobileNet系列的轻量级网络设计思想。
本文所设计的small-YOLOV3的整体网络结构如图1所示。
图1 轻量化设计后的small-YOLOV3主干结构
以输入图像大小416×416为例,修改后的网络的特征图在大小为(52,52)、(26,26)、(13,13)时将输出到向外分支。同时,可以看到分支出去的3个输出经过了卷积、上采样、拼接、下采样等操作之后才最终输出。接着小尺寸特征图上在经过3次标准卷积并做了上采样处理后,特征图大小恢复到(26,26),并且和原(26,26)的特征图以通道维度拼接在一起。重复上述操作,经过5次卷积之后输出特征图,并且拷贝输出特征图上采样到(52,52)大小,与原(52,52)特征图能够以通道方式拼接在一起,最后再经过5次标准卷积之后输出。通过这种特征金字塔的结构,将浅层次的特征信息和深层次的语义信息联合起来,能够对最后的目标检测任务精度有极大的提升。
本文的small-YOLOV3参考了mobilenet的设计思想,基础模块的设计见表1。
表1 small-YOLOV3基础模块设计
结构中包含最开始的标准卷积层和15个连续的bneck模块,以及最后3个1×1卷积层和全局池化层。表中bneck模块为MobileNetV3中提出的BottleNeck[20]模块,BottleNeck如图2所示。small-YOLOV3使用大小为3×3,步长为2的卷积核对特征图做下采样,没有使用池化层,并且网络最后都舍弃了全连接层,使用1×1卷积层替代,形成全卷积网络。
图2 包含了SE模块的bottlenet结构
本文的small-YOLOV4在small-YOLOV3的基础上做了结构上的改进,基础模块仍然沿用表1中的结构,但整体网络结果如图3所示,加入了轻量化后的PANet结构和SPP结构、同时去掉了FPN[22-24]网络。
图3 轻量化设计后的small-YOLOV4主干结构
从ResNet引入残差网络开始,从通道角度对特征图信息做融合的方式就开始流行。常见的融合方式有两种:add操作和concat操作[11,12],两者都可以将多个通道的特征图信息融合在一起。ResNet中使用的就是add操作,DenseNet中使用了concat操作。两者融合方式如图4所示。
图4 特征图融合方式
从图4可以看出,add操作是在特征图的数值上进行的,要求两特征图有相同的尺寸、通道数,然后对应通道的对应数值相加,对特征图的通道数不进行操作。而cat操作是在特征图的通道上进行,和add操作一样,要求两特征图有相同大小的尺寸、通道数,但是cat操作是将特征图通道直接合并,增加特征图的通道数量。
cat和add两者操作虽然完全不同,但是对于之后的卷积操作而言两者有很大的潜在联系。对于融合后的特征图而言,如果之后还需要卷积操作,那么add操作就可以看作是,将特征图concat起来,然后将原来用于c个通道的卷积核复制为一个拼接起来得到的卷积结果,相当于经过concat操作之后,再使用对应卷积核处理,只是卷积核中部分通道相同,对应cancat之前的特征图通道。
以式(1)、式(2)为例,假设现有两特征图相融合,通道数都为c,使用X1,X2,…XC和Y1,Y2…YC表示两个特征图,Ki表示卷积核的第i个通道,*表示卷积时的点乘操作。使用concat操作融合的特征图再卷积之后,在一个通道上的特征输出为
(1)
使用add操作融合的特征图经过卷积之后,单个通道上的特征输出为
(2)
可以看出,concat操作在特征图融合后使用了更多的卷积核,因为通道增多的原因。而通过add操作融合后再做卷积运算时,可以看作是对add前的特征图使用了相同的卷积核。所以通过公式可以看出,当特征图之间的通道相差不多时,使用add操作会减少大量的运算。因为concat增加了通道数,相应的运算成本也会增加。add减少了运算融合了新的特征,但同时也会在一定程度上降低原有特征的表达能力。出于目标检测任务的综合考量,为了得到更精准的多层特征图信息,将上采样后的特征图使用cat方式与原特征图相融合。
为了将32位的浮点型参数映射成8位的整型参数,需要建立一种有效的数据映射关系,因为Float32的取值范围在 [(2-2-23)×2127,(223-2)×2127] 内,而int8的取值范围在[-128,127],两者取值范围相差很大,所以缩放因子的选取尤为重要。神经网络假设每一层的输出特征图都是独立同分布的,且近似于真实的高斯分布,而为了得到这样的结果,本文在模型权重初始化时使用凯明初始化[11],同时使用relu[3]激活函数的变种来维持网络中每层卷积得到的结果近似于独立同分布。在此基础上使用了batchnorm[25]策略维持网络的输出分布映射。式(3)表示了由浮点值转化到定点值的过程
(3)
其中,R表示模型中真实的浮点值,Q表示量化后的定点值,S表示量化过程中的缩放因子。而Z值则表示浮点值0量化后对应的定点值。式(4)中表示了由定点值转化到浮点值的过程
R=(Q-Z)×S
(4)
S值和Z值计算公式如式(5)、式(6)所示
(5)
R=(Q-Z)×S
(6)
Rmax表示模型参数中最大的浮点值,Rmin表示模型参数中最小的浮点值。Qmax表示模型参数中最大的定点值,Qmin表示模型参数中最小的定点值。
当卷积核某个通道参数的最大值远远大于卷积核通道数均值时,使用上述公式计算S值做整体缩放,会导致大量有实际意义的参数值被缩放到零点附近,极大地影响模型量化后的精度。所以本文在进行量化缩放前,对离群点都进行了舍弃处理。
模型经过量化后会对每个参数生成对应的S和Z值,之后就可以通过公式求得对应的Q、R值。但是在公式计算Q值或者R值时,仍有可能得到超出原有表示范围的数据,所以在公式计算后还需要对数据按极大极小值做截断处理。
神经网络的卷积计算通常需要对输入的特征图做填充处理,一般情况下都是使用浮点型的0作为填充数据。在量化后的神经网络模型中,对于输入特征图的浮点型数值0需要与之相对应的整型值来表示,也就是Z。在本文中,为避免Z值计算带来的填充误差,将模型参数量化过程中的int8的量化范围定在[-127,127]之间,使整型的零点值对应整型数值0。
量化后,模型推理中的计算使用整型值作为全部数值计算的表示方式。所以,不光是针对模型的权重本身做量化,对模型中传递的特征图也需要在每次激活后做量化,缩放到对应的整型表示范围内。假设特征图激活后的数值范围在[-2.0,6.0]之间,同时假设使用int8量化方式对模型进行量化将数值量化在[-128,127]之间,那么S、Z值的计算过程如式(7)所示
(7)
感知量化[16]是一种在训练过程中对模型参数使用伪量化的操作过程。通过在模型中对每个卷积层与激活层插入观察点,对每次特征图计算得到的数值与权重的最大最小值做记录,并且在浮点值的情况下通过反向传播进行梯度更新。伪量化针对模型的所有权重数值都是以浮点值做四舍五入来模拟,采用int8数值的形式标注。在反向传播过程中伪量化依然使用浮点值做计算。具体过程如图5所示。
图5 感知量化过程
因为模型在感知量化训练时对所有数据集都做了训练,故可以对float整型缩放得到的int8数值不断进行调整,以适应模型中激活层和卷积层中不同分布范围的问题,并且对不同的分布范围计算其缩放系数S。对于同一参数的缩放系数需要经过不停的调整以得到最终能保证模型精度的数值。
由于通过感知量化的方式可以极大程度上保证原有模型的精度不受损失,而目标检测任务对模型精度又有极高的要求,所以本文采用了感知量化的方式对模型进行int8的量化处理。
Pascal VOC挑战赛作为视觉对象的分类识别和检测的一个基准测试,提供了具有优秀注释的图像数据集和标准的评估系统。从2005年开始,该挑战赛每年都会提供具有一系列类别的带标签图片,供挑战者完成自己的算法训练。最初VOC(a publicly available dataset used for benchmarking object detection)数据集[26]只包括4个类别的图像,在2007年时增加到20个类,包含人类;动物(鸟、猫、牛、狗、马、羊);交通工具(飞机、自行车、船、公共汽车、小轿车、摩托车、火车);室内(瓶子、椅子、餐桌、盆栽植物、沙发、电视)等生活中最常见的物体,可以很好丰富目标检测任务的实用性。然而在20个类别中,由于人类及动物类别占据了大多数,剩余其它类别样本的数量较少,因此深度学习方法难以借助其庞大数据驱动的特性发挥作用,导致CNN的目标检测算法在这样的数据集上获得的分类检测结果不佳。
现有的VOC数据集主要包含两个版本,VOC2007和VOC2012,VOC2007数据集一共包含9963张图片,其中训练集包含5011张图片,测试集包含4952张图片。VOC2012数据集共包含17 125张图片,目前公开的训练集有11 540张,测试集未公开。VOC数据集图片以JPG格式作为存储方式,以年代、下划线、序号作为每张图片的名字。VOC数据集中的图片没有统一的尺寸,一般纵向图为(375*500),横向图为(500*375),图像之间的尺寸各有相差,但是偏差值都在100以内,在训练过程中,会对图片做缩放处理,达到在不丢失图片原有信息或增加额外噪音的基础上,对图片的尺寸进行统一的目的。VOC数据集的标签通过XML文件格式来表现,每一张图片都有其唯一对应的XML文件,其中包含了图片的名称、尺寸、是否可以用于实例分割、检测到的物体、物体类别、目标是否难以识别、目标的具体坐标等详细信息。
本实验通过对现有的公开数据集进行梳理最终得到可用于目标检测的数据集设置见表2,训练集选取了VOC2012和VOC2007训练集中的图片共15 942张,而测试集则选取了VOC2007测试集中的3987张图片。
表2 数据集使用方式
对于训练好的目标检测模型,一般使用mAP(mean average precision)作为评估指标。mAP通过计算每一个类别中的recall和precision得到对应类别的AP值。
Recall的计算如式(8)所示
(8)
Precision的计算如式(9)所示
(9)
式中:TP(true positives)代表有A、B两个类,预测类别为A同时真实类别也为A的情况,而预测类别为A但真实类别为B的则称为FP(false positives),预测到B真实类别同时也为B的称为TN(true negative),预测到为B实际类别却为A的称为FN(false negative)。
AP的计算需要以recall值和precision值分别为横纵坐标划建立坐标系,以不同的IOU阈值计算在不同情况下对应的recall值和precision值,然后将这些值绘制成为一条曲线,通过计算曲线下的面积来得到对应类别的AP值,所有类别的AP值的平均值就是文中所用的mAP指标。如图6所示,图6中统计了VOC数据集中20个类别的预测AP值,最后求得mAP。
图6 单次预测VOC数据集各类别mAP统计
本实验使用One Hot编码方式对VOC数据集的20个类别做编码,训练数据集的图像大小为416×416。通过经验以及多次实验的验证,超参数设置见表3。
表3 网络中的超参设置
由于图像尺寸偏大,而GPU可利用的显存是有限的,因此在本实验中将batch_size设置为32,最大步数设置为149 400。
考虑到VOC数据集数据量的不充分,以及在实时任务中对目标检测算法所要达到极高精度的要求,本实验的训练采用大量的迭代同时对模型进行调整。为避免训练后期学习率过小,导致模型无法从局部最小值逃逸,采用余弦退火学习率作为本实验网络的学习率调整策略。首先选取0.001作为前100个epoch的初始值学习率,其次对后200个epoch,将学习率初始值设置为0.0001。
本文将轻量化设计后的网络small-YOLO3、small-YOLOV4与未对PANet、SPP做轻量化设计的small-YOLOV4,以及现有的YOLOV3、YOLOV4、YOLOV4-tiny、YOLOV3-tiny网络和滑铁卢大学在19年10月提出的YOLO-nano版本进行了实验对比,结果见表4。
表4 最终实验对比结果
实验结果显示,small-YOLOV3相比YOLOV3在精度只下降了4.6个百分点情况下模型参数量缩减到原来的1/13;而small-YOLOV4参数量相比YOLOV4在精度只下降了2.9个百分点的情况下模型参数量缩小到原来的1/12。对于轻量化后的small-YOLOV4网络,其精度、参数量相比YOLOV4-tiny、YOLOV3-tiny都具有更优的效果。对YOLO-nano而言,由于其牺牲了大量的精度来换取模型本身参数量的减少,所以导致精度很低。
实验结果表明,通过对YOLOV3、YOLOV4做新的轻量化设计得到的轻量化目标检测模型已经大幅度减少了计算量和参数量,在识别精度可接受范围内检测速度大幅度加快,基本可以用于实际的目标检测任务。
本文进一步对已训练好的small-YOLO3、small-YOLOV4模型做了int8的静态量化和感知量化对比实验,结果见表5。
表5 量化实验对比结果
实验结果显示,训练后量化和感知量化对于模型的压缩效果是一样的。训练后量化对于轻量化目标检测模型会产生较大的损失,原因是由于目标检测对于预测框的精度要求很高,而训练后量化的精度损失对目标检测模型造成了较大的影响。但感知量化方式得到的量化模型则能以较小的精度损失换取4倍大小的模型压缩。
本文针对某些部署在小型设备上的目标检测任务,基于现有的一阶段检测算法,提出了采用轻量级网络设计思想的small-YOLOV3、small-YOLOV4目标检测模型。虽然目前基于深度学习的一阶段目标检测算法在检测时间上和检测精度上都做到了较高的水平,但需要建立在强大的硬件算力和功耗支持上,因而无法应对具体的目标检测任务。本文提出的模型对YOLOV3、YOLOV4算法通过特征提取主干结构重新设计了网络,同时在重构的轻量化网络模型的基础上采用压缩量化方案,最后将设计好的small-YOLOV3、small-YOLOV4模型在VOC数据集中进行测试,并与未采用轻量化的方法进行对比。本文设计的轻量化目标检测模型以几个百分点的精度换取了接近十三倍的模型空间压缩。
在未来的工作中,对于模型的性能的提升可以通过对数据集进一步的丰富,同时做更多的迭代训练;也可以选择更多的模型压缩算法,即在使用int8量化之前对网络进行裁剪。