超越YOLOv5的PP-YOLOv2和13M超轻量PP-YOLO Tiny都来了
机器之心发布
机器之心编辑部
mAP 50.3%,106.5FPS 的 PP-YOLOv2,1.3M超轻量PPYOLO Tiny, 让目标检测界再起风波。
单阶段目标检测界的扛把子 --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 论文:https://arxiv.org/abs/2104.10419
并查看 PP-YOLOv2 和 PP-YOLO Tiny 的代码实现:https://github.com/paddlepaddle/paddledetection
(记得 Star 收藏一下,支持开源也防止走丢~)
PP-YOLOv2:产业最实用的目标检测器
关注百度飞桨的小伙伴可能还记得,PP-YOLO(https://arxiv.org/abs/2007.12099)是在 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:
其中 p 为检测框与 ground truth 之间的 IoU 的预测值,
为平衡参数,在 PP-YOLOv2 中设置为 0.5。我们使用 BCE(binary cross entropy) loss 来学习 p,公式如下所示
其中 t 为检测框与 ground truth 之间的 IoU,σ(.)代表 sigmoid 激活函数。需要注意的是,只有正性样本的 IoU aware loss 被计算。
而以上这一系列优化策略对网络的改进效果分别是怎样的呢?通过消融实验得到的图表我们可以清晰的看到,以上 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
还在等什么?赶紧来实际上手体验一下吧!也欢迎感兴趣的小伙伴参与共建!
EMAX 银燕 Tinyhawk II 穿越机心得分享
开篇
最近,在闲暇之余,发现有位朋友他时不时在微信朋友圈里面晒天空翻来覆去的视频,仔细浏览他前后一段时间的微信朋友圈,才发现原来是在晒一种新型的具有摄像功能的无人机——穿越机。据此,“穿越机”这个概念,第一次进入到我的视野和理念里面。原来在大名鼎鼎的大疆之余,还有穿越机这样一种飞行玩具的存在,好奇,实在是好奇。
了解
在接下来的一段时间里,通过浏览西瓜视频、哔哩哔哩、知乎等等,搜索淘宝、京东、闲鱼等电商平台,加入穿越机的种种QQ群、微信群,慢慢地对穿越机这种玩具有了更进一步的了解和把握。很多大神诸如阿文菌、Driftty等等都有涉猎穿越机这个玩物,给出了很好的介绍与分析,很多装机文章、介绍文章都极具入门借鉴的参考价值,也算是受益匪浅了。经过一番熏陶,我正式入手了EMAX 银燕 Tinyhawk II 。
参数
EMAX 银燕 Tinyhawk II的基本参数如下:
轴距:75mm
电机:0802 16000kv
桨: Avan 4叶桨
飞控: F4 (MATEKF411RX Firmware)
电调: 4合1 5A BlHeli_S
接收机: EMAX SPI Receiver (兼容FrSky D8 模式)
电池接口型号: JST-PH2.0
VTX : 25/100/200mw
频道: 37CH incl. Raceband
摄像头: RunCam Nano 2 1/3" 700TVL CMOS
重量: 31.2g
包装重量: 43.5g (内有1块300mAh 2S 80C 电池 和 1块450mAh 1S 50C 电池)
对于我这样的一位穿越机萌新来说,上面的一众参数,大体上是没有什么意义的,只是一堆看上去复杂无比的数字罢了。因此,我在这里也不卖弄什么知识点了。我只是隐约地觉得,EMAX 银燕 Tinyhawk II穿越机,可能有点类似于空心杯,但是,又不是一架普通的空心杯,而是介乎于入门级和竞速级之间的一个过渡产品吧。
感悟
EMAX 银燕 Tinyhawk II穿越机的室外飞行图片,我在这里就不放出来了。总之就是一个字:惨不忍睹。自己飞得非常糟糕,完全不知道如何能够熟练地控制升降或者转弯,就像一个还在学步的婴儿,总是跌跌撞撞的,毕竟自己毫无模拟器的实践基础,对于一架飞行高度自由的穿越机来说,操作实在是太过于专业了,萌新确实需要无数炸机的生动实践,才有可能在不厌其烦的摸爬滚打中成长为信手拈来、闲庭信步的熟练飞手。
毫不夸张地说,我第一天的首飞就虚惊两场:一是当天第一飞就飞到了别人家的阳台上面出不来、下不来了,空余电机和桨叶空转,花了好长时间寻找邻居然后跟邻居沟通请求协助取回飞机。二是在回家前的尾飞,心太大了,直接以最大油门升空消失在视野的范围内,死命回拉还是飞出了小区围墙外面,直接1S电池耗尽,然后在空中自由落体随风左摇右晃地飘落下来,真是惨不忍睹、虚汗不止。
尽管如此,在实际的使用过程中,我还是有几点感悟和体会的。在这里也分享给如我一般的萌新飞友:
一、EMAX 银燕 Tinyhawk II 穿越机在到手之后,可能还是需要你先通过 betaflight 地面站预先进行一下 PID 的设置再出去飞,要看看 PID 到底是类型一还是类型二。大体上说,类型一是室内飞行,类型二是室外飞行。因为我发现,在练习飞行的最初一段时间里,飞机非常难控,但是动力特别充沛,力度非常大,速度相当快,稍有不慎就撞到天花板,完全不是室内飞行应该有的慢速度啊。打开地面站来一看,果然,PID的类型不是类型一,而是更适合竞速的类型二,怪不得飞机开箱时插的就是2S电池呢,赶紧把它调整回来才是。
二、EMAX 银燕 Tinyhawk II穿越机,在你还是一位没有什么操作经验的萌新的时候,建议还是不要轻易使用2S的电池。这个2S电池电量太多,比1S电池厚很多,力度太大,用力太猛,稍微轻推油门就可以嗡嗡作响,战斗力十分爆表凶悍,我觉得非常不适合在室内飞行,跟我原来在各篇文章里理解的空心杯穿越机完全不是一回事,空心杯不应该这么猛的啊,在室内这么多家具是吧,稍有不慎就会撞到这个撞到那个,应该速度非常轻柔、飞行非常缓慢,甚至应该是像大疆的无人机一样可以静止不动地悬停在空中不动才对啊。幸好的是什么呢?这些穿越机的电池都不顶用,如此暴力的飞行,标称最理想的就是飞五分钟,狂暴的飞行,两三分钟就滴滴滴作响了。三两块电池,还真是飞得不够过瘾!
三、betaflight 地面站,这个地面站让我断断续续地耗了很长时间来研究到底应该怎样用,为什么连接飞机和电脑毫无反应,电脑根本辨别不了所连接的USB设备是什么,我甚至一度将台式电脑和笔记本电脑都重装了最新版本的Windows 7 还是解决不了问题。最后,还是在万能的知乎、什么值得买等大神的有关文章里面发现:原来真理早已存在于地面站的欢迎首页下方,没错,就是要先搞定这几个驱动: CP210x 、STM USB VCP Drivers 、Zadig,不然,地面站根本就没端口可连接。地面站详细设置的介绍很多,但是没几个人将怎么把地面站能够顺利用起来这一点讲到位,大家可能都默认安装几个端口驱动那是轻而易举的事吧,可惜的是萌新如我,还是耗费了很多原本应该使用PID1S设置的时间而浪费在了2S的设置上面。
好了,EMAX 银燕 Tinyhawk II 穿越机的简单分享就到这里,谢谢您的浏览和点评。
相关问答
编译友善之臂 tiny210 光盘提供的安卓2.6.35内核出错?在fedora9中没有错误,编译通过了。在fedora9中没有错误,编译通过了。