目录
前言
尽量平衡硬件成本和性能。因此,如何在保持高检测精度的前提下,尽量提高检测速度、减小模型体积,成为这项技术真正深入工业实际应用的关键。
而目标检测的王牌家族——YOLO系列模型,作为单阶段目标检测算法的代表之一,一经出世,便以快速精准的检测效果而迅速蹿红。其不仅在速度上做到真正实时,精度上也可以达到很多非实时两阶段模型才有的水平。
尽量不增加模型计算量和推理开销为前提,它们大量整合了计算机视觉的state-of-the-art技巧,探索出了一整套更深度的算法优化秘籍,例如在数据增强、锚定框、骨架网络、训练方式等维度进行优化,从而达到大幅提升YOLO目标检测性能的效果。
PP-YOLO所应用的这套优化策略,也可以被尝试应用到该系列的其它模型上,产业开发者或者科研人员可借鉴这套优化算法展开进一步的探索。当然,我不只是写PP-YOLO的优化方法,也会拓展其他的方法,只是以PP-YOLO为线展开阐述优化的策略。
一、PP-YOLO深度解析
YOLOv3及优化模型
PP-YOLO深度解析
PP-YOLO
- 基于YOLOv3的优化模型
- 尽量不引入额外计算量大的trick
- COCO mAP=45.9%,V100 FPS=72.9
- 精度速度均优于YOLOv4
PP-YOLO模型结构
二、YOLO优化策略详解
YOLOv3精度速度优化
精度优化
- 图像增强:image_mixup等
- bbox中w,h使用L1 loss代替L2 loss
- 训练策略:warm-up, label smooth
- Synchronized Batch Norm
训练速度优化
- 深度优化的yolov3_loss OP加速训练
- 可配置的多进程异步reader,共享内存加速
- 预处理深度优化,训练速度提高
推理速度优化
- yolo_box OP将端侧推理有流程在GPU上并行加速。
0. 目标检测模型优化方法
数据增强
Image Mixup: 以随机权重将两张图片混合起来,提高网络在空间上的抗干扰能力。以下图为例,将任意两张图片加权叠加作为输入,训练过程中使用的损失为两张图片的损失乘以各自权重的加和。
AutoAugment:使用强化学习的方式训练,预先定义好图像增强的方法池,然后自动在这个方法池选择一个合适的方法。
Image Mosaic: 图像镶嵌的方法,将四张图片以田字格的方式镶嵌在一起。即每次读取四张图片,分别对四张图片进行翻转、缩放、色域变化等,并且按照四个方向位置摆好,进行图片的组合和框的组合。yolov4用到了这个方法,pp-yolo没有用到。优点是丰富检测物体的背景!且在BN计算的时候一下子会计算四张图片的数据!
但在整体的数据集中,小、中、大目标的占比并不均衡。
如上表所示,Coco数据集中小目标占比达到41.4%,数量比中目标和大目标都要多。
但在所有的训练集图片中,只有52.3%的图片有小目标,而中目标和大目标的分布相对来说更加均匀一些。
针对这种状况,Yolov4的作者采用了Mosaic数据增强的方式。
主要有几个优点:
a. 丰富数据集:随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好。
b. 减少GPU:可能会有人说,随机缩放,普通的数据增强也可以做,但作者考虑到很多人可能只有一个GPU。
因此Mosaic增强训练时,可以直接计算4张图片的数据,使得Mini-batch大小并不需要很大,一个GPU就可以达到比较好的效果。
此外,发现另一研究者的训练方式也值得借鉴,采用的数据增强和Mosaic比较类似,也是使用4张图片(不是随机分布),但训练计算loss时,采用“缺啥补啥”的思路:
如果上一个iteration中,小物体产生的loss不足(比如小于某一个阈值),则下一个iteration就用拼接图;否则就用正常图片训练,也很有意思。
Mosaic数据增强
Yolov4中使用的Mosaic是参考2019年底提出的CutMix数据增强的方式,但CutMix只使用了两张图片进行拼接,而Mosaic数据增强则采用了4张图片,随机缩放、随机裁剪、随机排布的方式进行拼接。
这里首先要了解为什么要进行Mosaic数据增强呢?
在平时项目训练时,小目标的AP一般比中目标和大目标低很多。而Coco数据集中也包含大量的小目标,但比较麻烦的是小目标的分布并不均匀。
Random Erasing: 随机擦除数据增强技术是在训练中,随机擦除随机选择图像中的一个矩形区域,并用随机值擦除其像素。效果如下图所示,从随机擦除的效果图上可以看出,该数据增强方式的提出主要针对遮挡问题。通过随机擦除目标的特征模拟遮挡的效果,提高模型的泛化能力,使模型在训练过程中仅通过局部特征对目标进行识别,强化模型对于目标局部特征的认知,弱化模型对于目标全部特征的依赖。模型通过这样的数据进行训练,将会对噪声和遮挡更具鲁棒性。
配置
数据采样/正负样本采样
OHEM:在线的难样本增强,比如遮挡,缺失等这些样本调整他们的权重。
Class aware Sampling: 冠军解决方案中使用到的一个方法,在一个训练集中,实际上每个类别数据并不一定是均衡的,有可能还有很大的差距,它通过统计这个样本的出现的类别的概率,来调整这个样本的权重,实现一个样本的采样方法。
网络结构:
学习策略
调整loss权重:分类,回归,obj,适当调整loss权重
Grid sensitive:学习网络中心点偏移的方法
1. YOLOv3-DarkNet53优化
2. PP-YOLO精度提升历程表
3. 数据增强
数据增强是在CPU上做的。
3.1 Image Mixup(图像混合)
图像分类的一个方法,可以模型抗空间扰动的能力。
以随机权重将两张图片重叠起来混合成一张;比如下图的羊,对于STOP来说就是一个空间扰动,相反的,STOP相对于羊来说,也是一个空间扰动;他们之间互为空间扰动,在网络同时学习这两张图像,那么就能提升网络对空间扰乱的抗干扰能力。其过程就是将任意两张图片加权叠加作为输入,训练过程中使用的损失为两张图片的损失乘以各自权重的加和。
yolo模型的思想是使用了一个“锚框海”战术,也就是很多锚框,但是真实框比较少,导致正例很少,负例很多,也就是样本倾斜的问题,那么一定程度上将两张图片叠加在一起,那么真实框就多了些,只是会加上一个权重。由原来的一个、两个真实框变成了三个真实框。一定程度就提升了正样本的比例,实际上有利于提升yolo的召回率的。
优点:
1)提高网络对空间扰动的泛化那能力;
2)一定程度上增大了正样本的比例,提高了召回率。
计算方式:
- Sheep像素乘0.7与Stop Sign像素值乘0.3,左上角对齐叠加;
- Sheep的真实框(gt bbox)引入的loss乘0.7+Stop Sign的真实框引入的loss乘0.3。
效果:
COVO数据集精度提升~=1
只需要在预处理上添加IMixup Image(P可以一键式实现)
3.2 Random Erasing
随机擦除数据增强技术是在训练中,随机擦除随机选择图像中的一个矩形区域,并用随机值擦除其像素。效果如下图所示,从随机擦除的效果图上可以看出,该数据增强方式的提出主要针对遮挡问题。通过随机擦除目标的特征模拟遮挡的效果,提高模型的泛化能力,使模型在训练过程中仅通过局部特征对目标进行识别,强化模型对于目标局部特征的认知,弱化模型对于目标全部特征的依赖。模型通过这样的数据进行训练,将会对噪声和遮挡更具鲁棒性。
Random erasing 算法流程如下,主要包含两个部分:
区域大小的随机;
位置的随机。
主要流程如下:
由于random erasing的应用具有图像分类和目标检测两种不同的场景,二者的区别在于是否知道目标所在的位置。对于这两种情形:
- 图像分类
在原图中随机选择擦除区域; — 漫无目的的擦除 - 目标检测
- 在原图中随机选择擦除区域;(IRE)
- 在每个b-box上独立执行random erasing,即此时b-box相对于图像一样成为一个独立的个体;(ORE) — 由指导的擦除
- 在图像和目标b-box上随机选择擦除区域。(I+ORE)
具体如下图左图所示。
将Random Erasing与Random Croping结合,在随机剪切的图像上添加随机擦除,如下图右图所示。
3.3 Cutout
Cutout与random earsing的出发点是一致的,都是针对机器视觉中存在的目标遮挡问题。通过对训练数据模拟遮挡,一方面能解决现实中遮挡的问题,另一方面也能让模型更好的学习利用上下文的信息。
两种Cutout的设计理念:
- 开发了一种有针对性的方法,专门从图像的输入中删除图像的重要特征,为了鼓励网络考虑不那么突出的特征。做法为删除最大激活的特征,具体是:在训练的每个epoch过程中,保存每张图片对应的最大激活特征图(输出的最大特征激活点),在下一个训练回合,对每张图片的最大激活图进行上采样到和原图一样大,然后使用阈值划分为二值图,盖在原图上再输入到cnn中进行训练。因此,这样的操作可以有针对性的对目标进行遮挡。如下图所示。
- 对于上述操作的进一步理解:由于网络经过训练后,输出特征的最大激活点会围绕在目标区域中,并且由于有针对性的遮挡,输出的最大激活点的位置(将要遮挡的位置)将不同于本次输入的位置(原先的位置已遮挡,此时不可能被激活),也就是说,在训练的每一代中,可以围绕目标的不同区域进行动态遮挡训练。而不像之前对输入图像进行数据增强,一张图片在整个训练过程只有一种遮挡模式。该操作有些像dropout,每次训练中都随机性的选择参与训练的节点,当然也势必会带来收敛速度的减慢。
- 虽然通过理论感知,这种有针对性的遮挡要比单纯随机遮挡高效,但实际效果区别却差不多,(至于为什么效果区别不大,并不理解,可能受二值化阈值的影响,需要自适应?仍有待继续研究)反而这种增加了更多计算量和内存,得不偿失。
- 另外一种设计理念与random erasing及其类似,但实施起来要比random erasing简单,具体操作是:选择一个固定大小的正方形区域,然后将该区域填充为0即可,为了避免全0区域对训练的影响,需要对数据中心归一化到0。并且,与random erasing不同的是,其以一定概率(50%)允许擦除区域不完全在原图像中。
4. 网络结构
骨干网络可以说是一个模型的基础,一个优秀的骨干网络会给模型的性能带来极大的提升。
1. ResNet-D
ResNet50vd-DCN 作为模型的骨干网络。它可以被分为ResNet50vd和DCN两部分来看。
优化点:
- 每个阶段的下采样block丢失了3/4的信息
优化方法:
- 修改和调整stride=2的位置;
ResNet50提出后,对他提出了B C D三种改进,这些改进结构,主要改进的是:ResNet50有五个阶段,每个阶段都会做一个倍数为2的降采样,这样采样主要是通过上图右边的方式实现的。stride=2降采样。1x1卷积,步长为2,所以就取到第一个,第三个,…的格子,实际上,每四个格子就之只取到一个格子,就丢失了3/4信息。ResNet-D 包含全量的信息。最新的ResNet-D结构能在基本不增加计算量的情况下先住提高模型精度。右边avgPool。
支持ABCD四种版本。
效果:
- 预测速度不变,各模型精度提高1~2.
ResNet50不用DCN精度会下降吗?
ResNet50在各个阶段用DCN做了大量实验,在第五阶段加入DCN,精度有提高,这个预测速度不会下降太大。如果要是把DCN减掉的话,DCN有1~2个点的提升。
2. DCN(Deformable Conv)
可变性卷积。我们大家在学习卷积的时候,普遍是学习这个卷积核的权重,而卷积核是固定好的,比如说1x1,3x3等的方块,也就是说我们固定了是一个方块,那么这些方块真的适用于检测所有的目标呢?或者说,我们能不能在学习这些卷积核的权重的时候,能不能同时学习它的形状呢?这就是可变性卷积提出的思路。
怎么做的呢?
它通过额外学习一个offset,学习这个卷积的偏移,也就是说从原来第一个绿色框偏移到它左边的蓝色框,它不采集原来这样一个点;另外呢,它v2版本里还采用了一个mask,比如说不算第一个绿色框左边的蓝色框的点,而算它上面的一个蓝色点,通过这个方式,在网络的过程中,不仅能学习这个卷积核的权重,还能学习这个卷积核的形状,或者我到底能学习哪个值,比如下图,即学习到了羊的权重还学习到了这个羊的形状,那么就没有人比这个卷积更懂什么是羊。
优化点:
- 能否在学习权重的时候需也学卷积核形状?
优化方法:
- 学习一个offset表示卷积核偏移(v1)
- 再学习一个mask表示哪些点该计算(v2)
实现方法:如下图优化方法
效果:
- ResNet50vd-DCN作为backbone,精度提高0.2(38.9->39.1),预测速度大幅度提升(58.2
-> 79.2FPS)
小结DCN的特点:其卷积核在每一个元素上额外增加了一个可学习的偏移参数。这样的卷积核在学习过程中可以调整卷积的感受野,从而能够更好的提取图像特征,以达到提升目标检测精度的目的。但它会在一定程度上引入额外的计算开销。经过多翻尝试,发现只在ResNet的最后一个stage(C5)增加可变形卷积,是实现引入极少计算量并提升模型精度的最佳策略。
FPS不是由DCN提升的,是ResNet50改为使用ResNet50vd结构作为骨干网络提升的,加入DCN小幅的下降了FPS,但是还是比原来的大。
这就是网络结构上的优化。
进一步,我们使用了更大BS,stride.
3. DropBlock
注意防止过拟合。dropout的一种变种。
常用的减少过拟合,提升网络泛化能力的一种方法。
对于一个目标检测的任务来说,学习这个目标检测,比如学习下面的这只狗,实际上它学习的是狗右边蓝色的连通域,它检测就是检测这个连通域里的这个东西。那么中间零散的点的丢弃就没有这种特征块一块一块点的丢弃更适用于这周目标检测的任务。怎么理解呢?实际上,这是一个尺度的问题,也就是说这种点级别的丢弃会怎么呢?比如两只小狗,一直没有耳朵,一只没有尾巴,真奇怪,模型可能就不认识,但是要是一丢,就丢掉了这只狗,那么模型无非就是检测出来还是检测不出来的问题,可能就能让模型学习到一个更好的效果,这就是DropBlock的这个概念。
换言之:相比于Dropout算法,DropBlock算法在Drop特征的时候不是以特征点的形式来Drop的,而是会集中Drop掉某一块区域,从而更适合被应用到目标检测任务中来提高网络的泛化能力。
优化点:
- Dropout是深度学习中常用的减少过拟合,提高网络泛化能力的常用方法,是否适用于检测?
- DropBlock每次drop掉一块区域而非零散的点,更适用于“检测连通域”的目标检测任务。
计算方法:
以随机drop块的方式代替随机Drop离散的点。
4. Grid Sensitive
实际上,yolov4引入的一个方法。即在计算预测框中心点在网格内的坐标时,对输出logit取sigmoid激活后,再加上一个缩放和偏移,可以保证预测框中心点能够有效的拟合真实框刚好落在网格边线上的情况。
YOLOv3的检测原理是将图片划分成多个网格,真实框的中心点落在哪个网格上就由哪个网格负责检测这个真实框,而推理输出特征图中包含预测框中心坐标的logits值,这个值经Sigmoid激活后,即表示预测框中心坐标在网格中的相对位置。如下图所示,预测框的Px和Py经Sigmoid激活后,即表示预测框中心坐标相对真实框中心坐标gx和gy的偏移。
要是这个真实框的中心点刚好落在网格边缘,换言之,你的偏移量是向0或者1去学,那么对于使用sigmoid激活的输出特征图来说,它就要向正无穷和负无穷去学(训练过程中趋向于把输出logit值向正负无穷去学习)。这样的话,就会引入一个模型的过拟合。那么yolov4就引入了一个Grid Sensitive。它是干嘛呢?它就是说,我不直接算偏移量,而是在这个偏移量上乘一个系数,你可以理解为,它实际偏移要比这个网络要大一点,那么你这个网络里面就不是0和1,就是一个大于0小于1的值。PP-YOLO选的1.05。只是增加了一个S的运算,它的预测速度基本没有影响,精度有所提升(0.3)。
换言之,Grid Sensitive:在计算预测框中心点在网格内的坐标时,对输出logit取sigmoid激活后,再加上一个缩放和偏移,可以保证预测框中心点能够有效的拟合真实框刚好落在网格边线上的情况。
5. 网络结构-- 特征提取优化
1. Coord Conv – 特征提取优化
卷积之所以提出来,是因为它的局部感受野,也就是说,我看一张图,我就看他的局部,一个狗无论在图像的左上角还是右下角,它都是狗,因为我只需要看它周围的这一块东西,我就可以认出来它是一只狗。这只狗具体在图像的哪个位置,没有关系。这就是卷积提出来的一个概念。但是,我要是给它感知到一个全局的坐标有木有用呢?打一个比方,那如果这个狗在图像的左半部分没有了或者是在图像的右半部分没有了,它还是一只狗吗?你的网络还能认出它吗?那么在这个时候,要是它同时能感知到一个全局的坐标,就有利于你模型的检测,那么怎么做呢?我们就给这个卷积增加两个通道,传入x,y坐标信息,这个卷积就能搞定定位。这个卷积不仅能知道它的局部信息,还能知道自己的定位,那么特征提取的效率就更高了,所以PP-YOLO里加入了少量的Coord Conv,由于是少量,所以预测速度影响较小,精度有所提升。
坐标不做反向传播学习,因为是加入进去的,类似说,x+y=z,你的y是一个常量,只需要学习x。
换言之:我们知道深度学习里的卷积运算是具有平移等变性的,这样可以在图像的不同位置共享统一的卷积核参数,但是这样卷积学习过程中是不能感知当前特征在图像中的坐标的。CoordConv就是通过在卷积的输入特征图中新增对应的通道来表征特征图像素点的坐标,让卷积学习过程中能够一定程度感知坐标来提升检测精度。
2. SPPNet(空间金字塔池化)-- 特征提取优化
SPP优化特征提取的一个方法,如下图所示通过多个不同尺度的池化窗口提取不同尺度的池化特征,把特征组合在一起作为输出特征,在骨干网络提取特征后加入空间金字塔池化,能有效的增加特征的感受野,是一种广泛应用的特征提取优化方法。PP-YOLO在骨干网络输出特征图附近加了一个SPP,对预测速度影响比较小,精度有所提升。
使用CoordConv和SPP两种特征提取优化方法后,精度进一步提升了0.8%(43.5%->44.3%), 这两种方式新增的推理计算量并不大,所以推理速度仅有少量下降
6. 学习策略
1. IoU Loss
计算:实时的计算预测框的Iou 将它的负值加入loss中
2. IoU Aware
目标检测里面,有的检测框定位精度不高,不高的原因是怎么呢?yolov3目标检测里面,使用的是“锚海”战术,每一个目标,我们给它输出很多个目标检测框,可能就会出现这种情况,比如说右图中的第一个斑马,正方形的框,IoU=0.65,S=0.65,而长方形的IoU=0.95, S=0.6,根据NMS,就会把长方形的框过滤掉,留下定位不准的正方形的框,这个框的检测精度反而不高了,在yolo里面这个问题的出现也很常见。
yolo里面为啥经常会出现这样情况呢?
yolo的评分的计算方式是这个框里面有物体,并且是对应的类别,然后将两者相乘,来作为预测框的score。(即,YOLOv3模型里的预测框评分score = objectness score * classification score,该预测框处存在目标的概率和对应目标类别的概率的乘积。)我们就发现这个score与定位精度半毛钱关系也没有,只是目标概率和目标分类的一个评分,所以才出现这种情况。(也就是说此种评分方式并没有考虑预测框的定位精度。而目标检测模型都需要对最后的预测框进行非极大值抑制(NMS),即按照预测框评分进行排序,然后删除得分低的框。)
怎么解决呢?
既然它没有定位因子,那么我们就把定位因子加到score中去。实际上,就是把这个定位因子实时的计算出来,乘到这个score上去。具体计算方法如下图。大概的指导思路就是说实时的计算IoU把它作为定位精度,乘到score中去,来通过这个定位精度来调整这个score,让定位精度高的score排在前面,避免向斑马那种,定位精度低的检测框把定位精度高的检测框过滤掉的情况。
loss_weigth是调整loss权重,比如说之前分类loss和回归loss直接加在一起,现在呢,比如说把分类loss乘以2.0,也就是有2.0的权重,再和回归loss加在一起。其实,最终的loss是各个分量的加权和。
由于我们每个预测框增加了一个通道了来学习IoU,所以由原来输出通道数B*(5+C)变成了B*(6+C)。所以推理速度有小幅的下降。
使用IoU Aware可以很好的避免这种情况,即在训练过程中增加一个通道来学习预测框和真实框之间的IoU,在推理过程中,将这个通道学习的IoU预测值也作为评分的因子之一,这样就能一定程度上避免高IoU预测框被挤掉的情况,从而提升模型的精度。同时,由于只是输出层的每个anchor上增加了一个通道,对于推理计算量的增加也基本可以忽略不计。
a和β是超参,李牧论文之前写过,要是阿发和β都等于1.5的时候,精度是更高。
网络不是从0开始训练的,主干部分网络是使用分类里面的一个在image数据集上训练的好的权重加载进来的。后面head部分是使用随机初始化的。没有冻结训练,yolov3的所有层都训练的。不用预训练模型,理论上会下降的,建议主干网络预训练模型
- Label Smooth(标签平滑)
其实也是图像分类中的优化方法;用在yolov3主要是为了提升单独的分类通道进行目标分类,主要是为了提升分类通道的分类精度。
具体原理:yolov3使用的分离的激活函数都是sigmoid,如下图曲线,对于分类都是一个硬标签,也就是说,真实类别是1,其他类别为0。对于sigmoid来说,想取到1或者0,就要它的输入取到正无穷或者负无穷。也就是说,我们要讲输出特征图里面那个特征对应的特征点学习到负无穷或者正无穷,过犹不及,容易过拟合,降低分类的精度。那么有一个办法,就是小量扰动硬标签,变为软标签,这样 就可以有效解决这个问题。
怎么呢?
通过在真实的分类标签one-hot编码中真实类别的1上减去一个小量,非真实标签的0上加上一个小量,将硬标签变成一个软的标签。即,对于真实类别,它的类别标签对于的是1,我们让1减去一个小量,sigmoid只要取得是小量,就不会是负无穷,而且它的值能下降很多;对于0,我们给他加上一个小量,小量扰动硬标签变为软标签,这样就可以起到正则化的作用,防止过拟合,提升模型泛化能力。(0.05–0.95)
小量可以取1/80; 1/40
7. 训练策略
1. Larger Batch Size/learning rate/迭代次数等
1)Batch Size调大了,学习率也要等比例的对应的增大。
适当增大训练的batch size(例如,将单卡的batch size调整到24,8卡总batch size为192,使训练更加稳定,获取更优的结果)。
以上为训练的策略。现在引入IoU loss
2) PP-YOLO中使用的是2x Scheduler
比如说之前的模型都是用25万次迭代,这里我们将迭代次数扩到两倍,也就是训练50万,精度又有所提升。1层、2层、3层可能有所提高,4层也许就下降了。
小结:
将训练迭代次数和学习率衰减的迭代次数调整至和原始YOLOv3模型的迭代次数一致,也就是训练迭代次数从25万次增加到50万次,对应学习率衰减的迭代次数调整至40万和45万,使PP-YOLO模型(如表中的K模型所示)在COCO minival数据集精度再次提升0.5% ,达到45.3%,单卡V100上batch size=1时的预测速度为72.9 FPS。如果使用COCO test_dev2017数据集测试,精度将达到45.9%。
2. Synchronized Batch Norm(同步批归一化)
卡间同步的批归一化
它是计算机视觉模型里最常用的归一化方式,多卡训练时,一般实现的批归一化只统计单卡上均值和方差,而检测任务中,受显存的限制,batch size比较小,多卡同步,会使得均值和方差统计的更加准确。
通俗地讲:多卡训练的时候,卡间同步训练的开销比较大,它为了实现简便,卡1分配到的数据,只计算卡1分配到的数据的均值和方差,这样卡1的数据就相对比较独立了,Synchronized Batch Norm它的方式是,每做一次Batch Norm的时候,会在卡间同步这些均值和方差,这样就可以在多卡训练类同在一卡训练,某种程度上,也就是相当于增加了Batch Norm的batchsize,这样均值和方差计算就更加合理,收敛速度和效果也会更好。对于训练性能也是影响不大的。
实现方法,如下图计算方法:
3. EMA(Exponential Moving Average)滑动平均功能
滑动平均是指将参数过去一段时间的均值作为新的参数。相比直接对参数进行更新,采用滑动平均的方式能让参数学习过程中变得更加平缓,能有效避免异常值对参数更新的影响,提升模型训练的收敛效果。
价值投资里使用的方法。也就是,对于一个波动比较大的一个数值,每个点的数值取它历史滑动窗口的加权平均值来代替这个点的实时数据。怎么理解呢?稳,就不斗,也就说。(指数滑动平均)历史滑动平均将学习的梯度的上下抖动平滑掉,那么我们模型在训练学习过程就更加平缓稳定。
EMA(模型指数的滑动平均)某种程度上就是为了优化梯度和loss抖动的。
优化点:
- 价值投资中通过计算历史波动的指数滑动平均值来衡量价格的走势
- 模型训练过程中,对参数进行历史滑动平均来让训练过程更平缓稳定。
计算方法:
4. SSLD–预训练模型
我们的骨干网络是有预训练权重的。
SSLD中文是简单的半监督知识蒸馏。
无监督的蒸馏方法。
蒸馏的原理:现在我们的模型学习是有标准答案的学习。一个小模型使用一个更大的精度更高的模型取指导它取学习,去监督它取学习,这样就能提升小模型的分类精度,但不影响小模型的结构,也就是预测速度不变,精度有所提升。
8. 后处理
1. Matrix NMS
NMS是排在前面的预测框往后问,IOU大于一个值,就删除一个后面一个框。比如说下图中两只马,他们靠的比较近,刚好还是同一个类别,他们会走到同一个NMS里面去,他们是两个是同一个类别,但不是同一个物体,这就存在了前面概率高的(0.95)就会把后面概率低的预测的马就会过滤掉。那么怎么来解决这个问题呢?那么就有人提出了soft NMS,它不是直接删除,而是乘以一个惩罚系数(小于0的系数),然后向后排。让这个框继续保留下来,下面的预测中再起作用。
soft NMS就会引入一个问题,原来NMS直接删除一个,计算量每计算一个,计算量就会减小一次,而softNMS并没有删除,而是把计算权重做了调整,它还是存在这个排序队列里面的,那么计算的复杂度就会大幅增加的,而Matrix NMS是对他做了一个并行的计算,将原来顺序式一个计算过程,变成一个矩阵式的计算过程,这个矩阵里面计算什么呢?算任意两个预测框之间的IOU值(对角算没有意义)填到这个矩阵里面。由于这个矩阵的嘛,矩阵都可以并行化,每个元素之间是不干扰的,那么我们就可以使用GPU并行的去做这个计算,来提升这个NMS的计算过程,可是我们只是做了box没有用,最终还是要做他们之间抑制不抑制,然后去的一个排序,这一些列复杂的操作,那么Matrix NMS在做这些的时候,也取了一个近似,也就是说它去看哪些可能抑制我的最大IOU是多少,相当于做了下图的一个近似,这个计算过程还是有点复杂的,就不做详细的展开了,感兴趣可以取看一下论文。
在推理过程中,NMS还会删除与得分高的框的重合度大于一定阈值的其它预测框,这样对于存在两个同类别物体重叠的的图像检测任务来说,就会出现一个物体的预测框把另一个物体的预测框抑制掉的情况,导致漏检。
因此又引入了Soft NMS这个概念,其解决思路并不是粗暴的将与得分高的预测框重合度大于阈值的框直接滤除,而是降低这个预测框的评分,对预测框评分的惩罚系数与这两个框的重合度,也就是IoU正相关,采用这种软化的滤除方式就能有效的避免重叠的同类物体预测框互相冲突的情况,提高检测的精度。
但引入Soft NMS会使推理速度变慢。因此此轮模型优化采用了更优的Matrix NMS:一种并行化进行Soft NMS的实现思路。Matrix NMS通过一个矩阵并行运算的方式计算出任意两个框之间的IoU,例如对某一个预测框B计算抑制系数时,Matrix NMS通过矩阵并行方式计算出所有得分高于B的预测框与预测框B的IoU,然后根据这些IOU和得分高于B的预测框的被抑制概率做近似估算,估算出B的抑制系数,从而实现并行化的计算Soft NMS,在提高检测精度的同时,避免了推理速度的降低。
使用Matrix NMS后,模型在推理速度几乎不变的情况下提升0.7%的精度。
三、工业案例–无人电力巡检低成本部署方案
1. 无人巡检应用场景
2. 项目背景
输电线路环境检测
- 边缘节点摄像机实时采集图像
- 端侧节点模型实时检测安全隐患
- 安全隐患上报可视化管控平台
- 人员复核和检修
注意:前端智能在线检测装置里面烧拷了检测模型。
步骤如下:
- 输电线路可视化智能管控平台及时告警;
- 可视化智能管控平台再次传回的前端智能分析图;
- 消防人员赶到火灾现场展开扑救工作
- 火情得到了有效控制,输电线路安全运行
3. 方案选择
3.1 项目难点
- 复杂环境下多尺度多目标检测
- 已部署的智能监控设备低端嵌入式芯片,算力小,功耗低
- 监控设备留给模型内存余量200M
- 准确率,误报率,漏检率有较高要求,速度需要达到秒级
3.2 方案选择
精度达到了要求,但是速度太慢,模型太大
4. 解决方案
- 训练:精度和预测速度性价比高的YOLOv3-MobileNetV1模型
- 剪裁+量化: 减小模型大小和计算量
- 蒸馏: 提升模型精度,teacher模型YOLOv3-ResNet34
- 部署:PaddleLite
剪裁:也就是常说的卷积通道剪裁,就是通过卷积中冗余的通道裁剪掉,就相当于说,它的输出通道变少了,那么这样的话就一定程度上减小了模型输出的大小。C变少了,减少了模型的计算量。
量化:将f32的计算和模型量化成为int8.也就是8位整形的一个模型,那么在计算过程中呢,就可以直接使用int8来计算。int8速度要f32快的。
裁剪和量化可能对模型的精度有所降低,所以引入了蒸馏。怎么做的呢?
我们使用YOLOv3-ResNet34去教YOLOv3-MobileNetV1学习(YOLOv3-ResNet34要比YOLOv3-MobileNetV1模型大)。
注:PaddleDetection内置提供剪裁、蒸馏、量化脚本和部署方案,可一键式运行
最终效果:
精度无损,模型大小360m -> 122M,推理时延3.4s -> 2.0s,使用PaddleLite完成监控设备部署
总结
-
YOLOv3企业应用案例
- 模型小,速度快,精度有一定要求,选择YOLOv3-MobileNetV1模型
- 使用卷积通道裁剪+量化压缩模型体积,提升预测速度
- 使用蒸馏提升模型精度
- 基于PaddleLite完成端侧部署
-
PP-YOLO优化
- 骨干网络:ResNet50vd-DCN
- 训练策略:Larger Batch Size + EMA + DropBlock
- 损失函数:IoU Loss + IoU Aware
- 后处理: Grid Sensitive + Matrix NMS
- 特征提取:SPP + Coord Conv
- 其他: SSLD pretrain + 2x scheduler
- 没有用到 Mosaic Image
注意点:
不支持TF;
引起内存爆炸:batch Size调小,lr成倍调小,否则会出现NAN。loss出现Nan,lr调小一点。
MixUp 最后的20个epoch不mixup,之前的epoch都mixup。50 iter 差不多是270个epoch。
BS 32G 24, 训练轮数是25万轮,16G调正为12。