杜佳豪编辑

精度45.9%,推理速度72.9FPS,百度飞桨推出工业级目标检测模型 PP-YOLO

工业视觉、自动驾驶、安防、新零售等我们身边熟知的各行各业都需要目标检测技术,由于其很好的平衡了标注成本、检测精度和速度等,成为当前智能制造产业升级浪潮中被商业化应用最为广泛的 AI 技术之一。

而实际生产环境对检测算法的精度、速度、体积等要求往往十分苛刻。

例如工业质检,生产线上往往需要毫秒级别的图片检测速度,而为了确保使用厂商收益最大化,还需要尽量平衡硬件成本和性能。因此,如何在保持高检测精度的前提下,尽量提高检测速度、减小模型体积,成为这项技术真正深入工业实际应用的关键。

而目标检测的王牌家族——YOLO 系列模型,作为单阶段目标检测算法的代表之一,一经出世,便以快速精准的检测效果而迅速蹿红。其不仅在速度上做到真正实时,精度上也可以达到很多非实时两阶段模型才有的水平。

▲ 来自论文《YOLOv3: An Incremental Improvement》
而学术界和开源社区中的 YOLO 拥趸、大神们,并未止步于此,YOLOv4、YOLOv5 也在今年被相继推出,它们大量整合了计算机视觉的 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

飞桨团队也在 AI Studio 为大家创建了 PP-YOLO 实战项目,以供开发者快速体验模型效果:

https://aistudio.baidu.com/aistudio/projectdetail/708923

PP-YOLO 的高精度和高推理速度对多快速运动目标检测的视频也可以达到很好的效果。

那 PP-YOLO 到底采用了哪些优化策略呢?下面咱们带领大家一起来深入剖析一下飞桨团队算法优化的 “内功心法”。

一、基于 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 比较小,多卡同步,会使得均值和方差统计的更加准确。

二、更优的骨干网络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)。

三、稳定的训练方式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%)。

四、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)。

五、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)。

六、后处理优化: 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%)。

七:特征提取优化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)。

八:更优的预训练模型: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.9FPS。如果使用 COCO test_dev2017 数据集测试,精度将达到45.9%。

九:后续工作

考虑到现在工业、互联网等各行各业需要使用轻量化的模型在移动端、边缘端部署目标检测模型,PaddleDetection 团队正在进一步优化适用于轻量化部署的 PP-YOLO,很快也将以开源项目、详细的使用文档及快速体验 Demo 的组合形式为大家呈现。

课程预告

百度飞桨为了帮助大家能快速、深入、全面的了解目标检测技术,将于九月中旬特地开设“目标检测7日打卡营”。资深研发工程师倾囊相授多年“炼丹”经验,配套真实工业落地场景案例,最先进的调优方式、训练技巧、优化技巧和工业部署方案,7天带您一网打尽,千万不要错过!

感兴趣的同学欢迎加入 PP-YOLO 微信群,与更多深度学习开发者交流与探讨技术。可添加微信15711058002并备注“YOLO”,飞桨小哥哥拉你入群~

如果您觉得 PP-YOLO 对您带来了一些启发或者确实实用的话,也欢迎您可以给 PaddleDetection 项目点亮 Star。

·飞桨官网地址·

https://www.paddlepaddle.org.cn/

·PP-YOLO AI Studio项目地址·

https://aistudio.baidu.com/aistudio/projectdetail/708923

·飞桨 PaddleDetection 项目地址·

GitHub: https://github.com/PaddlePaddle/PaddleDetection

Gitee: https://gitee.com/paddlepaddle/PaddleDetection

·飞桨开源框架项目地址·

GitHub: https://github.com/PaddlePaddle/Paddle 

Gitee: https://gitee.com/paddlepaddle/Paddle

*以上链接可复制粘贴至浏览器打开

百度AI
百度AI

产业百度YOLOPP-YOLO目标检测百度飞桨
1
暂无评论
暂无评论~