允中 发自 凹非寺
量子位 编辑 | 公众号 QbitAI
工业视觉、自动驾驶、安防、新零售等我们身边熟知的各行各业都需要目标检测技术,由于其很好的平衡了标注成本、检测精度和速度等,成为当前智能制造产业升级浪潮中被商业化应用最为广泛的AI技术之一。
而实际生产环境对检测算法的精度、速度、体积等要求往往十分苛刻。
例如工业质检,生产线上往往需要毫秒级别的图片检测速度,而为了确保使用厂商收益最大化,还需要尽量平衡硬件成本和性能。因此,如何在保持高检测精度的前提下,尽量提高检测速度、减小模型体积,成为这项技术真正深入工业实际应用的关键。
而目标检测的王牌家族——YOLO系列模型,作为单阶段目标检测算法的代表之一,一经出世,便以快速精准的检测效果而迅速蹿红。其不仅在速度上做到真正实时,精度上也可以达到很多非实时两阶段模型才有的水平。
△ 来自论文《YOLOv3: An Incremental Improvement》
而学术界和开源社区中的YOLO拥趸、大神们,并未止步于此, YOLO v4、”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!
如下表所示,在不同输入尺度下PP-YOLO模型与YOLOv4模型在COCO数据集精度和V100推理速度的交手结果。
△ 注:上表中数据均为在单卡Tesla V100上batch size=1测试结果,TRT-FP16为使用TensorRT且在FP16上的测试结果,TensorRT版本为5.1.2.2
而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到底采用了哪些优化策略呢?下面咱们带领大家一起来深入剖析一下飞桨团队算法优化的 “内功心法”。
原始的YOLOv3模型在COCO minival数据集上精度为33.0%,PaddleDetection首先加入了Bag of Freebies for Training Object Detection Neural Networks论文中提及的优化策略,在不引入额外计算量的情况下,精度提升了3.9个百分点,达到38.9%。具体策略如下:
△ 来自论文《Bag of Freebies for Training Object Detection Neural Networks》
骨干网络可以说是一个模型的基础,一个优秀的骨干网络会给模型的性能带来极大的提升。针对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)。
为了使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%)。
对于目标检测任务,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)。
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)。
在推理过程中,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%)。
另外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)。
通过上述优化方法,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微信群,与更多深度学习开发者交流与探讨技术。
更多飞桨的相关内容,请参阅以下内容。
官网地址:https://www.paddlepaddle.org.cn
飞桨PaddleDetection项目地址:
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
— 完 —
量子位 QbitAI · 头条号签约
关注我们,第一时间获知前沿科技动态