社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

GitHub 又一开发必备神器问世,代号「PP-LCNet」!

GitHubDaily • 4 年前 • 631 次点击  

公众号关注 “GitHubDaily”

设为 “星标”,每天带你逛 GitHub!


算法速度优化遇到瓶颈,达不到要求?应用环境没有高性能硬件只有 CPU?

是不是直接戳中了各位开发者的痛点!莫慌,今天小G就来为万千开发者破局~

这个破局点就是:针对 CPU 设备及加速库 MKLDNN 定制的骨干网络 PP-LCNet!

空口无凭,上图为证!

从上图我们可以看出,PP-LCNet 在同样精度的情况下,速度远超当前所有的骨架网络,最多可以有 2 倍的性能优势!它应用在比如目标检测、语义分割等任务算法上,也可以使原本的网络有大幅度的性能提升~

而这个 PP-LCNet 的论文发布和代码开源后,也着实引来了众多业界开发者的关注,各界大神把 PP-LCNet 应用在 YOLO 系列算法上也真实带来了极其可观的性能收益。

这时候是不是有小伙伴已经按耐不住也想直接上手试试了?!

小G 识趣地赶紧送上开源代码的传送门 ⬇️ 大家一定要 Star 收藏以免走失,也给开源社区一些认可和鼓励。

https://github.com/PaddlePaddle/PaddleClas

而这个 PP-LCNet 到底是如何设计,从而有这么好的性能的呢?下面小编就带大家来领略一下:

1. PP-LCNet 核心技术解读

近年来,很多轻量级的骨干网络问世,各种 NAS 搜索出的网络尤其亮眼。但这些算法的优化都脱离了产业最常用的 Intel CPU 设备环境,加速能力也往往不合预期。

百度飞桨图像分类套件 PaddleClas 基于这样的产业现状,针对 Intel CPU 及其加速库 MKLDNN 定制了独特的高性能骨干网络 PP-LCNet。比起其他的轻量级 SOTA 模型,该骨干网络可以在不增加推理时间的情况下,进一步提升模型的性能,最终大幅度超越现有的 SOTA 模型。

PP-LCNet 的网络结构整体如上图所示

我们经过大量的实验发现,在基于 Intel CPU 的设备上,尤其当启用 MKLDNN 加速库后,很多看似不太耗时的操作反而会增加延时,比如 elementwise-add 操作、split-concat 结构等。所以最终我们选用了结构尽可能精简、速度尽可能快的 block 组成我们的 BaseNet(类似 MobileNetV1)。

基于 BaseNet,我们通过实验,总结出四条几乎不增加延时但又能够提升模型精度的方法,下面将对这四条策略进行详细介绍:

更好的激活函数

自从卷积神经网络使用了 ReLU 激活函数后,网络性能得到了大幅度提升。近些年 ReLU 激活函数的变体也相继出现,如 Leaky-ReLU、P-ReLU、ELU 等。2017 年,谷歌大脑团队通过搜索的方式得到了 swish 激活函数,该激活函数在轻量级网络上表现优异。在 2019 年,MobileNetV3 的作者将该激活函数进一步优化为 H-Swish,该激活函数去除了指数运算,速度更快,网络精度几乎不受影响。我们也经过很多实验发现该激活函数在轻量级网络上有优异的表现。所以在 PP-LCNet 中,我们选用了该激活函数。

合适的位置添加 SE 模块

SE 模块是 SENet 提出的一种通道注意力机制,可以有效提升模型的精度。但是在 Intel CPU 端,该模块同样会带来较大的延时,如何平衡精度和速度是我们要解决的一个问题。虽然在 MobileNetV3 等基于 NAS 搜索的网络中对 SE 模块的位置进行了搜索,但是并没有得出一般的结论。我们通过实验发现,SE 模块越靠近网络的尾部对模型精度的提升越大。下表也展示了我们的一些实验结果:

最终,PP-LCNet 中的 SE 模块的位置选用了表格中第三行的方案。

更大的卷积核

在 MixNet 的论文中,作者分析了卷积核大小对模型性能的影响,结论是在一定范围内大的卷积核可以提升模型的性能,但是超过这个范围会有损模型的性能,所以作者组合了一种 split-concat 范式的 MixConv,这种组合虽然可以提升模型的性能,但是不利于推理。我们通过实验总结了一些更大的卷积核在不同位置的作用,类似 SE 模块的位置,更大的卷积核在网络的中后部作用更明显,下表展示了 5x5 卷积核的位置对精度的影响:

实验表明,更大的卷积核放在网络的中后部即可达到放在所有位置的精度,与此同时,获得更快的推理速度。PP-LCNet 最终选用了表格中第三行的方案。

GAP 后使用更大的 1x1 卷积层

在 GoogLeNet 之后,GAP(Global-Average-Pooling)后往往直接接分类层,但是在轻量级网络中,这样会导致 GAP 后提取的特征没有得到进一步的融合和加工。如果在此后使用一个更大的 1x1 卷积层(等同于 FC 层),GAP 后的特征便不会直接经过分类层,而是先进行了融合,并将融合的特征进行分类。这样可以在不影响模型推理速度的同时大大提升准确率。

BaseNet 经过以上四个方面的改进,得到了 PP-LCNet。下表进一步说明了每个方案对结果的影响:

2. 下游任务性能惊艳提升

图像分类

图像分类我们选用了 ImageNet 数据集,相比目前主流的轻量级网络,PP-LCNet 在相同精度下可以获得更快的推理速度。当使用百度自研的 SSLD 蒸馏策略后,精度进一步提升,在 Intel CPU 端约 5ms 的推理速度下 ImageNet 的 Top-1 Acc 竟然超过了 80%,Amazing!!!

目标检测

目标检测的方法我们选用了百度自研的 PicoDet,该方法主打轻量级目标检测场景。下表展示了在 COCO 数据集上、backbone 选用 PP-LCNet 与 MobileNetV3 的结果的比较。无论在精度还是速度上,PP-LCNet 的优势都非常明显。

语义分割

语义分割的方法我们选用了 DeeplabV3+。下表展示了在 Cityscapes 数据集上、backbone 选用 PP-LCNet 与 MobileNetV3 的比较。在精度和速度方面,PP-LCNet 的优势同样明显。

3. 实际拓展应用结果说明

PP-LCNet 在计算机视觉下游任务上表现很出色,那在真实的使用场景如何呢?本节简述其在 PP-OCR v2、PP-Shitu 上的表现。

在 PP-OCR v2 上,只将识别模型的 backbone 由 MobileNetV3 替换为 PP-LCNet 后,在速度更快的同时,精度可以进一步提升。

在 PP-Shitu 中,将 Backbone 的 ResNet50_vd 替换为 PP-LCNet-2.5x 后,在 Intel-CPU 端,速度快 5 倍,recall@1 基本和 ResNet50_vd 持平。

PP-LCNet 并不是追求极致的 FLOPs 与 Params,而是着眼于深入技术细节,耐心分析如何添加对 Intel CPU 友好的模块来提升模型的性能来更好地进行准确率和推理时间的平衡,其中的实验结论也很适合其他网络结构设计的研究者,同时也为 NAS 搜索研究者提供了更小的搜索空间和一般结论。

自论文发表以来,PP-LCNet 引起了国内外学术界和产业界的广泛关注,无论是各类版本的复现,还是极具探索意义和实用价值的各类视觉任务应用和技术分析文章层出不穷,将简单模型的实用性优化方案重新带入大家的视野,真正践行技术让 “生活” 更美好的初心,期待 PP-LCNet 在实际落地和应用中的更多表现。

前面提到的论文,链接如下:

https://arxiv.org/pdf/2109.15099.pdf

本论文工作的总体研究思路由飞桨 PaddleClas 团队提出并实施。

PaddleClas 提供全球首个开源通用图像识别系统,并力求为工业界和学术界提供更高效便捷的开发工具,为开发者带来更流畅优质的使用体验,训练出更好的飞桨视觉模型,实现行业场景实现落地应用。

想要获取更多 PaddleClas 相关介绍及教程文档可前往⬇️:

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/121650