发布时间:2020-11-24 20:21:05来源:机器之心
机器之心报道
项目作者:RangiLyu
如何把anchor-free模型移植到移动端或嵌入式设备?这个项目对单阶段检测模型三大模块(Head、Neck、Backbone)进行轻量化,得到模型大小仅1.8m、速度超快的轻量级模型NanoDet-m。
目标检测一直是计算机视觉领域的一大难题,其目标是找出图像中的所有感兴趣区域,并确定这些区域的位置和类别。目标检测中的深度学习方法已经发展了很多年,并出现了不同类型的检测方法。
目前,深度学习目标检测方法主要分为两大类,分别是两阶段式和单阶段式目标检测算法。两阶段式目标检测框架首先生成候选区域,然后将其分类成不同的目标类别,代表模型有R-CNN、FastR-CNN等;单阶段式目标检测框架将目标检测任务视为一个统一的端到端回归问题,代表模型有MultiBox、YOLO、SSD等。这类框架通常结构更简单,检测速度也更快。
深度学习目标检测方法还可划分为Anchor-base和Anchor-free两大类,今年又出现了将的尝试,各种方法百花齐放。但是,在移动端目标检测算法上,YOLO系列和SSD等Anchor-base的模型一直占据主导地位。
近日,GitHub上出现了一个项目nanodet,它开源了一个移动端实时的Anchor-free检测模型,希望能够提供不亚于YOLO系列的性能,而且同样方便训练和移植。该项目上线仅两天,Star量已经超过200。
项目地址:https://github.com/RangiLyu/nanodet
NanoDet模型介绍
NanoDet是一个速度超快和轻量级的移动端Anchor-free目标检测模型。该模型具备以下优势:
超轻量级:模型文件大小仅1.8m;
速度超快:在移动ARMCPU上的速度达到97fps(10.23ms);
训练友好:GPU内存成本比其他模型低得多。GTX10606G上的Batch-size为80即可运行;
方便部署:提供了基于ncnn推理框架的C++实现和Androiddemo。
模型性能
目前开源的NanoDet-m模型在320x320输入分辨率的情况下,整个模型的Flops只有0.72B,而yolov4-tiny则有6.96B,小了将近十倍。模型的参数量也只有0.95M,权重文件在使用ncnnoptimize进行16位存储之后,只有1.8mb。
尽管模型非常的轻量,但是它的性能不容小觑。在与其他模型进行比较时,项目作者选择使用COCOmAP(0.5:0.95)作为评估指标,兼顾检测和定位的精度,在COCOval5000张图片上测试,并且没有使用Testing-Time-Augmentation。在这种设置下,320分辨率输入能够达到20.6的mAP,比tiny-yolov3高4分,只比yolov4-tiny低1个百分点。在将输入分辨率与YOLO保持一致,都使用416输入的情况下,NanoDet与yolov4-tiny得分持平。具体结果如下表所示:
以上性能基于ncnn和麒麟980(4xA76+4xA55)ARMCPU获得。
此外,项目作者将ncnn部署到手机(基于ARM架构的CPU麒麟980,4个A76核心和4个A55核心)上之后跑了一下benchmark,模型前向计算时间只要10毫秒左右,而yolov3和v4tiny均在30毫秒的量级。在安卓摄像头demoapp上,算上图片预处理、检测框后处理以及绘制检测框的时间,NanoDet也能轻松跑到40+FPS。
NanoDet和yolov4-tiny的性能对比。
最后,该项目提供了Androiddemo、C++demo和Pythondemo。NanoDet在安卓端的目标检测结果如下所示:
NanoDet方法
NanoDet是一种FCOS式的单阶段anchor-free目标检测模型,它使用ATSS进行目标采样,使用GeneralizedFocalLoss损失函数执行分类和边框回归(boxregression)。
据项目作者介绍,该项目的主要目的是希望开源一个移动端实时的Anchor-free检测模型,能够提供不亚于YOLO系列的性能,并且方便训练和移植。为此,他参考了以下研究:
最终得到的NanoDet模型架构如下:
损失函数
项目作者想要实现一个FCOS式的anchor-free目标检测模型,但将FCOS轻量化处理时,由于FCOS的centerness分支在轻量级的模型上很难收敛,模型效果不如预期。
最终,NanoDet使用了李翔等人提出的GeneralizedFocalLoss损失函数。该函数能够去掉FCOS的Centerness分支,省去这一分支上的大量卷积,从而减少检测头的计算开销,非常适合移动端的轻量化部署。
图源:https://arxiv.org/pdf/2006.04388.pdf
检测头轻量化
找到合适的损失函数后,如何使其在轻量级模型上发挥作用呢?
首先需要优化的是检测头。
FCOS系列使用了共享权重的检测头,即对FPN出来的多尺度FeatureMap使用同一组卷积预测检测框,然后每一层使用一个可学习的Scale值作为系数,对预测出来的框进行缩放。
图源:https://openaccess.thecvf.com/content_ICCV_2019/papers/Tian_FCOS_Fully_Convolutional_One-Stage_Object_Detection_ICCV_2019_paper.pdf
这么做的好处是能够将检测头的参数量降低为不共享权重状态下的1/5。这对于光是检测头就拥有数百通道卷积的大模型来说非常有用,但是对于轻量化模型来说,共享权重检测头并没有很大的意义。由于移动端模型推理由CPU执行计算,共享权重并不会带来推理过程的加速,而且在检测头非常轻量的情况下,共享权重使其检测能力进一步下降,因此项目作者认为选择对每一层特征使用一组卷积比较合适。
同时,FCOS系列在检测头上使用了GroupNormalization(GN)作为归一化方式,GN对比BN(BatchNormalization)有很多好处,但是却有一个缺点:BN在推理时能够将其归一化的参数直接融合进卷积中,可以省去这一步计算,而GN则不行。为了能够节省归一化操作的时间,项目作者选择将GN替换为BN。
FCOS的检测头使用了4个256通道的卷积作为一个分支,也就是说在边框回归和分类两个分支上一共有8个c=256的卷积,计算量非常大。为了将其轻量化,项目作者首先选择用深度可分离卷积替换普通卷积,并且将卷积堆叠的数量从4个减少为2组。在通道数上,将256维压缩至96维,之所以选择96,是因为需要将通道数保持为8或16的倍数,能够享受到大部分推理框架的并行加速。
最后,项目作者借鉴了YOLO系列的做法,将边框回归和分类使用同一组卷积进行计算,然后split成两份。最终得到的轻量化检测头如下图所示:
FPN层改进
目前针对FPN的改进有许多,如EfficientDet使用了BiFPN,YOLOv4和v5使用了PAN,除此之外还有BalancedFPN等等。BiFPN虽然性能强大,但是堆叠的特征融合操作会导致运行速度降低,而PAN只有自上而下和自下而上两条通路,非常简洁,是轻量级模型特征融合的好选择。
原版的PAN和YOLO系列中的PAN都使用了stride=2的卷积进行大尺度FeatureMap到小尺度的缩放。而该项目出于轻量化的考虑,选择完全去掉PAN中的所有卷积,只保留从骨干网络特征提取后的1x1卷积来进行特征通道维度的对齐,上采样和下采样均使用插值来完成。与YOLO使用的concatenate操作不同,项目作者选择将多尺度的FeatureMap直接相加,使整个特征融合模块的计算量变得非常小。
最终得到的极小版PAN结构非常简单:
NanoDet使用的超轻量PAN(图源:https://zhuanlan.zhihu.com/p/306530300)
骨干网络
项目作者选择使用ShuffleNetV21.0x作为骨干网络,他去掉了该网络的最后一层卷积,并且抽取8、16、32倍下采样的特征输入到PAN中做多尺度的特征融合。整个骨干模型使用了Torchvision提供的代码,能够直接加载Torchvision上提供的imagenet预训练权重,对加快模型收敛起到很大帮助。
目前,项目作者已将Pytorch训练代码、基于NCNN的Linux和WindowsC++部署代码以及Android摄像头Demo全部开源,并在Readme中提供了详细教程,参见项目GitHub主页。
知乎链接:https://zhuanlan.zhihu.com/p/306530300
NeurIPS2020线上分享:知识图谱嵌入的自动化
论文:《Interstellar:SearchingRecurrentArchitectureforKnowledgeGraphEmbedding》。
本篇论文作者受到神经架构搜索(NAS)的启发,提出将Interstellar作为一种处理关系路径中信息的循环架构。此外,该研究中的新型混合搜索算法突破了stand-alone和one-shot搜索方法的局限,并且有希望应用于其他具有复杂搜索空间的领域。
11月24日,第四范式资深研究员姚权铭博士将为大家详细解读此前沿研究。
识别二维码,入群一起看直播。
©THEEND
转载请联系本公众号获得授权
投稿或寻求报道:content@jiqizhixin.com