1 YOLO的另一选择,手机端97FPS的Anchor-Free目标检测模型NanoDet-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

YOLO的另一选择,手机端97FPS的Anchor-Free目标检测模型NanoDet

电子设计 来源:电子设计 作者:电子设计 2020-12-08 22:42 次阅读
文章转载于:知乎
作者:RangiLyu

上来先贴一下性能对比:

华为P30上用NCNN移植跑benchmark,每帧仅需10.23毫秒,比yolov4-tiny快3倍,参数量小6倍,COCO mAP(0.5:0.95)能够达到20.6 。而且模型权重文件只有1.8mb,对比动辄数十兆的模型,可以说是相当友好了~

Android Demo

项目地址(提供训练代码到安卓部署一站式解决方案):

RangiLyu/nanodet: ⚡Super fast and lightweight anchor-free object detection model. Only 1.8mb and run 97FPS on cellphone (github.com)​github.com

前言

深度学习目标检测已经发展了许多年,从Two-stage到One-stage,从Anchor-base到Anchor-free,再到今年的用Transformer做目标检测,各种方法百花齐放,但是在移动端目标检测算法上,yolo系列和SSD等Anchor-base的模型一直占据着主导地位。这个项目的主要目的是希望能够开源一个移动端实时的Anchor-free检测模型,能够提供不亚于yolo系列的性能,而且同样方便训练和移植。
其实从去年大量anchor-free的论文发表之后,我就一直想把anchor free的模型移植到移动端或者是嵌入式设备上。当时尝试过把FCOS轻量化的实验,奈何效果并不如mobilenet+yolov3,也就暂时搁置了。分析下来,主要还是因为FCOS的centerness分支在轻量级的模型上很难收敛,之后发表的一些在FCOS上面进行改进的论文也都没有解决这一问题。

直到今年年中的时候刷arxiv突然刷到了

@李翔

老师的论文Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection,论文中提出的GFocalLoss完美去掉了FCOS系列的Centerness分支,而且在coco数据集上涨点显著,这么好的文章怎么能不点赞呢?GFL的出现不仅去掉了难以训练的Centerness,而且还省去了这一分支上的大量卷积,减少了检测头的计算开销,非常适合移动端的轻量化部署。
贴一下李翔老师关于GFocal Loss的解读:

李翔:大白话 Generalized Focal Loss​zhuanlan.zhihu.com

检测头轻量化

在找到了合适的损失函数之后,接下来的关键就是如何使其在轻量化模型上发挥作用了。首先需要对移动端进行优化的就是检测头:FCOS系列使用了共享权重的检测头,即对FPN出来的多尺度Feature Map使用同一组卷积预测检测框,然后每一层使用一个可学习的Scale值作为系数,对预测出来的框进行缩放。

FCOS模型架构

这么做的好处是能够将检测头的参数量降低为不共享权重状态下的1/5。这对于光是检测头就拥有数百通道的卷积的大模型来说非常有用,但是对于轻量化模型来说,共享权重检测头并没有很大的意义。由于移动端模型推理由CPU进行计算,共享权重并不会对推理过程进行加速,而且在检测头非常轻量的情况下,共享权重使得其检测能力进一步下降,因此还是选择每一层特征使用一组卷积比较合适。
同时,FCOS系列在检测头上使用了Group Normalization作为归一化的方式,GN对比BN有很多好处,但是却有一个缺点:BN在推理时能够将其归一化的参数直接融合进卷积中,可以省去这一步计算,而GN则不行。为了能够节省下归一化操作的时间,我选择将GN替换为BN。
FCOS的检测头使用了4个256通道的卷积作为一个分支,也就是说在边框回归和分类两个分支上一共有8个c=256的卷积,计算量非常大。为了将其轻量化,我首先选择使用深度可分离卷积替换普通卷积,并且将卷积堆叠的数量从4个减少为2组。在通道数上,将256维压缩至96维,之所以选择96,是因为需要将通道数保持为8或16的倍数,这样能够享受到大部分推理框架的并行加速。最后,借鉴了yolo系列的做法,将边框回归和分类使用同一组卷积进行计算,然后split成两份。下图就是最终得到的轻量化检测头的结构,非常的小巧:

NanoDet检测头

FPN层改进

目前针对FPN的改进有许多,如EfficientDet使用了BiFPN,yolo v4和yolo v5使用了PAN,除此之外还有BalancedFPN等等。BiFPN虽然性能强大,但是堆叠的特征融合操作势必会带来运行速度的降低,而PAN只有自上而下和自下而上两条通路,非常的简洁,是轻量级模型特征融合的好选择。
原版的PAN和yolo中的PAN,都使用了stride=2的卷积进行大尺度Feature Map到小尺度的缩放。我为了轻量化的原则,选择完全去掉PAN中的所有卷积,只保留从骨干网络特征提取后的1x1卷积来进行特征通道维度的对齐,上采样和下采样均使用插值来完成。与yolo使用的concatenate操作不同,我选择将多尺度的Feature Map直接相加,使得整个特征融合模块的计算量变得非常非常小。
最终的极小版PAN的结构也是非常简单:

超轻量的PAN

Backbone的选择

原本有考虑过自己魔改一个轻量级的backbone出来,但是最后评估了一下感觉工作量太大了(在家训练模型电费太贵),就打算选择使用现有的一些轻量级骨干网络。最开始的选择有MobileNet系列,GhostNet,ShuffleNet,还有最近的EfficientNet。在评估了参数量、计算量以及权重大小之后,还是选择了ShuffleNetV2作为骨干网络,因为它是这些模型里面在相似精度下体积最小的,而且对移动端CPU推理也比较友好。
最终我选择使用ShuffleNetV2 1.0x作为backbone,去掉了最后一层卷积,并且抽取8、16、32倍下采样的特征输入进PAN做多尺度的特征融合。整个骨干模型使用了Torchvision提供的代码,能够直接加载Torchvision上提供的imagenet预训练权重,对加快模型收敛有很大的帮助。顺便一提,最近有些论文指出使用分类的预训练权重初始化模型对检测任务的效果不如随机初始化的好,不过这要付出训练更多步数的代价,我还没有测试过,欢迎大家尝试~

NanoDet整体模型结构

模型性能

在经过对one-stage检测模型三大模块(Head、Neck、Backbone)都进行轻量化之后,得到了目前开源的NanoDet-m模型,在320x320输入分辨率的情况下,整个模型的Flops只有0.72B,而yolov4-tiny则有6.96B,小了将近十倍!模型的参数量也只有0.95M,权重文件在使用ncnn optimize进行16位存储之后,只有1.8mb,非常适合在移动端部署,能够有效减少APP体积,同时也对更低端的嵌入式设备更加友好。
尽管模型非常的轻量,但是性能却依旧强劲。对于小模型,往往选择使用AP50这种比较宽容的评价指标进行对比,这里我选择用更严格一点的COCO mAP(0.5:0.95)作为评估指标,同时兼顾检测和定位的精度。在COCO val 5000张图片上测试,并没有使用Testing-Time-Augmentation的情况下,320分辨率输入能够达到20.6的mAP,比tiny-yolov3高4分,只比yolov4-tiny低1个百分点,而将输入分辨率与yolo保持一致,都使用416输入的情况下,得分持平。
最后用ncnn部署到手机上之后跑了一下benchmark,模型前向计算时间只要10毫秒左右,对比yolov3和v4 tiny,均在30毫秒的量级。在安卓摄像头demo app上,算上图片预处理,检测框后处理以及绘制检测框的时间,也能轻松跑到40+FPS~。(关于模型从pytorch到安卓的部署,以及如何用C++实现GFL检测框的后处理,我会再专门发一遍文章详细介绍)

ncnn 安卓benchmark对比

总结

NanoDet总体而言没有特别多的创新点,是一个纯工程化的项目,主要的工作就是将目前学术界的一些优秀论文,落地到移动端的轻量级模型上。最后通过这些论文的组合,得到了一个兼顾精度、速度和体积的检测模型。
为了让大家能够快速使用NanoDet,方便训练和部署,我已经把Pytorch的训练代码、基于NCNN的Linux和windowsC++部署代码以及Android摄像头Demo全部开源,同时在Readme中也包含了非常详细的教程,欢迎大家使用,欢迎提issue~
顺便提一句,NanoDet训练并没有用到很多数据增强的技巧,模型结构也非常简单,也就是说mAP应该还有很大的提升空间,如果有小伙伴愿意魔改一下再涨几个点那就再好不过了(嘻嘻)。
最后的最后,Github求Star啊!!

RangiLyu/nanodet: ⚡Super fast and lightweight anchor-free object detection model. Only 1.8mb and run 97FPS on cellphone (github.com)​github.com

/=======================================================

11月25日更新:

大家都太热情了!NanoDet仅开源三天Github就已经突破900star,并且登上了Github趋势榜!

感谢各位大佬的支持,特别感谢李翔老师的论文给NanoDet模型的启发,以及ncnn作者nihui在项目初期的推广~大家快去给ncnn和GFocalLoss点star啊!

Tencent/ncnn: ncnn is a high-performance neural network inference framework optimized for the mobile platform (github.com)​github.comimplus/GFocal: Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection (github.com)​github.com

之前一直在ncnn群里面讨论NanoDet,感觉不太合适,所以专门建了一个讨论群:908606542 (进群答案:炼丹) 欢迎大家来讨论~

推荐阅读

更多Tengine相关内容请关注Tengine-边缘AI推理框架专栏。

审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 人工智能
    +关注

    关注

    1791

    文章

    47183

    浏览量

    238240
  • 深度学习
    +关注

    关注

    73

    文章

    5500

    浏览量

    121111
收藏 人收藏

    评论

    相关推荐

    AI模型部署边缘设备的奇妙之旅:目标检测模型

    并非易事,它涉及到从选择合适的算法架构到针对特定硬件平台进行优化等系列复杂的工作。 接下来,我们将详细介绍如何在资源受限的边缘设备上成功部署目标检测
    发表于 12-19 14:33

    使用英特尔AI PC为YOLO模型训练加速

    在以往的实践中,当我们针对 ultralytics 的 YOLO 模型开展训练工作时,可供选择的计算设备通常局限于 CPU、mps 以及 cuda 这几种。然而,自 PyTorch2.5 版本发布
    的头像 发表于 12-09 16:14 230次阅读
    使用英特尔AI PC为<b class='flag-5'>YOLO</b><b class='flag-5'>模型</b>训练加速

    助力AIoT应用:在米尔FPGA开发板上实现Tiny YOLO V4

    Only Look Once)是种实时物体检测模型,它通过次性扫描整个图像,实现高效的对象识别。而其简化版 Tiny YOLO V4
    发表于 12-06 17:18

    《DNK210使用指南 -CanMV版 V1.0》第四十二章 人脸口罩佩戴检测实验

    了LCD和摄像头。接着是构造个KPU对象,并从文件系统中加载人脸口罩佩戴检测网络需要用到的网络模型,并初始化YOLO2网络。然后便是在
    发表于 11-18 09:28

    YOLOv10自定义目标检测之理论+实践

    概述 YOLOv10 是由清华大学研究人员利用 Ultralytics Python 软件包开发的,它通过改进模型架构并消除非极大值抑制(NMS)提供了种新颖的实时目标检测方法。这些
    的头像 发表于 11-16 10:23 416次阅读
    YOLOv10自定义<b class='flag-5'>目标</b><b class='flag-5'>检测</b>之理论+实践

    《DNK210使用指南 -CanMV版 V1.0》第四十一章 YOLO2物体检测实验

    )) lcd.display(img) gc.collect()可以看到开始是先初始化了LCD和摄像头。接着是构造个KPU对象,并从文件系统中加载YOLO2人手检测网络需要用到的网
    发表于 11-14 09:22

    《DNK210使用指南 -CanMV版 V1.0》第四十章 YOLO2人手检测实验

    第四十章 YOLO2人手检测实验 在上章节中,介绍了利用maix.KPU模块实现YOLO2的人脸检测,本章将继续介绍利用maix.KPU模
    发表于 11-14 09:20

    《DNK210使用指南 -CanMV版 V1.0》第三十九章 YOLO2人脸检测实验

    )init_yolo2()方法用于初始化yolo2网络模型,同时为yolo2网络传入些必要的参数,只有在使用
    发表于 11-13 09:37

    使用OpenVINO C# API部署YOLO-World实现实时开放词汇对象检测

    YOLO-World是个融合了实时目标检测与增强现实(AR)技术的创新平台,旨在将现实世界与数字世界无缝对接。该平台以YOLO(You O
    的头像 发表于 08-30 16:27 628次阅读
    使用OpenVINO C# API部署<b class='flag-5'>YOLO</b>-World实现实时开放词汇对象<b class='flag-5'>检测</b>

    目标检测与识别技术的关系是什么

    任务是在图像或视频中快速准确地定位出感兴趣的目标,并给出目标的位置信息。目标检测技术通常包括候选区域提取、特征提取、分类器设计等步骤。 目标
    的头像 发表于 07-17 09:38 578次阅读

    慧视小目标识别算法 解决目标检测中的老大难问题

    随着深度学习和人工智能技术的兴起与技术成熟,大批如FasterR-CNN、RetinaNet、YOLO等可以在工业界使用的目标检测算法已逐步成熟并进入实际应用,大多数场景下的
    的头像 发表于 07-17 08:29 477次阅读
    慧视小<b class='flag-5'>目标</b>识别算法   解决<b class='flag-5'>目标</b><b class='flag-5'>检测</b>中的老大难问题

    使用esp-dl中的example量化我的YOLO模型时,提示ValueError: current model is not supported by esp-dl错误,为什么?

    使用esp-dl中的example量化我的YOLO模型时,提示:ValueError: current model is not supported by esp-dl 错误, 请看我的代码和模型
    发表于 06-28 06:47

    用OpenVINO C# API在intel平台部署YOLOv10目标检测模型

    模型设计策略,从效率和精度两个角度对YOLOs的各个组成部分进行了全面优化,大大降低了计算开销,增强了性能。在本文中,我们将结合OpenVINO C# API使用最新发布的OpenVINO 2024.1部署YOLOv10目标检测
    的头像 发表于 06-21 09:23 1019次阅读
    用OpenVINO C# API在intel平台部署YOLOv10<b class='flag-5'>目标</b><b class='flag-5'>检测</b><b class='flag-5'>模型</b>

    OpenVINO™ C# API部署YOLOv9目标检测和实例分割模型

    YOLOv9模型YOLO系列实时目标检测算法中的最新版本,代表着该系列在准确性、速度和效率方面的又次重大飞跃。
    的头像 发表于 04-03 17:35 854次阅读
    OpenVINO™ C# API部署YOLOv9<b class='flag-5'>目标</b><b class='flag-5'>检测</b>和实例分割<b class='flag-5'>模型</b>

    纵观全局:YOLO助力实时物体检测原理及代码

    YOLO 流程的最后步是将边界框预测与类别概率相结合,以提供完整的检测输出。每个边界框的置信度分数由类别概率调整,确保检测既反映边界框的准确性,又反映
    的头像 发表于 03-30 14:43 2395次阅读