(原标题:超越YOLOv4、v5的PP-YOLOv2来了!)
单阶段目标检测界的扛把子--YOLO,以其“又快又好的效果”在学术及产业界全面风靡。自20年下半年YOLOv4、YOLOv5、PP-YOLO、YOLO-Fastest和 YOLOv4 Tiny等等轮番轰炸、掀起“YOLO狂潮”后,时隔半年,超越YOLOv5的PP-YOLOv2和1.3M超超超轻量级的PP-YOLO tiny一起来了!!!
图1 PP-YOLOv2和其他目标检测器性能对比
如图1可见,PP-YOLOv2在同等速度下,精度超越YOLOv5!相较20年发布的PP-YOLO,v2版本在COCO 2017 test-dev上的精度提升了3.6%,由45.9%提升到了49.5%;在640*640的输入尺寸下,FPS达到68.9FPS,而采用TensorRT加速的话,FPS更是达到了106.5!这样的性能,超越了当前所有同等计算量下的检测器,包括YOLOv4-CSP和YOLOv5l !
而如果将骨架网络从ResNet50更换为ResNet101,PP-YOLOv2的优势则更为显著:mAP 达到50.3%,速度比同计算量的YOLOv5x高出了15.9%。
不仅如此,与PP-YOLOv2一同面世的,还有体积只有1.3M的PP-YOLO Tiny,比YOLO-Fastest 更轻、更快!这样超超超轻量的算法面世,更是很好的满足了产业里大量边缘、轻量化、低成本芯片上使用目标检测算法的种种诉求!
PP-YOLOv2:产业最实用的目标检测器
关注百度飞桨的小伙伴可能还记得,PP-YOLO是在YOLOv3的基础上,采用了一整套优化策略,在几乎不增加模型参数和计算量(FLOPs)的前提下,提升检测器的精度得到的极高性价比(mAP 45.9,72.9FPS)的单阶段目标检测器。
而PP-YOLOv2,是以PP-YOLO为基线模型进行了一系列的延展实验得到的。下面,就让我们来一起看看具体是哪些策略给PP-YOLO带来了进一步的优化提升呢?
1、采用Path Aggregation Network(路径聚合网络)设计Detection Net
YOLO系列的一大通病,是对不同尺幅的目标检测效果欠佳,因此,PP-YOLOv2第一个优化的尝试是设计一个可以为各种尺度图像构建高层语义特征图的检测颈(detection neck)。不同于PP-YOLO采用FPN来从下至上的构建特征金字塔,PP-YOLOv2采用了FPN的变形之一—PAN(Path Aggregation Network)来从上至下的聚合特征信息。而采用PAN构建的detection neck可以由图2看到。
图2 PP-YOLOv2 Detection Neck 的结构
2、采用Mish激活函数
Mish 激活函数被很多实用的检测器采用,并拥有出色的表现,例如YOLOv4和YOLOv5都在骨架网络(backbone)的构建中应用mish激活函数。而对于PP-YOLOv2,我们倾向于仍然采用原有的骨架网络,因为它的预训练参数使得网络在ImageNet上top-1准确率高达82.4%。所以我们把mish激活函数应用在了detection neck而不是骨架网络上。
3、更大的输入尺寸
增加输入尺寸直接带来了目标面积的扩大。这样,网络可以更容易捕捉到小尺幅目标的信息,得到更高的性能。然而,更大的输入会带来更多的内存占用。所以在使用这个策略的同时,我们需要同时减少Batch Size。在具体实验中,我们将Batch Size减少了一倍,从每个GPU 24张图像减少到每个GPU 12张图像,并将最大输入从608扩展到768。输入大小均匀地从[320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, 768]获取。
4、IoU Aware Branch
在YOLOv3中,将分类概率和objectness相乘作为最终的检测置信度,但却没有考虑定位置信度。为了解决这一问题,我们将objectness与定位置信度IoU综合起来, 使用下面的公式来计算出一个新的objectness:
而以上这一系列优化策略对网络的改进效果分别是怎样的呢?通过消融实验得到的图表我们可以清晰的看到,以上PAN、MISH和输入尺寸的增大都带来了一些计算量的增加,但mAP却得到了显著的提升。
而优化后的PP-YOLOv2的完整性能测试及与YOLOv4、YOLOv5全系列算法的比较如下表,PP-YOLOv2(R50)计算量相当于YOLOv5l,PP-YOLOv2(R101)计算量相当于YOLOv5x。可以看到,PP-YOLOv2的性能超越了当前所有同等计算量下的检测器!
值得注意的是:不管是PP-YOLO还是PP-YOLOv2,都是在寻找在产业实践中最高性价比的目标检测方案,而不是单纯的以提升单阶段目标检测的精度去堆网络和策略。论文中也特别提到,是以实验报告的角度来为业界开发者展示更多网络优化的方法,这些策略也可以被应用在其他网络的优化上,希望在给业界开发者带来更好的网络的同时,也带来更多的算法优化启发。
PPYOLO Tiny:1.3M超超超轻量 目标检测算法
在当前移动互联网、物联网、车联网等行业迅猛发展的背景下,边缘设备上直接部署目标检测的需求越来越旺盛。生产线上往往需要在极低硬件成本的硬件例如树莓派、FPGA、K210等芯片上部署目标检测算法。而我们常用的手机App,也很难直接在终端采用超过6M的深度学习算法。
如何在尽量不损失精度的前提下,获得体积更小、运算速度更快的算法呢?
得益于PaddleSlim飞桨模型压缩工具的能力,体积仅为1.3M的PPYOLO Tiny诞生了!
那PP-YOLO Tiny具体采用了哪些优化策略呢?
首先,PP-YOLO Tiny沿用了PP-YOLO系列模型的spp,iou loss, drop block, mixup, sync bn等优化方法,并进一步采用了近10种针对移动端的优化策略:
1、更适用于移动端的骨干网络:
骨干网络可以说是一个模型的核心组成部分,对网络的性能、体积影响巨大。PPYOLO Tiny采用了移动端高性价比骨干网络MobileNetV3。
2、更适用移动端的检测头(head):
除了骨干网络,PP-YOLO Tiny的检测头(head)部分采用了更适用于移动端的深度可分离卷积(Depthwise Separable Convolution),相比常规的卷积操作,有更少的参数量和运算成本, 更适用于移动端的内存空间和算力。
3、去除对模型体积、速度有显著影响的优化策略:
在PPYOLO中,采用了近10种优化策略,但并不是每一种都适用于移动端轻量化网络,比如iou aware和matrix nms等。这类Trick在服务器端容易计算,但在移动端会引入很多额外的时延,对移动端来说性价比不高,因此去掉反而更适当。
4、使用更小的输入尺寸
为了在移动端有更好的性能,PP-YOLO Tiny采用320和416这两种更小的输入图像尺寸。并在 PaddleDetection2.0中提供tools/anchor_cluster.py 脚本,使用户可以一键式的获得与目标数据集匹配的Anchor。例如,在COCO数据集上,我们使用320*320尺度重新聚类了anchor,并对应的在训练过程中把每batch图片的缩放范围调整到192-512来适配小尺寸输入图片的训练,得到更高性能。
5、召回率优化
在使用小尺寸输入图片时,对应的目标尺寸也会被缩小,漏检的概率会变大,对应的我们采用了如下两种方法来提升目标的召回率:
a.原真实框的注册方法是注册到网格里最匹配的anchor上,优化后还会同时注册到所有与该真实框的IoU不小于0.25的anchor上,提高了真实框注册的正例。
b.原来所有与真实框IoU小于0.7的anchor会被当错负例,优化后将该阈值减小到0.5,降低了负例比例。
通过以上增加正例、减少负例的方法,弥补了在小尺寸上的正负例倾斜问题,提高了召回率。
6、更大的batch size
往往更大的Batch Size可以使训练更加稳定,获取更优的结果。在PP-YOLO Tiny的训练中,单卡batch size由24提升到了32,8卡总batch size=8*32=256,最终得到在COCO数据集上体积4.3M,精度与预测速度都较为理想的模型。
7、量化后压缩
最后,结合Paddle Inference 和Paddle Lite 预测库支持的后量化策略,即在将权重保存成量化后的int8数据。这样的操作,是模型体积直接压缩到了1.3M,而预测时使用Paddle Lite 加载权重,会将int8数据还原回float32权重,所以对精度和预测速度⼏乎没有任何影响。
通过以上一系列优化,我们就得到了1.3M超超超轻量的PP-YOLO tiny模型,而算法可以通过Paddle Lite直接部署在麒麟990等轻量化芯片上,预测效果也非常理想。
以上所有PP-YOLOv2和PPYOLO Tiny的代码实现,均在PaddleDetection飞桨目标检测开发套件中开源提供:github.com/paddlepaddle/paddledetection
还在等什么?赶紧来实际上手体验一下吧!也欢迎感兴趣的小伙伴参与共建!
课程预告
百度飞桨为了帮助大家能快速、深入、全面的了解目标检测技术,将于5月13、14日特地开设“目标检测2日直播课”。由资深研发工程师倾囊相授多年“炼丹”经验,配套真实工业落地场景案例,最先进的调优方式、训练技巧、优化技巧和工业部署方案一网打尽,千万不要错过~