允中 发自 凹非寺
量子位 编辑 | 公众号 QbitAI
工业视觉、自动驾驶、安防、新零售等咱们身边熟知的各行各业都须要目标检测技术,因为其很好的平衡了标注成本、检测精度和速度等,成为当前智能制造产业升级浪潮中被商业化应用最为普遍的AI技术之一。html
而实际生产环境对检测算法的精度、速度、体积等要求每每十分苛刻。git
例如工业质检,生产线上每每须要毫秒级别的图片检测速度,而为了确保使用厂商收益最大化,还须要尽可能平衡硬件成本和性能。所以,如何在保持高检测精度的前提下,尽可能提升检测速度、减少模型体积,成为这项技术真正深刻工业实际应用的关键。github
而目标检测的王牌家族——YOLO系列模型,做为单阶段目标检测算法的表明之一,一经出世,便以快速精准的检测效果而迅速蹿红。其不只在速度上作到真正实时,精度上也能够达到不少非实时两阶段模型才有的水平。web
△ 来自论文《YOLOv3: An Incremental Improvement》算法
而学术界和开源社区中的YOLO拥趸、大神们,并未止步于此, YOLO v四、”YOLO v5”也在今年被相继推出,它们大量整合了计算机视觉的state-of-the-art技巧,例如在数据加强、锚定框、骨架网络、训练方式等维度进行优化,从而达到大幅提高YOLO目标检测性能的效果。微信
飞桨目标检测套件PaddleDetection的研发团队也为了让YOLOv3模型在工业实际应用场景拥有更优异的精度与推理速度,以尽可能不增长模型计算量和推理开销为前提,探索出了一整套更深度的算法优化秘籍,将原先YOLOv3模型的精度(在COCO test-dev2017数据集)从33.0%提高了12.9个绝对百分点,达到45.9%,处于业界领先行列!而在该精度下,其推理速度在V100上达到了72.9 FPS。网络
也就是说,它在精度和预测速度都超越原生的YOLOv4,而且体积更小,实打实的成为工业应用场景最实用目标检测模型。而此次华丽变身后的YOLOv3,也被正式命名为——PP-YOLO!app
以下表所示,在不一样输入尺度下PP-YOLO模型与YOLOv4模型在COCO数据集精度和V100推理速度的交手结果。框架
△ 注:上表中数据均为在单卡Tesla V100上batch size=1测试结果,TRT-FP16为使用TensorRT且在FP16上的测试结果,TensorRT版本为5.1.2.2ide
而PP-YOLO所应用的这套优化策略,也能够被尝试应用到该系列的其它模型上,产业开发者或者科研人员可借鉴这套优化算法展开进一步的探索。
而这整套PP-YOLO的优化秘籍也被飞桨同窗总结梳理成了论文,感兴趣的开发者能够参见下面的连接阅读原文。
PP-YOLO论文:
https://arxiv.org/abs/2007.12099
PP-YOLO文档:
https://github.com/PaddlePaddle/PaddleDetection/tree/release/0.4/configs/ppyolo
飞桨团队也在AIStudio为你们建立了 PP-YOLO实战项目,以供开发者快速体验模型效果:
https://aistudio.baidu.com/aistudio/projectdetail/708923
PP-YOLO的高精度和高推理速度对多快速运动目标检测的视频也能够达到很好的效果。
那PP-YOLO到底采用了哪些优化策略呢?下面我们带领你们一块儿来深刻剖析一下飞桨团队算法优化的 “内功心法”。
1. 基于YOLOv3-DarkNet53的初步优化
原始的YOLOv3模型在COCO minival数据集上精度为33.0%,PaddleDetection首先加入了Bag of Freebies for Training Object Detection Neural Networks论文中说起的优化策略,在不引入额外计算量的状况下,精度提高了3.9个百分点,达到38.9%。具体策略以下:
Image Mixup(图像混合):以随机权重将两张图片混合起来,提升网络在空间上的抗干扰能力。如下图为例,将任意两张图片加权叠加做为输入,训练过程当中使用的损失为两张图片的损失乘以各自权重的加和。
△ 来自论文《Bag of Freebies for Training Object Detection Neural Networks》
Label Smooth(标签平滑):经过在真实的分类标签one-hot编码中真实类别的1上减去一个小量,非真实标签的0上加上一个小量,将硬标签变成一个软的标签,起到正则化的做用,防止过拟合,提高模型泛化能力。
Synchronize Batch Normalization(同步批归一化):多卡训练时,通常实现的批归一化只统计单卡上均值和方差,而检测任务中,受显存的限制,batch size比较小,多卡同步,会使得均值和方差统计的更加准确。
2. 更优的骨干网络: ResNet50vd-DCN
骨干网络能够说是一个模型的基础,一个优秀的骨干网络会给模型的性能带来极大的提高。针对YOLOv3,飞桨研发人员使用更加优异的ResNet50vd-DCN 做为模型的骨干网络。它能够被分为ResNet50vd和DCN两部分来看。
ResNet50vd是指拥有50个卷积层的ResNet-D网络。ResNet系列模型是在2015年提出后,在学术界和工业届获得了普遍的应用,其模型结构也在被业界开发者持续改进,在通过了B、C、D三个版本的改进后,最新的ResNet-D结构能在基本不增长计算量的状况下先住提升模型精度。经飞桨团队的多重实验发现,使用ResNet50vd结构做为骨干网络,相比于原始的ResNet,能够提升1%-2%的目标检测精度,且推理速度基本保持不变。
而DCN(Deformable Convolution)可变形卷积的特色在于:其卷积核在每个元素上额外增长了一个可学习的偏移参数。这样的卷积核在学习过程当中能够调整卷积的感觉野,从而可以更好的提取图像特征,以达到提高目标检测精度的目的。但它会在必定程度上引入额外的计算开销。通过多翻尝试,PaddleDetection团队发现只在ResNet的最后一个stage(C5)增长可变形卷积,是实现引入极少计算量并提高模型精度的最佳策略。
在使用ResNet50vd-DCN做为骨干网络后,YOLOv3模型的检测精度从原先的38.9% 达到39.1%,而推理速度获得了36%的大幅提升(58.2FPS -> 79.2FPS)。
3. 更稳定的训练方式:EMA、DropBlock和更大的batch size
为了使PP-YOLO的训练过程有更好的收敛效果,飞桨团队经过API paddle.optimizer.ExponentialMovingAverage调用了EMA(Exponential Moving Average)滑动平均功能。滑动平均是指将参数过去一段时间的均值做为新的参数。相比直接对参数进行更新,采用滑动平均的方式能让参数学习过程当中变得更加平缓,能有效避免异常值对参数更新的影响,提高模型训练的收敛效果。
PP-YOLO的优化过程当中使用了DropBlock算法来减小过拟合。以下图所示,相比于Dropout算法,DropBlock算法在Drop特征的时候不是以特征点的形式来Drop的,而是会集中Drop掉某一块区域,从而更适合被应用到目标检测任务中来提升网络的泛化能力。
△ 来自论文《DropBlock: A regularization method for convolutional networks》)
经过训练过程当中的指数滑动平均和DropBlock策略,结合适当增大训练的batch size(将单卡的batch size调整到24,8卡总batch size为192,使训练更加稳定,获取更优的结果),YOLOv3此时在COCO minival数据集精度提高了2.5%(39.1%->41.4%)。
4. IoU学习
对于目标检测任务,IoU是咱们经常使用的评估指标,即预测框与真实框的IoU越大,检测效果越好。基于“所见即所得”的思想,PP-YOLO使用了业界提出的一种新的Loss——IoU Loss,即在训练过程当中使用模型产生的预测框和真实框求IoU,对其取反并加入到损失计算中,这样至关于在优化损失的时候就是在提高IoU。
注:在PP-YOLO中,飞桨采用了最基础的IoU损失计算方法,即IoU Loss = 1 - IoU * IoU 。
另外一方面,咱们知道YOLOv3模型里的预测框评分score = objectness score * classification score,即该预测框处存在目标的几率和对应目标类别的几率的乘积,而此种评分方式并无考虑预测框的定位精度。而目标检测模型都须要对最后的预测框进行非极大值抑制(NMS),即按照预测框评分进行排序,而后删除得分低的框。所以很容易出现以下图的状况,即IoU低的预测框由于评分高而在NMS过程当中将IoU高的预测框挤掉了。
而使用IoU Aware能够很好的避免这种状况,即在训练过程当中增长一个通道来学习预测框和真实框之间的IoU,在推理过程当中,将这个通道学习的IoU预测值也做为评分的因子之一,这样就能必定程度上避免高IoU预测框被挤掉的状况,从而提高模型的精度。同时,因为只是输出层的每一个anchor上增长了一个通道,对于推理计算量的增长也基本能够忽略不计。
△ 来自论文《IoU-aware Single-stage Object Detector for Accurate Localization》
经过使用上述优化方法,模型精度又提高了1.1%(41.4%->42.5%),而对推理速度的影响比较小(79.2FPS -> 74.9FPS)。
5. Grid Sensitive
YOLOv3的检测原理是将图片划分红多个网格,真实框的中心点落在哪一个网格上就由哪一个网格负责检测这个真实框,而推理输出特征图中包含预测框中心坐标的logits值,这个值经Sigmoid激活后,即表示预测框中心坐标在网格中的相对位置。以下图所示,预测框的Px和Py经Sigmoid激活后,即表示预测框中心坐标相对真实框中心坐标gx和gy的偏移。那么若是这个真实框的中心点恰好落在网格边缘,则训练过程当中趋向于把输出logit值向正负无穷去学习,容易致使过拟合。
Grid Sensitive是YOLOv4模型引入的一种优化方法,即在计算预测框中心点在网格内的坐标时,对输出logit取sigmoid激活后,再加上一个缩放和偏移,能够保证预测框中心点可以有效的拟合真实框恰好落在网格边线上的状况。
经过加入Grid Sensitive,此轮精度又提高了0.3%(42.5%->42.8%),推理过程当中只须要对预测框解码时在中心点坐标上乘上缩放,再加上偏移便可,所以推理速度几乎没有影响(74.9FPS -> 74.8FPS)。
6. 后处理优化: Matrix NMS
在推理过程当中,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%的精度(42.8% -> 43.5%)。
7. 特征提取优化: CoordConv, 空间金字塔池化
另外PP-YOLO还引入了两种几乎不增长计算量可是能优化特征提取的方法。咱们知道深度学习里的卷积运算是具备平移等变性的,这样能够在图像的不一样位置共享统一的卷积核参数,可是这样卷积学习过程当中是不能感知当前特征在图像中的坐标的。CoordConv就是经过在卷积的输入特征图中新增对应的通道来表征特征图像素点的坐标,让卷积学习过程当中可以必定程度感知坐标来提高检测精度。
△ 来自论文《An Intriguing Failing of Convolutional Neural Networks and the CoordConv Solution》
空间金字塔池化是SPPNet提出的,以下图所示经过多个不一样尺度的池化窗口提取不一样尺度的池化特征,把特征组合在一块儿做为输出特征,在骨干网络提取特征后加入空间金字塔池化,能有效的增长特征的感觉野,是一种普遍应用的特征提取优化方法。
使用CoordConv和SPP两种特征提取优化方法后,精度进一步提高了0.8%(43.5%->44.3%), 这两种方式新增的推理计算量并不大,因此推理速度仅有少许降低(74.1FPS -> 72.9FPS)。
8. 更优的预训练模型: SSLD
经过上述优化方法,PP-YOLO模型在COCO minival数据集上的精度优化到了44.3%,V100上预测速度为72.9FPS。另外飞桨推出的图像分类端到端套件PaddleClas还提供了ResNet50vd的SSLD知识蒸馏模型及权重,使ResNet50vd模型在ImageNet上的Top-1分类精度从79.1%优化到82.4%,感兴趣的同窗能够经过下面的地址了解PaddleClas SSLD蒸馏方案。PP-YOLO模型在使用了SSLD知识蒸馏以后更优的预训练权重进行训练后,COCO minival数据集的精度又提高了0.5%(44.3%->44.8%)。
PaddleClas SSLD的文档地址:
https://paddleclas.readthedocs.io/zh_CN/latest/advanced_tutorials/distillation/distillation.html#ssld
通过上述优化方法,飞桨的研发人员又将训练迭代次数和学习率衰减的迭代次数调整至和原始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%。
后续工做
考虑到如今工业、互联网等各行各业须要使用轻量化的模型在移动端、边缘端部署目标检测模型,PaddleDetection团队正在进一步优化适用于轻量化部署的PP-YOLO,很快也将以开源项目、详细的使用文档及快速体验Demo的组合形式为你们呈现。
课程预告
百度飞桨为了帮助你们能快速、深刻、全面的了解目标检测技术,将于九月中旬特意开设“目标检测7日打卡营”。资深研发工程师倾囊相授多年“炼丹”经验,配套真实工业落地场景案例,最早进的调优方式、训练技巧、优化技巧和工业部署方案,7天带您一网打尽,千万不要错过!
感兴趣的同窗欢迎扫码加入PP-YOLO微信群,与更多深度学习开发者交流与探讨技术。
如扫码失败,可添加微信15711058002,飞桨小哥哥拉你入群~
更多飞桨的相关内容,请参阅如下内容。
官网地址:https://www.paddlepaddle.org.cn
GitHub: https://github.com/PaddlePaddle/PaddleDetection
Gitee: https://gitee.com/paddlepaddle/PaddleDetection
若是您以为PP-YOLO对您带来了一些启发或者确实实用的话,也欢迎您能够给PaddleDetection项目点亮Star。
飞桨开源框架项目地址:
GitHub: https://github.com/PaddlePaddle/Paddle
Gitee: https://gitee.com/paddlepaddle/Paddle
— 完 —
喜欢就点「在看」吧 !
本文分享自微信公众号 - 视学算法(visualAlgorithm)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。